my_representatives 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/Gemfile +3 -0
  4. data/LICENSE.md +8 -0
  5. data/README.md +60 -0
  6. data/lib/my_representatives/abbreviatable.rb +29 -0
  7. data/lib/my_representatives/act/csv_lower.rb +118 -0
  8. data/lib/my_representatives/act/merge_lower.rb +38 -0
  9. data/lib/my_representatives/act/web_index.rb +37 -0
  10. data/lib/my_representatives/act/web_index_row.rb +86 -0
  11. data/lib/my_representatives/act/web_lower.rb +65 -0
  12. data/lib/my_representatives/act/web_show.rb +46 -0
  13. data/lib/my_representatives/commonwealth/commonwealth.rb +5 -0
  14. data/lib/my_representatives/commonwealth/csv_email.rb +93 -0
  15. data/lib/my_representatives/commonwealth/csv_lower.rb +130 -0
  16. data/lib/my_representatives/commonwealth/csv_upper.rb +129 -0
  17. data/lib/my_representatives/commonwealth/merge_lower.rb +54 -0
  18. data/lib/my_representatives/commonwealth/merge_upper.rb +54 -0
  19. data/lib/my_representatives/commonwealth/web_index.rb +57 -0
  20. data/lib/my_representatives/commonwealth/web_lower.rb +55 -0
  21. data/lib/my_representatives/commonwealth/web_show.rb +99 -0
  22. data/lib/my_representatives/commonwealth/web_upper.rb +54 -0
  23. data/lib/my_representatives/electorate.rb +146 -0
  24. data/lib/my_representatives/errors.rb +7 -0
  25. data/lib/my_representatives/fileable.rb +11 -0
  26. data/lib/my_representatives/guessable.rb +120 -0
  27. data/lib/my_representatives/hashable.rb +11 -0
  28. data/lib/my_representatives/nsw/csv_lower.rb +115 -0
  29. data/lib/my_representatives/nsw/csv_upper.rb +115 -0
  30. data/lib/my_representatives/nsw/merge_lower.rb +41 -0
  31. data/lib/my_representatives/nsw/merge_upper.rb +41 -0
  32. data/lib/my_representatives/nsw/web_index.rb +56 -0
  33. data/lib/my_representatives/nsw/web_lower.rb +54 -0
  34. data/lib/my_representatives/nsw/web_show.rb +140 -0
  35. data/lib/my_representatives/nsw/web_upper.rb +54 -0
  36. data/lib/my_representatives/nt/web_index.rb +46 -0
  37. data/lib/my_representatives/nt/web_lower.rb +54 -0
  38. data/lib/my_representatives/nt/web_show.rb +134 -0
  39. data/lib/my_representatives/person.rb +197 -0
  40. data/lib/my_representatives/qld/csv_lower.rb +117 -0
  41. data/lib/my_representatives/qld/merge_lower.rb +37 -0
  42. data/lib/my_representatives/qld/web_index.rb +47 -0
  43. data/lib/my_representatives/qld/web_lower.rb +54 -0
  44. data/lib/my_representatives/qld/web_show.rb +146 -0
  45. data/lib/my_representatives/sa/csv_lower.rb +120 -0
  46. data/lib/my_representatives/sa/csv_upper.rb +115 -0
  47. data/lib/my_representatives/sa/merge_lower.rb +39 -0
  48. data/lib/my_representatives/sa/merge_upper.rb +39 -0
  49. data/lib/my_representatives/sa/web_index_lower.rb +42 -0
  50. data/lib/my_representatives/sa/web_index_upper.rb +43 -0
  51. data/lib/my_representatives/sa/web_lower.rb +54 -0
  52. data/lib/my_representatives/sa/web_show.rb +158 -0
  53. data/lib/my_representatives/sa/web_upper.rb +54 -0
  54. data/lib/my_representatives/static.rb +5 -0
  55. data/lib/my_representatives/tas/csv_lower.rb +125 -0
  56. data/lib/my_representatives/tas/csv_upper.rb +125 -0
  57. data/lib/my_representatives/version.rb +5 -0
  58. data/lib/my_representatives/vic/csv_lower.rb +99 -0
  59. data/lib/my_representatives/vic/csv_upper.rb +97 -0
  60. data/lib/my_representatives/vic/merge_lower.rb +37 -0
  61. data/lib/my_representatives/vic/merge_upper.rb +37 -0
  62. data/lib/my_representatives/vic/web_index.rb +58 -0
  63. data/lib/my_representatives/vic/web_lower.rb +54 -0
  64. data/lib/my_representatives/vic/web_show.rb +118 -0
  65. data/lib/my_representatives/vic/web_upper.rb +54 -0
  66. data/lib/my_representatives/wa/csv_lower.rb +144 -0
  67. data/lib/my_representatives/wa/csv_upper.rb +131 -0
  68. data/lib/my_representatives/wa/merge_lower.rb +41 -0
  69. data/lib/my_representatives/wa/merge_upper.rb +37 -0
  70. data/lib/my_representatives/wa/web_index.rb +45 -0
  71. data/lib/my_representatives/wa/web_lower.rb +54 -0
  72. data/lib/my_representatives/wa/web_show.rb +195 -0
  73. data/lib/my_representatives/wa/web_upper.rb +54 -0
  74. data/lib/my_representatives.rb +150 -0
  75. data/my_representatives.gemspec +25 -0
  76. metadata +204 -0
@@ -0,0 +1,146 @@
1
+ module MyRepresentatives
2
+ class Electorate
3
+ class Error < StandardError; end
4
+ class ElectorateNameMissingError < Error; end
5
+ class StateNameMissingError < Error; end
6
+ class StateNameInvalidError < Error; end
7
+
8
+ include MyRepresentatives::Hashable
9
+
10
+ attr_accessor :name, :house, :state, :lower_house, :state_government
11
+
12
+ def initialize(name)
13
+ raise ElectorateNameMissingError unless name && name.is_a?(String)
14
+ @name = name
15
+ end
16
+
17
+ def to_hash
18
+ super
19
+ end
20
+
21
+ def commonwealth_lower!(state)
22
+ raise StateNameMissingError unless state
23
+ raise StateNameInvalidError unless MyRepresentatives::Static::STATES.include?(state)
24
+ self.name = self.name
25
+ self.house = "House of Representatives"
26
+ self.state = state
27
+ self.state_government = false
28
+ self.lower_house = true
29
+ end
30
+
31
+ def commonwealth_upper!(state)
32
+ raise StateNameMissingError unless state
33
+ raise StateNameInvalidError unless MyRepresentatives::Static::STATES.include?(state)
34
+ self.name = self.name
35
+ self.house = "Senate"
36
+ self.state = state
37
+ self.state_government = false
38
+ self.lower_house = false
39
+ end
40
+
41
+ def state_act_lower!
42
+ self.name = self.name
43
+ self.house = "Legislative Assembly"
44
+ self.state = "ACT"
45
+ self.state_government = true
46
+ self.lower_house = true
47
+ end
48
+
49
+ def state_nsw_lower!
50
+ self.name = self.name
51
+ self.house = "Legislative Assembly"
52
+ self.state = "NSW"
53
+ self.state_government = true
54
+ self.lower_house = true
55
+ end
56
+
57
+ def state_nsw_upper!
58
+ self.name = self.name
59
+ self.house = "Legislative Council"
60
+ self.state = "NSW"
61
+ self.state_government = true
62
+ self.lower_house = false
63
+ end
64
+
65
+ def state_nt_lower!
66
+ self.name = self.name
67
+ self.house = "Legislative Assembly"
68
+ self.state = "NT"
69
+ self.state_government = true
70
+ self.lower_house = true
71
+ end
72
+
73
+ def state_qld_lower!
74
+ self.name = self.name
75
+ self.house = "Legislative Assembly"
76
+ self.state = "QLD"
77
+ self.state_government = true
78
+ self.lower_house = true
79
+ end
80
+
81
+ def state_sa_lower!
82
+ self.name = self.name
83
+ self.house = "House of Assembly"
84
+ self.state = "SA"
85
+ self.state_government = true
86
+ self.lower_house = true
87
+ end
88
+
89
+ def state_sa_upper!
90
+ self.name = self.name
91
+ self.house = "Legislative Council"
92
+ self.state = "SA"
93
+ self.state_government = true
94
+ self.lower_house = false
95
+ end
96
+
97
+ def state_tas_lower!
98
+ self.name = self.name
99
+ self.house = "House of Assembly"
100
+ self.state = "TAS"
101
+ self.state_government = true
102
+ self.lower_house = true
103
+ end
104
+
105
+ def state_tas_upper!
106
+ self.name = self.name
107
+ self.house = "Legislative Council"
108
+ self.state = "TAS"
109
+ self.state_government = true
110
+ self.lower_house = false
111
+ end
112
+
113
+ def state_vic_lower!
114
+ self.name = self.name
115
+ self.house = "Legislative Assembly"
116
+ self.state = "VIC"
117
+ self.state_government = true
118
+ self.lower_house = true
119
+ end
120
+
121
+ def state_vic_upper!
122
+ self.name = self.name
123
+ self.house = "Legislative Council"
124
+ self.state = "VIC"
125
+ self.state_government = true
126
+ self.lower_house = false
127
+ end
128
+
129
+ def state_wa_lower!
130
+ self.name = self.name
131
+ self.house = "Legislative Assembly"
132
+ self.state = "WA"
133
+ self.state_government = true
134
+ self.lower_house = true
135
+ end
136
+
137
+ def state_wa_upper!
138
+ self.name = self.name
139
+ self.house = "Legislative Council"
140
+ self.state = "WA"
141
+ self.state_government = true
142
+ self.lower_house = false
143
+ end
144
+
145
+ end
146
+ end
@@ -0,0 +1,7 @@
1
+ module MyRepresentatives
2
+ class Error < StandardError; end
3
+ class NokogiriDocumentExpectedError < Error; end
4
+ class NokogiriDocumentPropertiesError < Error; end
5
+ class InvalidURLError < Error; end
6
+ class GenericPhantomJSError < Error; end
7
+ end
@@ -0,0 +1,11 @@
1
+ require 'fileutils'
2
+
3
+ module MyRepresentatives
4
+ module Fileable
5
+
6
+ def create_tmp
7
+ FileUtils::mkdir "tmp" unless File.directory?("tmp")
8
+ end
9
+
10
+ end # Fileable
11
+ end # MyRepresentatives
@@ -0,0 +1,120 @@
1
+ module MyRepresentatives
2
+ module Guessable
3
+
4
+ def guess_first(str)
5
+ name = str
6
+ name.gsub!(/\((.+?)\)\s/,"")
7
+
8
+ if name
9
+
10
+ name = if name.start_with?("Hon ")
11
+ name.gsub("Hon ", "")
12
+ elsif name.start_with?("The Hon. Dr ")
13
+ name.gsub("The Hon. Dr ", "")
14
+ elsif name.start_with?("Reverend the Hon. ")
15
+ name.gsub("Reverend the Hon. ", "")
16
+ elsif name.start_with?("Hon. ")
17
+ name.gsub("Hon. ", "")
18
+ elsif name.start_with?("Senator the Hon ")
19
+ name.gsub("Senator the Hon ", "")
20
+ elsif name.start_with?("The Hon. ")
21
+ name.gsub("The Hon. ", "")
22
+ elsif name.start_with?("The Hon ")
23
+ name.gsub("The Hon ", "")
24
+ elsif name.start_with?("Senator ")
25
+ name.gsub("Senator ", "")
26
+ elsif name.start_with?("Mrs ")
27
+ name.gsub("Mrs ", "")
28
+ elsif name.start_with?("Miss ")
29
+ name.gsub("Miss ", "")
30
+ elsif name.start_with?("Ms ")
31
+ name.gsub("Ms ", "")
32
+ elsif name.start_with?("Mr ")
33
+ name.gsub("Mr ", "")
34
+ elsif name.start_with?("Dr ")
35
+ name.gsub("Dr ", "")
36
+ else
37
+ name
38
+ end
39
+
40
+ name = name.split(" ")
41
+ name[0]
42
+
43
+ else
44
+ nil
45
+ end
46
+ end
47
+
48
+ def guess_last(str)
49
+ name = str
50
+ if name
51
+ name.gsub(" MLA", "").gsub(" MLC", "").gsub(" MP", "").gsub(" QC", "").gsub(" AO", "").gsub(" AOM", "").gsub(" OAM", "").gsub(" CSC", "").gsub(",","").strip.split(" ").last
52
+ else
53
+ nil
54
+ end
55
+ end
56
+ def guess_preferred(str)
57
+ name = str
58
+ regex = /\((.+?)\)/
59
+ match = name.match(regex)
60
+
61
+ if match
62
+ match[1]
63
+ else
64
+ nil
65
+ end
66
+
67
+ end
68
+
69
+ def guess_gender(str)
70
+ if str
71
+ if str == "Mrs"
72
+ "Female"
73
+ elsif str == "Miss"
74
+ "Female"
75
+ elsif str == "Ms"
76
+ "Female"
77
+ elsif str == "Mr"
78
+ "Male"
79
+ else
80
+ nil
81
+ end
82
+ else
83
+ nil
84
+ end
85
+ end
86
+
87
+ def guess_title(str)
88
+ name = str
89
+ if name
90
+ name = if name.start_with?("Hon ")
91
+ "Hon"
92
+ elsif name.start_with?("The Hon")
93
+ "The Hon"
94
+ elsif name.start_with?("Senator the Hon ")
95
+ "Senator the Hon"
96
+ elsif name.start_with?("Senator ")
97
+ "Senator"
98
+ elsif name.start_with?("Mrs ")
99
+ "Mrs"
100
+ elsif name.start_with?("Miss ")
101
+ "Miss"
102
+ elsif name.start_with?("Ms ")
103
+ "Ms"
104
+ elsif name.start_with?("Mr ")
105
+ "Mr"
106
+ elsif name.start_with?("Dr ")
107
+ "Dr"
108
+ else
109
+ ""
110
+ end
111
+ name
112
+ else
113
+ nil
114
+ end
115
+ end
116
+
117
+
118
+
119
+ end # Guessable
120
+ end # MyRepresentatives
@@ -0,0 +1,11 @@
1
+ module MyRepresentatives
2
+ module Hashable
3
+
4
+ def to_hash
5
+ hash = {}
6
+ instance_variables.each {|var| hash[var.to_s.delete("@")] = instance_variable_get(var) }
7
+ hash
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,115 @@
1
+ module MyRepresentatives
2
+ module NSW
3
+ class CSVLower
4
+ include MyRepresentatives::Fileable
5
+ include MyRepresentatives::Guessable
6
+
7
+ attr_accessor :csv_url, :csv_filename, :people
8
+
9
+ def initialize
10
+ @csv_url = "https://www.parliament.nsw.gov.au/_layouts/15/NSWParliament/memberlistservice.aspx?members=LA&format=Excel"
11
+ @csv_filename = "tmp/csv_nsw_lower.csv"
12
+ @people = []
13
+
14
+ csv_from_url
15
+ people_from_csv
16
+ end
17
+
18
+ private
19
+
20
+ def csv_from_url
21
+ create_tmp
22
+ begin
23
+ open(@csv_filename, "wb") do |file|
24
+ open(@csv_url) do |uri|
25
+ file.write(uri.read)
26
+ end
27
+ end
28
+ rescue SocketError => err
29
+ @logger.debug("Unable to connect to #{@csv_url}")
30
+ raise err
31
+ end
32
+ end
33
+
34
+ def people_from_csv
35
+ CSV.foreach(@csv_filename, headers: true) do |row|
36
+
37
+ # Setup the electorate
38
+ electorate_name = find_electorate(row)
39
+ electorate = Electorate.new(electorate_name)
40
+ electorate.state_nsw_lower!
41
+
42
+ # Setup the Representative (Person)
43
+ person = Person.new(electorate)
44
+
45
+ person.first_name = find_first_name(row)
46
+ person.last_name = find_last_name(row)
47
+ person.title = find_title(row)
48
+ person.honorifics = find_honorifics(row)
49
+ person.email = find_email(row)
50
+ person.phone = find_phone(row)
51
+ person.party_name = find_party(row)
52
+ person.salutation = find_salutation(row)
53
+ person.formal_name = format_formal_name(person)
54
+ person.physical_address = format_physical_address(row)
55
+ person.postal_address = format_postal_address(row)
56
+ person.gender = guess_gender(person.title)
57
+ person.preferred_name = nil
58
+ person.image_url = nil
59
+ person.homepage_url = nil
60
+
61
+ @people << person
62
+ end
63
+ end
64
+
65
+ def find_first_name(arr)
66
+ arr["INITIALS"]
67
+ end
68
+
69
+ def find_last_name(arr)
70
+ arr["SURNAME"]
71
+ end
72
+
73
+ def find_title(arr)
74
+ arr["TITLE"]
75
+ end
76
+
77
+ def find_honorifics(arr)
78
+ arr["POST-NOMINALS"]
79
+ end
80
+
81
+ def find_electorate(arr)
82
+ arr["ELECTORATE"]
83
+ end
84
+
85
+ def find_email(arr)
86
+ arr["CONTACT ADDRESS EMAIL"]
87
+ end
88
+
89
+ def find_party(arr)
90
+ arr["PARTY"]
91
+ end
92
+
93
+ def find_phone(arr)
94
+ arr["CONTACT ADDRESS PHONE"]
95
+ end
96
+
97
+ def find_salutation(arr)
98
+ arr["SALUTATION"]
99
+ end
100
+
101
+ def format_formal_name(person)
102
+ "#{person.title} #{person.first_name} #{person.last_name} #{person.honorifics}"
103
+ end
104
+
105
+ def format_physical_address(arr)
106
+ "#{arr["CONTACT ADDRESS LINE1"]}\n#{arr["CONTACT ADDRESS LINE2"]}\n#{arr["CONTACT ADDRESS LINE3"]}\n #{arr["CONTACT ADDRESS SUBURB"]} #{arr["CONTACT ADDRESS STATE"]} #{arr["CONTACT ADDRESS POSTCODE"]}"
107
+ end
108
+
109
+ def format_postal_address(arr)
110
+ "#{arr["CONTACT ADDRESS POBOX"]}\n#{arr["CONTACT ADDRESS POBOX SUBURB"]} #{arr["CONTACT ADDRESS POBOX STATE"]} #{arr["CONTACT ADDRESS POBOX POSTCODE"]}"
111
+ end
112
+
113
+ end # CSVLower
114
+ end # NSW
115
+ end # MyRepresentatives
@@ -0,0 +1,115 @@
1
+ module MyRepresentatives
2
+ module NSW
3
+ class CSVUpper
4
+ include MyRepresentatives::Fileable
5
+ include MyRepresentatives::Guessable
6
+
7
+ attr_accessor :csv_url, :csv_filename, :people
8
+
9
+ def initialize
10
+ @csv_url = "https://www.parliament.nsw.gov.au/_layouts/15/NSWParliament/memberlistservice.aspx?members=LC&format=Excel"
11
+ @csv_filename = "tmp/csv_nsw_upper.csv"
12
+ @people = []
13
+
14
+ csv_from_url
15
+ people_from_csv
16
+ end
17
+
18
+ private
19
+
20
+ def csv_from_url
21
+ create_tmp
22
+ begin
23
+ open(@csv_filename, "wb") do |file|
24
+ open(@csv_url) do |uri|
25
+ file.write(uri.read)
26
+ end
27
+ end
28
+ rescue SocketError => err
29
+ @logger.debug("Unable to connect to #{@csv_url}")
30
+ raise err
31
+ end
32
+ end
33
+
34
+ def people_from_csv
35
+ CSV.foreach(@csv_filename, headers: true) do |row|
36
+
37
+ # Setup the electorate
38
+ electorate_name = find_electorate
39
+ electorate = Electorate.new(electorate_name)
40
+ electorate.state_nsw_upper!
41
+
42
+ # Setup the Representative (Person)
43
+ person = Person.new(electorate)
44
+
45
+ person.first_name = find_first_name(row)
46
+ person.last_name = find_last_name(row)
47
+ person.title = find_title(row)
48
+ person.honorifics = find_honorifics(row)
49
+ person.email = find_email(row)
50
+ person.phone = find_phone(row)
51
+ person.party_name = find_party(row)
52
+ person.salutation = find_salutation(row)
53
+ person.formal_name = format_formal_name(person)
54
+ person.physical_address = format_physical_address(row)
55
+ person.postal_address = format_postal_address(row)
56
+ person.gender = guess_gender(person.title)
57
+ person.preferred_name = nil
58
+ person.image_url = nil
59
+ person.homepage_url = nil
60
+
61
+ @people << person
62
+ end
63
+ end
64
+
65
+ def find_first_name(arr)
66
+ arr["INITIALS"]
67
+ end
68
+
69
+ def find_last_name(arr)
70
+ arr["SURNAME"]
71
+ end
72
+
73
+ def find_title(arr)
74
+ arr["TITLE"]
75
+ end
76
+
77
+ def find_honorifics(arr)
78
+ arr["POST-NOMINALS"]
79
+ end
80
+
81
+ def find_electorate
82
+ "All NSW"
83
+ end
84
+
85
+ def find_email(arr)
86
+ arr["CONTACT ADDRESS EMAIL"]
87
+ end
88
+
89
+ def find_party(arr)
90
+ arr["PARTY"]
91
+ end
92
+
93
+ def find_phone(arr)
94
+ arr["CONTACT ADDRESS PHONE"]
95
+ end
96
+
97
+ def find_salutation(arr)
98
+ arr["SALUTATION"]
99
+ end
100
+
101
+ def format_formal_name(person)
102
+ "#{person.title} #{person.first_name} #{person.last_name} #{person.honorifics}"
103
+ end
104
+
105
+ def format_physical_address(arr)
106
+ "#{arr["CONTACT ADDRESS LINE1"]}\n#{arr["CONTACT ADDRESS LINE2"]}\n#{arr["CONTACT ADDRESS LINE3"]}\n#{arr["CONTACT ADDRESS SUBURB"]} #{arr["CONTACT ADDRESS STATE"]} #{arr["CONTACT ADDRESS POSTCODE"]}"
107
+ end
108
+
109
+ def format_postal_address(arr)
110
+ "#{arr["CONTACT ADDRESS LINE1"]}\n#{arr["CONTACT ADDRESS LINE2"]}\n#{arr["CONTACT ADDRESS LINE3"]}\n#{arr["CONTACT ADDRESS SUBURB"]} #{arr["CONTACT ADDRESS STATE"]} #{arr["CONTACT ADDRESS POSTCODE"]}"
111
+ end
112
+
113
+ end # CSVUpper
114
+ end # NSW
115
+ end #MyRepresentatives
@@ -0,0 +1,41 @@
1
+ module MyRepresentatives
2
+ module NSW
3
+ class MergeLower
4
+ attr_accessor :csv_people, :web_people, :people
5
+
6
+ def initialize
7
+ @csv_people = MyRepresentatives::NSW::CSVLower.new.people
8
+ @web_people = MyRepresentatives::NSW::WebLower.new.people
9
+ @people = []
10
+ check_and_update_person
11
+ end
12
+
13
+ private
14
+
15
+ def check_and_update_person
16
+ @csv_people.each do |person|
17
+ if @web_people.any? { |wp| wp.phone == person.phone} || @web_people.any? { |wp| wp.email == person.email}
18
+ index = @web_people.find_index {|wp| wp.phone == person.phone}
19
+
20
+ if !index
21
+ index = @web_people.find_index { |wp| wp.email == person.email }
22
+ end
23
+
24
+ if index
25
+ person.formal_name = @web_people[index].formal_name
26
+ person.first_name = @web_people[index].first_name
27
+ person.preferred_name = @web_people[index].preferred_name
28
+ person.email = @web_people[index].email unless person.email
29
+ person.homepage_url = @web_people[index].homepage_url
30
+ person.image_url = @web_people[index].image_url
31
+ person.successful_merge = true
32
+ end
33
+
34
+ end
35
+ @people << person
36
+ end
37
+ end
38
+
39
+ end # MergeLower
40
+ end # NSW
41
+ end # MyRepresentatives
@@ -0,0 +1,41 @@
1
+ module MyRepresentatives
2
+ module NSW
3
+ class MergeUpper
4
+ attr_accessor :csv_people, :web_people, :people
5
+
6
+ def initialize
7
+ @csv_people = MyRepresentatives::NSW::CSVUpper.new.people
8
+ @web_people = MyRepresentatives::NSW::WebUpper.new.people
9
+ @people = []
10
+ check_and_update_person
11
+ end
12
+
13
+ private
14
+
15
+ def check_and_update_person
16
+ @csv_people.each do |person|
17
+ if @web_people.any? { |wp| wp.phone == person.phone} || @web_people.any? { |wp| wp.email == person.email}
18
+ index = @web_people.find_index {|wp| wp.phone == person.phone}
19
+
20
+ if !index
21
+ index = @web_people.find_index { |wp| wp.email == person.email }
22
+ end
23
+
24
+ if index
25
+ person.formal_name = @web_people[index].formal_name
26
+ person.first_name = @web_people[index].first_name
27
+ person.preferred_name = @web_people[index].preferred_name
28
+ person.email = @web_people[index].email unless person.email
29
+ person.homepage_url = @web_people[index].homepage_url
30
+ person.image_url = @web_people[index].image_url
31
+ person.successful_merge = true
32
+ end
33
+
34
+ end
35
+ @people << person
36
+ end
37
+ end
38
+
39
+ end # MergeUpper
40
+ end # NSW
41
+ end # MyRepresentatives
@@ -0,0 +1,56 @@
1
+ module MyRepresentatives
2
+ module NSW
3
+ class WebIndex
4
+ attr_accessor :index_url, :document, :upper_urls, :lower_urls
5
+
6
+ def initialize
7
+ @logger = Logger.new(STDOUT)
8
+ @index_url = nil
9
+ @document = nil
10
+ @lower_urls = []
11
+ @upper_urls = []
12
+
13
+ # Lower House
14
+ @index_url = "https://www.parliament.nsw.gov.au/members/pages/all-members.aspx?house=LA"
15
+ @document = find_representatives
16
+ representative_urls_from_document( { lower_house: true } )
17
+
18
+ # Upper House
19
+ @index_url = "https://www.parliament.nsw.gov.au/members/pages/all-members.aspx?house=LC"
20
+ @document = find_representatives
21
+ representative_urls_from_document( { lower_house: false } )
22
+
23
+ end
24
+
25
+
26
+ private
27
+
28
+ def find_representatives
29
+ begin
30
+ request = open(@index_url)
31
+ Nokogiri::HTML(request)
32
+ rescue SocketError => err
33
+ @logger.debug("Unable to connect to #{@index_url}")
34
+ raise err
35
+ end
36
+ end
37
+
38
+ def representative_urls_from_document(options = { lower_house: true } )
39
+ begin
40
+ representatives = @document.css("table").css("a.prl-name-link.green") if options[:lower_house]
41
+ representatives = @document.css("table").css("a.prl-name-link.maroon") if !options[:lower_house]
42
+ rescue
43
+ end
44
+
45
+ representatives.each do |row|
46
+ begin
47
+ @lower_urls << "https://www.parliament.nsw.gov.au" + row.attr("href") if options[:lower_house]
48
+ @upper_urls << "https://www.parliament.nsw.gov.au" + row.attr("href") if !options[:lower_house]
49
+ rescue
50
+ end
51
+ end
52
+ end
53
+
54
+ end # WebIndex
55
+ end # NSW
56
+ end # MyRepresentatives