Class: Hamweather::Location

Inherits:
Object
  • Object
show all
Defined in:
lib/hamweather/location.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(object) ⇒ Location

Returns a new instance of Location.



46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/hamweather/location.rb', line 46

def initialize(object)
  if self.class.is_zipcode?(object)
    @string = object
    @kind = :zipcode
  elsif self.class.is_canadian_postcode?(object)
    @string = object
    @kind = :postcode
  elsif object.kind_of?(Google::Geo::Address)
    @address = object
    @kind = :geocode
  end
end

Instance Attribute Details

#addressObject (readonly)

Returns the value of attribute address.



8
9
10
# File 'lib/hamweather/location.rb', line 8

def address
  @address
end

#stringObject (readonly)

Returns the value of attribute string.



8
9
10
# File 'lib/hamweather/location.rb', line 8

def string
  @string
end

Class Method Details

.call_geocoder(string) ⇒ Object



65
66
67
68
69
70
71
72
73
74
# File 'lib/hamweather/location.rb', line 65

def self.call_geocoder(string)
  geo = Google::Geo.new Hamweather.google_maps_api_key
  
  begin
  return geo.locate(string)
  
  rescue Google::Geo::UnknownAddressError, Google::Geo::UnknownError
    raise Hamweather::UnknownAddressError
  end
end

.geocode(string) ⇒ Object



59
60
61
62
63
# File 'lib/hamweather/location.rb', line 59

def self.geocode(string)
  locations = call_geocoder(string).map { |a| self.new(a) }
  return locations.first if locations.size == 1
  return locations
end

.is_canadian_postcode?(string) ⇒ Boolean

Returns:

  • (Boolean)


82
83
84
85
86
87
88
# File 'lib/hamweather/location.rb', line 82

def self.is_canadian_postcode?(string)
  #Rules: no D, F, I, O, Q, or U anywhere
  #    Basic validation:    ^[ABCEGHJ-NPRSTVXY]{1}[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[0-9]{1}$
  #    Extended validation: ^(A(0[ABCEGHJ-NPR]|1[ABCEGHK-NSV-Y]|2[ABHNV]|5[A]|8[A])|B(0[CEHJ-NPRSTVW]|1[ABCEGHJ-NPRSTV-Y]|2[ABCEGHJNRSTV-Z]|3[ABEGHJ-NPRSTVZ]|4[ABCEGHNPRV]|5[A]|6[L]|9[A])|C(0[AB]|1[ABCEN])|E(1[ABCEGHJNVWX]|2[AEGHJ-NPRSV]|3[ABCELNVYZ]|4[ABCEGHJ-NPRSTV-Z]|5[ABCEGHJ-NPRSTV]|6[ABCEGHJKL]|7[ABCEGHJ-NP]|8[ABCEGJ-NPRST]|9[ABCEGH])|G(0[ACEGHJ-NPRSTV-Z]|1[ABCEGHJ-NPRSTV-Y]|2[ABCEGJ-N]|3[ABCEGHJ-NZ]|4[ARSTVWXZ]|5[ABCHJLMNRTVXYZ]|6[ABCEGHJKLPRSTVWXZ]|7[ABGHJKNPSTXYZ]|8[ABCEGHJ-NPTVWYZ]|9[ABCHNPRTX])|H(0[HM]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NPRSTV-Z]|4[ABCEGHJ-NPRSTV-Z]|5[AB]|7[ABCEGHJ-NPRSTV-Y]|8[NPRSTYZ]|9[ABCEGHJKPRSWX])|J(0[ABCEGHJ-NPRSTV-Z]|1[ACEGHJ-NRSTXZ]|2[ABCEGHJ-NRSTWXY]|3[ABEGHLMNPRTVXYZ]|4[BGHJ-NPRSTV-Z]|5[ABCJ-MRTV-Z]|6[AEJKNRSTVWYXZ]|7[ABCEGHJ-NPRTV-Z]|8[ABCEGHLMNPRTVXYZ]|9[ABEHJLNTVXYZ])|K(0[ABCEGHJ-M]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-MPRSTVW]|4[ABCKMPR]|6[AHJKTV]|7[ACGHK-NPRSV]|8[ABHNPRV]|9[AHJKLV])|L(0[[ABCEGHJ-NPRS]]|1[ABCEGHJ-NPRSTV-Z]|2[AEGHJMNPRSTVW]|3[BCKMPRSTVXYZ]|4[ABCEGHJ-NPRSTV-Z]|5[ABCEGHJ-NPRSTVW]|6[ABCEGHJ-MPRSTV-Z]|7[ABCEGJ-NPRST]|8[EGHJ-NPRSTVW]|9[ABCGHK-NPRSTVWYZ])|M(1[BCEGHJ-NPRSTVWX]|2[HJ-NPR]|3[ABCHJ-N]|4[ABCEGHJ-NPRSTV-Y]|5[ABCEGHJ-NPRSTVWX]|6[ABCEGHJ-NPRS]|7[AY]|8[V-Z]|9[ABCLMNPRVW])|N(0[ABCEGHJ-NPR]|1[ACEGHKLMPRST]|2[ABCEGHJ-NPRTVZ]|3[ABCEHLPRSTVWY]|4[BGKLNSTVWXZ]|5[ACHLPRV-Z]|6[ABCEGHJ-NP]|7[AGLMSTVWX]|8[AHMNPRSTV-Y]|9[ABCEGHJKVY])|P(0[ABCEGHJ-NPRSTV-Y]|1[ABCHLP]|2[ABN]|3[ABCEGLNPY]|4[NPR]|5[AEN]|6[ABC]|7[ABCEGJKL]|8[NT]|9[AN])|R(0[ABCEGHJ-M]|1[ABN]|2[CEGHJ-NPRV-Y]|3[ABCEGHJ-NPRSTV-Y]|4[AHJKL]|5[AGH]|6[MW]|7[ABCN]|8[AN]|9[A])|S(0[ACEGHJ-NP]|2[V]|3[N]|4[AHLNPRSTV-Z]|6[HJKVWX]|7[HJ-NPRSTVW]|9[AHVX])|T(0[ABCEGHJ-MPV]|1[ABCGHJ-MPRSV-Y]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NPRZ]|4[ABCEGHJLNPRSTVX]|5[ABCEGHJ-NPRSTV-Z]|6[ABCEGHJ-NPRSTVWX]|7[AENPSVXYZ]|8[ABCEGHLNRSVWX]|9[ACEGHJKMNSVWX])|V(0[ABCEGHJ-NPRSTVWX]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NRSTV-Y]|4[ABCEGK-NPRSTVWXZ]|5[ABCEGHJ-NPRSTV-Z]|6[ABCEGHJ-NPRSTV-Z]|7[ABCEGHJ-NPRSTV-Y]|8[ABCGJ-NPRSTV-Z]|9[ABCEGHJ-NPRSTV-Z])|X(0[ABCGX]|1[A])|Y(0[AB]|1[A]))[ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[0-9]{1}$
  ca_postcode_regex = /^[A-Z]{1}[\d]{1}[A-Z]{1}[ ]?[\d]{1}[A-Z]{1}[\d]{1}$/
  return string =~ ca_postcode_regex
end

.is_zipcode?(string) ⇒ Boolean

Returns:

  • (Boolean)


76
77
78
79
80
# File 'lib/hamweather/location.rb', line 76

def self.is_zipcode?(string)
  #Address: ZIP code (US)
  zip_codes_regex = /(^[0-9]{5}$)|(^[0-9]{5}-[0-9]{4}$)/
  return string =~ zip_codes_regex
end

.parse(string) ⇒ Object



38
39
40
41
42
43
44
# File 'lib/hamweather/location.rb', line 38

def self.parse(string)
  if is_zipcode?(string) || is_canadian_postcode?(string)
    return self.new(string)
  else
    geocode(string)
  end
end

Instance Method Details

#geocode?Boolean

Returns:

  • (Boolean)


34
35
36
# File 'lib/hamweather/location.rb', line 34

def geocode?
  @kind == :geocode
end

#latObject



10
11
12
# File 'lib/hamweather/location.rb', line 10

def lat
  @address.latitude
end

#lonObject



14
15
16
# File 'lib/hamweather/location.rb', line 14

def lon
  @address.longitude
end

#postcode?Boolean

Returns:

  • (Boolean)


30
31
32
# File 'lib/hamweather/location.rb', line 30

def postcode?
  @kind == :postcode
end

#to_uriObject



18
19
20
21
22
23
24
# File 'lib/hamweather/location.rb', line 18

def to_uri
  if zipcode? || postcode?
    @uri ||= "wx/#{string}.xml"
  elsif geocode?
    @uri ||= "wx/nearby.xml?lat=#{lat}&lon=#{lon}"
  end
end

#zipcode?Boolean

Returns:

  • (Boolean)


26
27
28
# File 'lib/hamweather/location.rb', line 26

def zipcode?
  @kind == :zipcode
end