parliament-ruby 0.5.19 → 0.6.0

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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -3
  3. data/.travis.yml +0 -1
  4. data/Gemfile +2 -0
  5. data/Makefile +9 -4
  6. data/README.md +185 -11
  7. data/Rakefile +1 -1
  8. data/lib/parliament/client_error.rb +21 -0
  9. data/lib/parliament/decorator/constituency_area.rb +27 -0
  10. data/lib/parliament/{decorators → decorator}/constituency_group.rb +29 -1
  11. data/lib/parliament/decorator/contact_point.rb +48 -0
  12. data/lib/parliament/decorator/gender.rb +13 -0
  13. data/lib/parliament/decorator/gender_identity.rb +13 -0
  14. data/lib/parliament/decorator/house.rb +41 -0
  15. data/lib/parliament/decorator/house_incumbency.rb +50 -0
  16. data/lib/parliament/decorator/house_seat.rb +27 -0
  17. data/lib/parliament/decorator/incumbency.rb +57 -0
  18. data/lib/parliament/decorator/party.rb +27 -0
  19. data/lib/parliament/decorator/party_membership.rb +36 -0
  20. data/lib/parliament/decorator/person.rb +224 -0
  21. data/lib/parliament/{decorators → decorator}/postal_address.rb +5 -1
  22. data/lib/parliament/decorator/seat_incumbency.rb +64 -0
  23. data/lib/parliament/decorator.rb +7 -0
  24. data/lib/parliament/network_error.rb +13 -0
  25. data/lib/parliament/no_content_response_error.rb +19 -0
  26. data/lib/parliament/request.rb +112 -33
  27. data/lib/parliament/response.rb +76 -9
  28. data/lib/parliament/server_error.rb +21 -0
  29. data/lib/parliament/utils.rb +113 -13
  30. data/lib/parliament/version.rb +1 -1
  31. data/lib/parliament.rb +8 -4
  32. data/parliament-ruby.gemspec +6 -6
  33. metadata +32 -28
  34. data/lib/parliament/decorators/constituency_area.rb +0 -17
  35. data/lib/parliament/decorators/contact_point.rb +0 -29
  36. data/lib/parliament/decorators/gender.rb +0 -9
  37. data/lib/parliament/decorators/gender_identity.rb +0 -9
  38. data/lib/parliament/decorators/house.rb +0 -28
  39. data/lib/parliament/decorators/house_incumbency.rb +0 -31
  40. data/lib/parliament/decorators/house_seat.rb +0 -17
  41. data/lib/parliament/decorators/incumbency.rb +0 -35
  42. data/lib/parliament/decorators/party.rb +0 -17
  43. data/lib/parliament/decorators/party_membership.rb +0 -23
  44. data/lib/parliament/decorators/person.rb +0 -152
  45. data/lib/parliament/decorators/seat_incumbency.rb +0 -39
  46. data/lib/parliament/no_content_error.rb +0 -9
@@ -1,35 +1,135 @@
1
1
  module Parliament
2
+ # Namespace for helper methods used with parliament-ruby.
3
+ #
4
+ # @since 0.6.0
2
5
  module Utils
6
+ # Sort an Array of Objects in ascending order. The major difference between this implementation of sort_by and the
7
+ # standard one is that our implementation includes objects that return nil for our parameter values.
8
+ #
9
+ # @see Parliament::Utils.reverse_sort_by
10
+ #
11
+ # @example Sorting a list of objects by date
12
+ # response = parliament.people('123').get.filter('http://id.ukpds.org/schema/Person')
13
+ #
14
+ # objects = response.first.incumbencies
15
+ #
16
+ # args = {
17
+ # list: objects,
18
+ # parameters: [:endDate],
19
+ # prepend_rejected: false
20
+ # }
21
+ #
22
+ # sorted_list = Parliament::Util.sort_by(args)
23
+ #
24
+ # sorted_list.each { |incumbency| puts incumbency.respond_to?(:endDate) ? incumbency.endDate : 'Current' }
25
+ # # http://id.ukpds.org/1121 - 1981-07-31
26
+ # # http://id.ukpds.org/5678 - 1991-03-15
27
+ # # http://id.ukpds.org/1234 - 1997-01-01
28
+ # # http://id.ukpds.org/9101 - 2011-09-04
29
+ # # http://id.ukpds.org/3141 - Current
30
+ #
31
+ # @param [Hash] args a hash of arguments.
32
+ # @option args [Array<Object>] :list the 'list' which we are sorting.
33
+ # @option args [Array<Symbol>] :parameters an array of parameters we are sorting by.
34
+ # @option args [Boolean] :prepend_rejected (true) should objects that do not respond to our parameters be prepended?
35
+ #
36
+ # @return [Array<Object>] a sorted array of objects using the args passed in.
3
37
  def self.sort_by(args)
4
38
  rejected = []
5
39
  args = sort_defaults.merge(args)
6
40
  list = args[:list].dup
7
41
  parameters = args[:parameters]
8
42
 
9
- list.delete_if do |object|
10
- rejected << object unless parameters.all? { |param| !object.send(param).nil? if object.respond_to?(param) }
11
- end
43
+ list, rejected = prune_list(list, rejected, parameters)
12
44
 
13
- list.sort_by! do |object|
14
- parameters.map do |param|
15
- object.send(param).is_a?(String) ? I18n.transliterate(object.send(param)).downcase : object.send(param)
16
- end
17
- end
45
+ list = sort_list(list, parameters)
18
46
 
19
47
  # Any rejected (nil) values will be added to the start of the result unless specified otherwise
20
48
  args[:prepend_rejected] ? rejected.concat(list) : list.concat(rejected)
21
49
  end
22
50
 
51
+ # Sort an Array of Objects in descending order. Largely, this implementation runs Parliament::Utils.sort_by and
52
+ # calls reverse! on the result.
53
+ #
54
+ # @see Parliament::Utils.sort_by
55
+ #
56
+ # @example Sorting a list of objects by date
57
+ # response = parliament.people('123').get.filter('http://id.ukpds.org/schema/Person')
58
+ #
59
+ # objects = response.first.incumbencies
60
+ #
61
+ # args = {
62
+ # list: objects,
63
+ # parameters: [:endDate],
64
+ # prepend_rejected: false
65
+ # }
66
+ #
67
+ # sorted_list = Parliament::Util.reverse_sort_by(args)
68
+ #
69
+ # sorted_list.each { |incumbency| puts incumbency.respond_to?(:endDate) ? incumbency.endDate : 'Current' }
70
+ # # http://id.ukpds.org/3141 - Current
71
+ # # http://id.ukpds.org/9101 - 2011-09-04
72
+ # # http://id.ukpds.org/1234 - 1997-01-01
73
+ # # http://id.ukpds.org/5678 - 1991-03-15
74
+ # # http://id.ukpds.org/1121 - 1981-07-31
75
+ #
76
+ # @param [Hash] args a hash of arguments.
77
+ # @option args [Array<Object>] :list the 'list' which we are sorting.
78
+ # @option args [Array<Symbol>] :parameters an array of parameters we are sorting by.
79
+ # @option args [Boolean] :prepend_rejected (true) should objects that do not respond to our parameters be prepended?
80
+ #
81
+ # @return [Array<Object>] a sorted array of objects using the args passed in.
23
82
  def self.reverse_sort_by(args)
24
83
  Parliament::Utils.sort_by(args).reverse!
25
84
  end
26
85
 
27
- private_class_method
28
-
86
+ # Default arguments hash for #sort_by and #reverse_sort_by.
87
+ #
88
+ # @see Parliament::Utils.sort_by
89
+ # @see Parliament::Utils.reverse_sort_by
90
+ #
91
+ # @return [Hash] default arguments used in sorting methods.
29
92
  def self.sort_defaults
30
- {
31
- prepend_rejected: true
32
- }
93
+ { prepend_rejected: true }
94
+ end
95
+
96
+ # @!method self.prune_list(list, rejected, parameters)
97
+ # Prune all objects that do not respond to a given array of parameters.
98
+ #
99
+ # @private
100
+ # @!scope class
101
+ # @!visibility private
102
+ #
103
+ # @param [Array<Object>] list the 'list' of objects we are pruning from.
104
+ # @param [Array<Object>] rejected the objects we have pruned from list.
105
+ # @param [Array<Symbol>] parameters an array of parameters we are checking.
106
+ #
107
+ # @return [Array<Array<Object>, Array<Object>>] an array containing first, the pruned list and secondly, the rejected list.
108
+ private_class_method def self.prune_list(list, rejected, parameters)
109
+ list.delete_if do |object|
110
+ rejected << object unless parameters.all? { |param| !object.send(param).nil? if object.respond_to?(param) }
111
+ end
112
+
113
+ [list, rejected]
114
+ end
115
+
116
+ # @!method self.sort_list(list, parameters)
117
+ # Sort a given list of objects by a list of parameters.
118
+ #
119
+ # @private
120
+ # @!scope class
121
+ # @!visibility private
122
+ #
123
+ # @param [Array<Object>] list the 'list' of objects we are pruning from.
124
+ # @param [Array<Symbol>] parameters an array of parameters we are checking.
125
+ #
126
+ # @return [Array<Object>] our sorted list.
127
+ private_class_method def self.sort_list(list, parameters)
128
+ list.sort_by! do |object|
129
+ parameters.map do |param|
130
+ object.send(param).is_a?(String) ? I18n.transliterate(object.send(param)).downcase : object.send(param)
131
+ end
132
+ end
33
133
  end
34
134
  end
35
135
  end
@@ -1,3 +1,3 @@
1
1
  module Parliament
2
- VERSION = '0.5.19'.freeze
2
+ VERSION = '0.6.0'.freeze
3
3
  end
data/lib/parliament.rb CHANGED
@@ -5,11 +5,15 @@ require 'parliament/version'
5
5
  require 'parliament/request'
6
6
  require 'parliament/response'
7
7
  require 'parliament/utils'
8
- require 'parliament/no_content_error'
8
+ require 'parliament/decorator'
9
9
 
10
- # require all the decorators
11
- Dir[File.join(File.dirname(__FILE__), 'parliament/decorators', '*.rb')].each { |decorator| require decorator }
10
+ require 'parliament/network_error'
11
+ require 'parliament/client_error'
12
+ require 'parliament/server_error'
13
+ require 'parliament/no_content_response_error'
12
14
 
15
+ # Namespace for classes and modules that handle connections to, and processing of data from the parliamentary API.
16
+ # @since 0.0.1
13
17
  module Parliament
14
- # Your code goes here...
18
+ # Currently just a namespace definition
15
19
  end
@@ -8,10 +8,10 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Parliament::VERSION
9
9
  spec.authors = ['Matt Rayner']
10
10
  spec.email = ['mattrayner1@gmail.com']
11
- spec.summary = %q{Internal parliamentary data API wrapper for ruby}
11
+ spec.summary = %q{Internal parliamentary API wrapper}
12
12
  spec.description = %q{Internal parliamentary data API wrapper for ruby}
13
13
  spec.homepage = 'http://github.com/ukparliament/parliament_ruby'
14
- spec.license = 'Open Parliament License'
14
+ spec.license = 'Nonstandard'
15
15
 
16
16
 
17
17
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
@@ -26,8 +26,8 @@ Gem::Specification.new do |spec|
26
26
  spec.add_development_dependency 'bundler', '~> 1.13'
27
27
  spec.add_development_dependency 'rake', '~> 10.0'
28
28
  spec.add_development_dependency 'rspec', '~> 3.0'
29
- spec.add_development_dependency 'rubocop', '~> 0.47.1'
30
- spec.add_development_dependency 'simplecov', '~> 0.12.0'
31
- spec.add_development_dependency 'vcr', '~> 3.0.3'
32
- spec.add_development_dependency 'webmock', '~> 2.3.2'
29
+ spec.add_development_dependency 'rubocop', '~> 0.47'
30
+ spec.add_development_dependency 'simplecov', '~> 0.12'
31
+ spec.add_development_dependency 'vcr', '~> 3.0'
32
+ spec.add_development_dependency 'webmock', '~> 2.3'
33
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parliament-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.19
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Rayner
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-14 00:00:00.000000000 Z
11
+ date: 2017-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grom
@@ -72,56 +72,56 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 0.47.1
75
+ version: '0.47'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 0.47.1
82
+ version: '0.47'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: simplecov
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.12.0
89
+ version: '0.12'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 0.12.0
96
+ version: '0.12'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: vcr
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 3.0.3
103
+ version: '3.0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 3.0.3
110
+ version: '3.0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: webmock
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 2.3.2
117
+ version: '2.3'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 2.3.2
124
+ version: '2.3'
125
125
  description: Internal parliamentary data API wrapper for ruby
126
126
  email:
127
127
  - mattrayner1@gmail.com
@@ -144,29 +144,33 @@ files:
144
144
  - bin/console
145
145
  - bin/setup
146
146
  - lib/parliament.rb
147
- - lib/parliament/decorators/constituency_area.rb
148
- - lib/parliament/decorators/constituency_group.rb
149
- - lib/parliament/decorators/contact_point.rb
150
- - lib/parliament/decorators/gender.rb
151
- - lib/parliament/decorators/gender_identity.rb
152
- - lib/parliament/decorators/house.rb
153
- - lib/parliament/decorators/house_incumbency.rb
154
- - lib/parliament/decorators/house_seat.rb
155
- - lib/parliament/decorators/incumbency.rb
156
- - lib/parliament/decorators/party.rb
157
- - lib/parliament/decorators/party_membership.rb
158
- - lib/parliament/decorators/person.rb
159
- - lib/parliament/decorators/postal_address.rb
160
- - lib/parliament/decorators/seat_incumbency.rb
161
- - lib/parliament/no_content_error.rb
147
+ - lib/parliament/client_error.rb
148
+ - lib/parliament/decorator.rb
149
+ - lib/parliament/decorator/constituency_area.rb
150
+ - lib/parliament/decorator/constituency_group.rb
151
+ - lib/parliament/decorator/contact_point.rb
152
+ - lib/parliament/decorator/gender.rb
153
+ - lib/parliament/decorator/gender_identity.rb
154
+ - lib/parliament/decorator/house.rb
155
+ - lib/parliament/decorator/house_incumbency.rb
156
+ - lib/parliament/decorator/house_seat.rb
157
+ - lib/parliament/decorator/incumbency.rb
158
+ - lib/parliament/decorator/party.rb
159
+ - lib/parliament/decorator/party_membership.rb
160
+ - lib/parliament/decorator/person.rb
161
+ - lib/parliament/decorator/postal_address.rb
162
+ - lib/parliament/decorator/seat_incumbency.rb
163
+ - lib/parliament/network_error.rb
164
+ - lib/parliament/no_content_response_error.rb
162
165
  - lib/parliament/request.rb
163
166
  - lib/parliament/response.rb
167
+ - lib/parliament/server_error.rb
164
168
  - lib/parliament/utils.rb
165
169
  - lib/parliament/version.rb
166
170
  - parliament-ruby.gemspec
167
171
  homepage: http://github.com/ukparliament/parliament_ruby
168
172
  licenses:
169
- - Open Parliament License
173
+ - Nonstandard
170
174
  metadata: {}
171
175
  post_install_message:
172
176
  rdoc_options: []
@@ -184,8 +188,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
188
  version: '0'
185
189
  requirements: []
186
190
  rubyforge_project:
187
- rubygems_version: 2.6.6
191
+ rubygems_version: 2.6.10
188
192
  signing_key:
189
193
  specification_version: 4
190
- summary: Internal parliamentary data API wrapper for ruby
194
+ summary: Internal parliamentary API wrapper
191
195
  test_files: []
@@ -1,17 +0,0 @@
1
- module Parliament
2
- module Decorators
3
- module ConstituencyArea
4
- def latitude
5
- respond_to?(:constituencyAreaLatitude) ? constituencyAreaLatitude : ''
6
- end
7
-
8
- def longitude
9
- respond_to?(:constituencyAreaLongitude) ? constituencyAreaLongitude : ''
10
- end
11
-
12
- def polygon
13
- respond_to?(:constituencyAreaExtent) ? constituencyAreaExtent : ''
14
- end
15
- end
16
- end
17
- end
@@ -1,29 +0,0 @@
1
- module Parliament
2
- module Decorators
3
- module ContactPoint
4
- def postal_addresses
5
- respond_to?(:contactPointHasPostalAddress) ? contactPointHasPostalAddress : []
6
- end
7
-
8
- def email
9
- instance_variable_get('@email'.to_sym).nil? ? '' : instance_variable_get('@email'.to_sym)
10
- end
11
-
12
- def phone_number
13
- respond_to?(:phoneNumber) ? phoneNumber : ''
14
- end
15
-
16
- def fax_number
17
- respond_to?(:faxNumber) ? faxNumber : ''
18
- end
19
-
20
- def person
21
- respond_to?(:contactPointHasPerson) ? contactPointHasPerson : []
22
- end
23
-
24
- def incumbency
25
- respond_to?(:contactPointHasIncumbency) ? contactPointHasIncumbency.first : nil
26
- end
27
- end
28
- end
29
- end
@@ -1,9 +0,0 @@
1
- module Parliament
2
- module Decorators
3
- module Gender
4
- def name
5
- respond_to?(:genderName) ? genderName : ''
6
- end
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- module Parliament
2
- module Decorators
3
- module GenderIdentity
4
- def gender
5
- respond_to?(:genderIdentityHasGender) ? genderIdentityHasGender.first : nil
6
- end
7
- end
8
- end
9
- end
@@ -1,28 +0,0 @@
1
- module Parliament
2
- module Decorators
3
- module House
4
- def name
5
- respond_to?(:houseName) ? houseName : ''
6
- end
7
-
8
- def seat_incumbencies
9
- return @seat_incumbencies unless @seat_incumbencies.nil?
10
-
11
- seat_incumbencies = []
12
- seats.each do |seat|
13
- seat_incumbencies << seat.seat_incumbencies
14
- end
15
-
16
- @seat_incumbencies = seat_incumbencies.flatten.uniq
17
- end
18
-
19
- def seats
20
- respond_to?(:houseHasHouseSeat) ? houseHasHouseSeat : []
21
- end
22
-
23
- def house_incumbencies
24
- respond_to?(:houseHasHouseIncumbency) ? houseHasHouseIncumbency : []
25
- end
26
- end
27
- end
28
- end
@@ -1,31 +0,0 @@
1
- module Parliament
2
- module Decorators
3
- module HouseIncumbency
4
- def start_date
5
- respond_to?(:incumbencyStartDate) ? DateTime.parse(incumbencyStartDate) : nil
6
- end
7
-
8
- def end_date
9
- respond_to?(:incumbencyEndDate) ? DateTime.parse(incumbencyEndDate) : nil
10
- end
11
-
12
- def current?
13
- has_end_date = respond_to?(:incumbencyEndDate)
14
-
15
- !has_end_date
16
- end
17
-
18
- def house
19
- respond_to?(:houseIncumbencyHasHouse) ? houseIncumbencyHasHouse.first : nil
20
- end
21
-
22
- def member
23
- respond_to?(:incumbencyHasMember) ? incumbencyHasMember.first : nil
24
- end
25
-
26
- def contact_points
27
- respond_to?(:incumbencyHasContactPoint) ? incumbencyHasContactPoint : []
28
- end
29
- end
30
- end
31
- end