parliament-ruby 0.5.19 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -3
- data/.travis.yml +0 -1
- data/Gemfile +2 -0
- data/Makefile +9 -4
- data/README.md +185 -11
- data/Rakefile +1 -1
- data/lib/parliament/client_error.rb +21 -0
- data/lib/parliament/decorator/constituency_area.rb +27 -0
- data/lib/parliament/{decorators → decorator}/constituency_group.rb +29 -1
- data/lib/parliament/decorator/contact_point.rb +48 -0
- data/lib/parliament/decorator/gender.rb +13 -0
- data/lib/parliament/decorator/gender_identity.rb +13 -0
- data/lib/parliament/decorator/house.rb +41 -0
- data/lib/parliament/decorator/house_incumbency.rb +50 -0
- data/lib/parliament/decorator/house_seat.rb +27 -0
- data/lib/parliament/decorator/incumbency.rb +57 -0
- data/lib/parliament/decorator/party.rb +27 -0
- data/lib/parliament/decorator/party_membership.rb +36 -0
- data/lib/parliament/decorator/person.rb +224 -0
- data/lib/parliament/{decorators → decorator}/postal_address.rb +5 -1
- data/lib/parliament/decorator/seat_incumbency.rb +64 -0
- data/lib/parliament/decorator.rb +7 -0
- data/lib/parliament/network_error.rb +13 -0
- data/lib/parliament/no_content_response_error.rb +19 -0
- data/lib/parliament/request.rb +112 -33
- data/lib/parliament/response.rb +76 -9
- data/lib/parliament/server_error.rb +21 -0
- data/lib/parliament/utils.rb +113 -13
- data/lib/parliament/version.rb +1 -1
- data/lib/parliament.rb +8 -4
- data/parliament-ruby.gemspec +6 -6
- metadata +32 -28
- data/lib/parliament/decorators/constituency_area.rb +0 -17
- data/lib/parliament/decorators/contact_point.rb +0 -29
- data/lib/parliament/decorators/gender.rb +0 -9
- data/lib/parliament/decorators/gender_identity.rb +0 -9
- data/lib/parliament/decorators/house.rb +0 -28
- data/lib/parliament/decorators/house_incumbency.rb +0 -31
- data/lib/parliament/decorators/house_seat.rb +0 -17
- data/lib/parliament/decorators/incumbency.rb +0 -35
- data/lib/parliament/decorators/party.rb +0 -17
- data/lib/parliament/decorators/party_membership.rb +0 -23
- data/lib/parliament/decorators/person.rb +0 -152
- data/lib/parliament/decorators/seat_incumbency.rb +0 -39
- data/lib/parliament/no_content_error.rb +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 792a61423210db4d06e2690193e47bc5949ffc6b
|
4
|
+
data.tar.gz: e0649c47b1ba552d2045cbbde8f37c26ab6365c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c790934d4d403ec1e1a06af7d22c81eb7dea09dcaacc98b2c085ff2025f5ca0aa462c5ae8c2e35b00277e1527b26ee272e45fe5ca1b7e06c93733c03db73c831
|
7
|
+
data.tar.gz: c208d4dab4609203665386c20995500830a88bbae85ff8fe7dbee2aa91d3f457cbc9088ae81b00d1754040b47e66095c1b77142f48e482062850cc5b04544dea
|
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/Makefile
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
test:
|
2
|
-
bundle exec
|
2
|
+
bundle exec rake
|
3
3
|
|
4
4
|
build:
|
5
|
-
gem build parliament-ruby.gemspec
|
5
|
+
gem build parliament-ruby.gemspec
|
6
|
+
|
7
|
+
release: build test
|
8
|
+
gem push parliament-ruby-*.gem
|
9
|
+
rm parliament-ruby-*.gem
|
10
|
+
|
11
|
+
|
12
|
+
|
6
13
|
|
7
|
-
release: build test
|
8
|
-
gem push parliament-ruby-*.gem ; rm parliament-ruby-*.gem
|
data/README.md
CHANGED
@@ -16,7 +16,15 @@
|
|
16
16
|
- [Setting up a connection](#setting-up-a-connection)
|
17
17
|
- [Setting a base URL 'globally'](#setting-a-base-url-globally)
|
18
18
|
- [Building an 'endpoint'](#building-an-endpoint)
|
19
|
-
|
19
|
+
- [Methods](#methods)
|
20
|
+
- [`#get`](#get)
|
21
|
+
- [`#filter`](#filter)
|
22
|
+
- [`#sort_by`](#sort_by)
|
23
|
+
- [`#reverse_sort_by`](#reverse_sort_by)
|
24
|
+
- [`Partliament::Utils`](#partliamentutils)
|
25
|
+
- [Methods](#methods-1)
|
26
|
+
- [`Parliament::Utils.sort_by`](#parliamentutilssort_by)
|
27
|
+
- [`Parliament::Utils.reverse_sort_by`](#parliamentutilsreverse_sort_by)
|
20
28
|
- [Getting Started with Development](#getting-started-with-development)
|
21
29
|
- [Running the tests](#running-the-tests)
|
22
30
|
- [Contributing](#contributing)
|
@@ -41,6 +49,8 @@ gem 'parliament', git: 'https://github.com/ukparliament/parliament-ruby.git', br
|
|
41
49
|
## Usage
|
42
50
|
This gem's main function is fetching an n-triple file from a remote server and converting it into linked ruby objects.
|
43
51
|
|
52
|
+
> **Note:** Comprehensive class documentation can be found on [rubydocs][rubydocs].
|
53
|
+
|
44
54
|
### Setting up a connection
|
45
55
|
In order to connect to a remote server, we first need to set a base_url value, from which we will build an 'endpoint'. The base_url should be the beginning of a url without the trailing slash. For example `http://example.com` instead of `http://example.com/`.
|
46
56
|
```ruby
|
@@ -76,20 +86,182 @@ An endpoint is effectively just a full URL to an n-triple file on a remote serve
|
|
76
86
|
|
77
87
|
Building an endpoint is simple, once you have a Parliament::Request object, you do something like this:
|
78
88
|
```ruby
|
79
|
-
parliament = Parliament::Request.new(base_url: 'http://test.com') #=> #<Parliament::Request>
|
89
|
+
parliament = Parliament::Request.new(base_url: 'http://test.com') #=> #<Parliament::Request [...]>
|
90
|
+
|
91
|
+
# Target endpoint: 'http://test.com/parties/current'
|
92
|
+
parliament.parties.current
|
93
|
+
|
94
|
+
# Target endpoint: 'http://test.com/parties/123/people/current'
|
95
|
+
parliament.parties('123').people.current
|
96
|
+
|
97
|
+
# Target endpoint: 'http://test.com/people/123/letters/456'
|
98
|
+
parliament.people('123').letters('456')
|
99
|
+
```
|
100
|
+
|
101
|
+
|
102
|
+
### Methods
|
103
|
+
[parliament-ruby][parliament-ruby] comes with the following common methods:
|
104
|
+
|
105
|
+
| Method | Description |
|
106
|
+
|----------------------------------------|-------------|
|
107
|
+
| [`#get`](#get) | **Make a GET request** - Make a HTTP GET request to the endpoint we have built, and create Ruby objects. |
|
108
|
+
| [`#filter`](#filter) | **Filter the response** - After making a GET request, filter the objects returned by type attribute. |
|
109
|
+
| [`#sort_by`](#sort_by) | **Sort the response (ASC)** - After making a GET request, sort the result in ascending order. |
|
110
|
+
| [`#reverse_sort_by`](#reverse_sort_by) | **Sort the response (DESC)** - After making a GET request, sort the result in descending order. |
|
111
|
+
|
112
|
+
> **Note:** Comprehensive class documentation can be found on [rubydocs][rubydocs].
|
113
|
+
|
114
|
+
#### `#get`
|
115
|
+
Once you've built your endpoint (`parliament.people.current`), we use the `#get` method to tell us you're ready to get the data.
|
116
|
+
|
117
|
+
```ruby
|
118
|
+
# Target endpoint: 'http://test.com/people/123/letters/456'
|
119
|
+
response = parliament.people('123').letters('456').get #=> #<Parliament::Response [...]>
|
120
|
+
|
121
|
+
response.each do |node|
|
122
|
+
# If your n-triple file contains a literal object it is stored into an instance variable accessible via the predicate
|
123
|
+
# name. For example, with the following triple:
|
124
|
+
# <http://id.ukpds.org/1234> <http://id.ukpds.org/schema/name> 'Matthew Rayner' .
|
125
|
+
#
|
126
|
+
# You would be able to access the `name` attribute like so:
|
127
|
+
puts node.name #=> 'Matthew Rayner'
|
128
|
+
|
129
|
+
# If your n-triple file contains a triple who's object is a URI, and that URI is defined within your file, a link will
|
130
|
+
# be created, allowing you to 'connect' the two objects. For example, with the following triples:
|
131
|
+
# <http://id.ukpds.org/1234> <http://id.ukpds.org/schema/name> 'Matthew Rayner' .
|
132
|
+
# <http://id.ukpds.org/1234> <http://id.ukpds.org/schema/partyMembership> <http://id.ukpds.org/5678> .
|
133
|
+
# <http://id.ukpds.org/5678> <http://id.ukpds.org/schema/startDate> "1992-04-09"^^<http://www.w3.org/2001/XMLSchema#date> .
|
134
|
+
#
|
135
|
+
# You would be able to access the start date attribute on the linked object like so:
|
136
|
+
puts node.graph_id #=> '12345'
|
137
|
+
puts node.name #=> 'Matthew Rayner'
|
138
|
+
puts node.partyMembership #=> [#<Grom::Node @startDate=...>]
|
139
|
+
|
140
|
+
puts node.partyMembership.first.startDate #=> "1992-04-09"
|
141
|
+
end
|
142
|
+
```
|
143
|
+
|
144
|
+
`#get` returns a `Parliament::Response` object which contains all of the nodes from our n-triple response.
|
145
|
+
|
146
|
+
#### `#filter`
|
147
|
+
If your n-triple file contains a number of different objects you can filter based on type attribute.
|
148
|
+
|
149
|
+
```ruby
|
150
|
+
# Target endpoint: 'http://test.com/people/members/current'
|
151
|
+
response = parliament.people.members.current.get #=> #<Parliament::Response [...]>
|
152
|
+
|
153
|
+
# Given the below set of triples, you will be able to filter on 'type' attribute.
|
154
|
+
# <http://id.ukpds.org/cea89432-e046-4013-a9ba-e93d0468d186> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://id.ukpds.org/schema/Person> .
|
155
|
+
# <http://id.ukpds.org/4ef6c7b7-a5c8-4dde-a5a5-29c9f80d8a27> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://id.ukpds.org/schema/Constituency> .
|
156
|
+
# <http://id.ukpds.org/80234c90-f86a-4942-b6ae-d1e57a0b378d> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://id.ukpds.org/schema/Party> .
|
157
|
+
# <http://id.ukpds.org/HouseOfCommons> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://id.ukpds.org/schema/House> .
|
158
|
+
#
|
159
|
+
# The filter method returns an array of filtered responses. Each response holding just items with the given type attribute.
|
160
|
+
filtered_responses = response.filter('http://id.ukpds.org/schema/Person', 'http://id.ukpds.org/schema/Party', 'http://id.ukpds.org/schema/Constituency')
|
161
|
+
filtered_responses #=> [<#Parliament::Response [...]>, <#Parliament::Response []>, <#Parliament::Response [...]>]
|
162
|
+
```
|
80
163
|
|
81
|
-
|
82
|
-
|
164
|
+
#### `#sort_by`
|
165
|
+
Once you have a `Parliament::Response` object, you can perform an ascending sort on the results by using the `#sort_by` method.
|
83
166
|
|
84
|
-
|
85
|
-
parliament.parties('123').people.current.get
|
167
|
+
> **`#sort_by`** is an ascending order sort i.e. (a..z, 0..9)
|
86
168
|
|
87
|
-
|
88
|
-
|
169
|
+
```ruby
|
170
|
+
# Target endpoint: 'http://test.com/people/members/current'
|
171
|
+
response = parliament.people.members.current.get #=> #<Parliament::Response [...]>
|
172
|
+
|
173
|
+
# Given the below set of triples, you can sort ascending like so:
|
174
|
+
# <http://id.ukpds.org/1234> <http://id.ukpds.org/schema/startDate> "1997-01-01"^^<http://www.w3.org/2001/XMLSchema#date> .
|
175
|
+
# <http://id.ukpds.org/5678> <http://id.ukpds.org/schema/startDate> "1991-03-15"^^<http://www.w3.org/2001/XMLSchema#date> .
|
176
|
+
# <http://id.ukpds.org/9101> <http://id.ukpds.org/schema/startDate> "2011-09-04"^^<http://www.w3.org/2001/XMLSchema#date> .
|
177
|
+
# <http://id.ukpds.org/1121> <http://id.ukpds.org/schema/startDate> "1981-07-31"^^<http://www.w3.org/2001/XMLSchema#date> .
|
178
|
+
# <http://id.ukpds.org/3141> <http://id.ukpds.org/schema/endDate> "1997-07-31"^^<http://www.w3.org/2001/XMLSchema#date> .
|
179
|
+
#
|
180
|
+
# The sort_by method returns a sorted array of Grom::Nodes, sorted by one, or many, symbols passed to it.
|
181
|
+
sorted_response = response.sort_by(:startDate)
|
182
|
+
|
183
|
+
# Output each of the graph_id and startDate values
|
184
|
+
sorted_response.each { |node| puts "#{node.graph_id} - #{node.respond_to?(:startDate) ? node.startDate : 'undefined'}" }
|
185
|
+
# http://id.ukpds.org/3141 - undefined
|
186
|
+
# http://id.ukpds.org/1121 - 1981-07-31
|
187
|
+
# http://id.ukpds.org/5678 - 1991-03-15
|
188
|
+
# http://id.ukpds.org/1234 - 1997-01-01
|
189
|
+
# http://id.ukpds.org/9101 - 2011-09-04
|
190
|
+
```
|
191
|
+
|
192
|
+
> **NOTE:** `#sort_by` places all `nil` responses at the start of the sort. For a more custom sort, take a look at `Parliament::Utils.sort_by`.
|
193
|
+
|
194
|
+
#### `#reverse_sort_by`
|
195
|
+
`#reverse_sort_by` simple implements `#sort_by` and calls `#reverse!` on the resulting array. The above example would become:
|
196
|
+
|
197
|
+
```ruby
|
198
|
+
# http://id.ukpds.org/9101 - 2011-09-04
|
199
|
+
# http://id.ukpds.org/1234 - 1997-01-01
|
200
|
+
# http://id.ukpds.org/5678 - 1991-03-15
|
201
|
+
# http://id.ukpds.org/1121 - 1981-07-31
|
202
|
+
# http://id.ukpds.org/3141 - undefined
|
89
203
|
```
|
90
204
|
|
91
|
-
|
92
|
-
|
205
|
+
### `Partliament::Utils`
|
206
|
+
Included with [parliament-ruby][parliament-ruby] is `Parliament::Utils`. This module includes helper methods commonly used throughout parliament.uk.
|
207
|
+
|
208
|
+
#### Methods
|
209
|
+
|
210
|
+
| Method | Description |
|
211
|
+
|-------------------------------------------------------|-------------|
|
212
|
+
| [`#sort_by`](#parliamentutilssort_by) | **Sort an enumerable thing (ASC)** - An implementation of ruby's `#sort_by` method that allows nil sorts. |
|
213
|
+
| [`#reverse_sort_by`](#parliamentutilsreverse_sort_by) | **Sort an enumerable thing (DESC)** - Reverse the result of `Parliament::Utils.reverse_sort_by` |
|
214
|
+
|
215
|
+
|
216
|
+
##### `Parliament::Utils.sort_by`
|
217
|
+
One of the common use cases we have is sorting objects by a date (e.g. seat incumbency end date) where an object without an end date is considered 'current' and should be sorted to the top (or bottom) of a list.
|
218
|
+
|
219
|
+
Because we working with graph databases, a node without an endDate simply has no method when converted to an object with [GROM][grom].
|
220
|
+
|
221
|
+
The `Parliament::Utils.sort_by` method takes a hash of options, detailed below:
|
222
|
+
|
223
|
+
```ruby
|
224
|
+
response = parliament.people('123').get.filter('http://id.ukpds.org/schema/Person')
|
225
|
+
|
226
|
+
objects = response.first.incumbencies
|
227
|
+
|
228
|
+
options = {
|
229
|
+
list: objects, # An enumerable of objects (most commonly an Array)
|
230
|
+
parameters: [:endDate], # An array of actions which we will sort by
|
231
|
+
prepend_rejected: false # {optional default=true} Should any objects that are 'rejected' be prepended to the sorted list, or appended. i.e. where to put objects that don't respond to parameters provided
|
232
|
+
}
|
233
|
+
|
234
|
+
sorted_list = Parliament::Util.sort_by(options)
|
235
|
+
|
236
|
+
sorted_list.each { |incumbency| puts incumbency.respond_to?(:endDate) ? incumbency.endDate : 'Current' }
|
237
|
+
# http://id.ukpds.org/1121 - 1981-07-31
|
238
|
+
# http://id.ukpds.org/5678 - 1991-03-15
|
239
|
+
# http://id.ukpds.org/1234 - 1997-01-01
|
240
|
+
# http://id.ukpds.org/9101 - 2011-09-04
|
241
|
+
# http://id.ukpds.org/3141 - Current
|
242
|
+
```
|
243
|
+
|
244
|
+
##### `Parliament::Utils.reverse_sort_by`
|
245
|
+
This method, under the hood, calls `Parliament::Utils.sort_by` and runs `#reverse!` on the result.
|
246
|
+
|
247
|
+
Following the above example, and changing:
|
248
|
+
```ruby
|
249
|
+
sorted_list = Parliament::Util.sort_by(options)
|
250
|
+
```
|
251
|
+
|
252
|
+
to:
|
253
|
+
```ruby
|
254
|
+
sorted_list = Parliament::Util.reverse_sort_by(options)
|
255
|
+
```
|
256
|
+
|
257
|
+
should result in:
|
258
|
+
```ruby
|
259
|
+
# http://id.ukpds.org/3141 - Current
|
260
|
+
# http://id.ukpds.org/9101 - 2011-09-04
|
261
|
+
# http://id.ukpds.org/1234 - 1997-01-01
|
262
|
+
# http://id.ukpds.org/5678 - 1991-03-15
|
263
|
+
# http://id.ukpds.org/1121 - 1981-07-31
|
264
|
+
```
|
93
265
|
|
94
266
|
|
95
267
|
## Getting Started with Development
|
@@ -127,9 +299,11 @@ If you wish to submit a bug fix or feature, you can create a pull request and it
|
|
127
299
|
[parliament-ruby]: https://github.com/ukparliament/parliament-ruby
|
128
300
|
[pds]: https://www.parliament.uk/mps-lords-and-offices/offices/bicameral/parliamentary-digital-service/
|
129
301
|
[ruby-version]: https://github.com/ukparliament/parliament-ruby/blob/master/.ruby-version
|
302
|
+
[grom]: https://github.com/ukparliament/grom
|
303
|
+
[rubydocs]: http://www.rubydoc.info/github/ukparliament/parliament-ruby/master/file/README.md
|
130
304
|
|
131
305
|
[info-gem]: https://rubygems.org/gems/parliament-ruby
|
132
|
-
[shield-gem]: https://img.shields.io/gem/v/
|
306
|
+
[shield-gem]: https://img.shields.io/gem/v/parliament-ruby.svg
|
133
307
|
|
134
308
|
[info-travis]: https://travis-ci.org/ukparliament/parliament-ruby
|
135
309
|
[shield-travis]: https://img.shields.io/travis/ukparliament/parliament-ruby.svg
|
data/Rakefile
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
module Parliament
|
2
|
+
# An error raised when a 4xx status code is returned by Net::HTTP inside of Parliament::Request.
|
3
|
+
#
|
4
|
+
# @see Parliament::ServerError
|
5
|
+
#
|
6
|
+
# @since 0.6.0
|
7
|
+
class ClientError < Parliament::NetworkError
|
8
|
+
# @param [String] url the url that caused the Parliament::ClientError
|
9
|
+
# @param [Net::HTTPClientError] response the Net:HTTPClientError that caused the Parliament::ClientError
|
10
|
+
#
|
11
|
+
# @example Creating a Parliament::ClientError
|
12
|
+
# url = 'http://localhost:3030/foo/bar'
|
13
|
+
#
|
14
|
+
# response = Net::HTTP.get_response(URI(url))
|
15
|
+
#
|
16
|
+
# raise Parliament::ClientError.new(url, response) if response.is_a?(Net::HTTPClientError)
|
17
|
+
def initialize(url, response)
|
18
|
+
super
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Parliament
|
2
|
+
module Decorator
|
3
|
+
# Decorator namespace for Grom::Node instances with type: http://id.ukpds.org/schema/ConstituencyArea
|
4
|
+
module ConstituencyArea
|
5
|
+
# Alias constituencyAreaLatitude with fallback.
|
6
|
+
#
|
7
|
+
# @return [String, String] the latitude of the Grom::Node or an empty string.
|
8
|
+
def latitude
|
9
|
+
respond_to?(:constituencyAreaLatitude) ? constituencyAreaLatitude : ''
|
10
|
+
end
|
11
|
+
|
12
|
+
# Alias constituencyAreaLongitude with fallback.
|
13
|
+
#
|
14
|
+
# @return [String, String] the longitude of the Grom::Node or an empty string.
|
15
|
+
def longitude
|
16
|
+
respond_to?(:constituencyAreaLongitude) ? constituencyAreaLongitude : ''
|
17
|
+
end
|
18
|
+
|
19
|
+
# Alias constituencyAreaExtent with fallback.
|
20
|
+
#
|
21
|
+
# @return [String, String] the polygon of the Grom::Node or an empty string.
|
22
|
+
def polygon
|
23
|
+
respond_to?(:constituencyAreaExtent) ? constituencyAreaExtent : ''
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,22 +1,38 @@
|
|
1
1
|
module Parliament
|
2
|
-
module
|
2
|
+
module Decorator
|
3
|
+
# Decorator namespace for Grom::Node instances with type: http://id.ukpds.org/schema/ConstituencyGroup
|
3
4
|
module ConstituencyGroup
|
5
|
+
# Alias constituencyGroupName with fallback.
|
6
|
+
#
|
7
|
+
# @return [String, String] the name of the Grom::Node or an empty string.
|
4
8
|
def name
|
5
9
|
respond_to?(:constituencyGroupName) ? constituencyGroupName : ''
|
6
10
|
end
|
7
11
|
|
12
|
+
# Alias constituencyGroupStartDate with fallback.
|
13
|
+
#
|
14
|
+
# @return [DateTime, nil] the start date of the Grom::Node or nil.
|
8
15
|
def start_date
|
9
16
|
respond_to?(:constituencyGroupStartDate) ? DateTime.parse(constituencyGroupStartDate) : nil
|
10
17
|
end
|
11
18
|
|
19
|
+
# Alias constituencyGroupEndDate with fallback.
|
20
|
+
#
|
21
|
+
# @return [DateTime, nil] the end date of the Grom::Node or nil.
|
12
22
|
def end_date
|
13
23
|
respond_to?(:constituencyGroupEndDate) ? DateTime.parse(constituencyGroupEndDate) : nil
|
14
24
|
end
|
15
25
|
|
26
|
+
# Alias constituencyGroupHasHouseSeat with fallback.
|
27
|
+
#
|
28
|
+
# @return [Array, Array] the house seats of the Grom::Node or an empty array.
|
16
29
|
def seats
|
17
30
|
respond_to?(:constituencyGroupHasHouseSeat) ? constituencyGroupHasHouseSeat : []
|
18
31
|
end
|
19
32
|
|
33
|
+
# Alias houseSeatHasSeatIncumbency with fallback.
|
34
|
+
#
|
35
|
+
# @return [Array, Array] the seat incumbencies of the Grom::Node or an empty array.
|
20
36
|
def seat_incumbencies
|
21
37
|
return @seat_incumbencies unless @seat_incumbencies.nil?
|
22
38
|
|
@@ -28,6 +44,9 @@ module Parliament
|
|
28
44
|
@seat_incumbencies = seat_incumbencies.flatten.uniq
|
29
45
|
end
|
30
46
|
|
47
|
+
# Alias incumbencyHasMember with fallback.
|
48
|
+
#
|
49
|
+
# @return [Array, Array] the members of the Grom::Node or an empty array.
|
31
50
|
def members
|
32
51
|
return @members unless @members .nil?
|
33
52
|
|
@@ -39,10 +58,16 @@ module Parliament
|
|
39
58
|
@members = members.flatten.uniq
|
40
59
|
end
|
41
60
|
|
61
|
+
# Alias constituencyGroupHasConstituencyArea with fallback.
|
62
|
+
#
|
63
|
+
# @return [Grom::Node, nil] a Grom::Node with type http://id.ukpds.org/schema/ConstituencyArea or nil.
|
42
64
|
def area
|
43
65
|
respond_to?(:constituencyGroupHasConstituencyArea) ? constituencyGroupHasConstituencyArea.first : nil
|
44
66
|
end
|
45
67
|
|
68
|
+
# Alias incumbencyHasContactPoint with fallback.
|
69
|
+
#
|
70
|
+
# @return [Array, Array] the contact points of the Grom::Node or an empty array.
|
46
71
|
def contact_points
|
47
72
|
return @contact_points unless @contact_points.nil?
|
48
73
|
|
@@ -54,6 +79,9 @@ module Parliament
|
|
54
79
|
@contact_points = contact_points.flatten.uniq
|
55
80
|
end
|
56
81
|
|
82
|
+
# Checks if Grom::Node has an end date.
|
83
|
+
#
|
84
|
+
# @return [Boolean] a boolean depending on whether or not the Grom::Node has an end date.
|
57
85
|
def current?
|
58
86
|
has_end_date = respond_to?(:constituencyGroupEndDate)
|
59
87
|
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Parliament
|
2
|
+
module Decorator
|
3
|
+
# Decorator namespace for Grom::Node instances with type: http://id.ukpds.org/schema/ContactPoint
|
4
|
+
module ContactPoint
|
5
|
+
# Alias contactPointHasPostalAddress with fallback.
|
6
|
+
#
|
7
|
+
# @return [Array, Array] an array of the postal addresses for the Grom::Node or an empty array.
|
8
|
+
def postal_addresses
|
9
|
+
respond_to?(:contactPointHasPostalAddress) ? contactPointHasPostalAddress : []
|
10
|
+
end
|
11
|
+
|
12
|
+
# Alias email with fallback.
|
13
|
+
#
|
14
|
+
# @return [String, String] the email of the Grom::Node or an empty string.
|
15
|
+
def email
|
16
|
+
instance_variable_get('@email'.to_sym).nil? ? '' : instance_variable_get('@email'.to_sym)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Alias phoneNumber with fallback.
|
20
|
+
#
|
21
|
+
# @return [String, String] the phone number of the Grom::Node or an empty string.
|
22
|
+
def phone_number
|
23
|
+
respond_to?(:phoneNumber) ? phoneNumber : ''
|
24
|
+
end
|
25
|
+
|
26
|
+
# Alias faxNumber with fallback.
|
27
|
+
#
|
28
|
+
# @return [String, String] the fax number of the Grom::Node or an empty string.
|
29
|
+
def fax_number
|
30
|
+
respond_to?(:faxNumber) ? faxNumber : ''
|
31
|
+
end
|
32
|
+
|
33
|
+
# Alias contactPointHasPerson with fallback.
|
34
|
+
#
|
35
|
+
# @return [Array, Array] the person connected to the Grom::Node or an empty array.
|
36
|
+
def person
|
37
|
+
respond_to?(:contactPointHasPerson) ? contactPointHasPerson : []
|
38
|
+
end
|
39
|
+
|
40
|
+
# Alias contactPointHasIncumbency with fallback.
|
41
|
+
#
|
42
|
+
# @return [Grom::Node, nil] the incumbency of the Grom::Node or nil.
|
43
|
+
def incumbency
|
44
|
+
respond_to?(:contactPointHasIncumbency) ? contactPointHasIncumbency.first : nil
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|