europeana-api 1.0.0 → 1.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: a0b2c092e5307dddee16a30424d9f095d1881006
4
- data.tar.gz: 9e55b99b93b151cf461c3ddf297329c163a7a3df
2
+ SHA256:
3
+ metadata.gz: f14b39bae1cf885de3216f4cf7ebf404c10c71edca2835e8368dcd97d7bbad4f
4
+ data.tar.gz: bd8edd6d721b6a7821f433d1c03f12e6e072b9621b2cb5591c03f9788311890d
5
5
  SHA512:
6
- metadata.gz: 57332276a79ed9680b91d31ed8439c67adef397fea3377062eb48797118796722d40e5506dd5fc829e13ea5e375ad81b0460495d1c8c125f3b0d1659756b003f
7
- data.tar.gz: bfa182f373f3df742b5db95b3bb14ed9014b0c8ea99545e69ae5c37e1f52a02a9ef14c1104bd76f42e74185ef69a2f96e51cb174dfc74030335828b821eb43ee
6
+ metadata.gz: 8392c7700d06bae929246578515fe13d9809be5c4062dfe5a757a11a414abf38b33ee7d24f84da4ad4b6e3a7e25fbcb6e69a8a3996920939fc73dad03db4a604
7
+ data.tar.gz: b1d638bff24d90092427b8cd475556286ac2dcc2f8c19e22a1dc2baacb507fdc5dbadc29d4cfec42ebcd01f27346537f330b52d0e3dac312090716eb41f19057
data/.codeclimate.yml ADDED
@@ -0,0 +1,5 @@
1
+ plugins:
2
+ brakeman:
3
+ enabled: false
4
+ rubocop:
5
+ enabled: true
data/.rubocop.yml CHANGED
@@ -1 +1,4 @@
1
1
  inherit_from: ./.ruby-style.yml
2
+ AllCops:
3
+ Exclude:
4
+ - 'app/models/rdf/vocab/*'
data/.ruby-style.yml CHANGED
@@ -1,12 +1,100 @@
1
+ ---
1
2
  AllCops:
2
3
  Exclude:
3
- - "vendor/**/*"
4
- - "db/schema.rb"
4
+ - vendor/**/*
5
+ - db/schema.rb
6
+ - tmp/**/*
5
7
  UseCache: false
6
8
  TargetRubyVersion: 2.3
9
+ Layout/DotPosition:
10
+ Enabled: true
11
+ EnforcedStyle: trailing
12
+ SupportedStyles:
13
+ - leading
14
+ - trailing
15
+ Lint/AssignmentInCondition:
16
+ Enabled: false
17
+ AllowSafeAssignment: true
18
+ Lint/EachWithObjectArgument:
19
+ Enabled: true
20
+ Lint/HandleExceptions:
21
+ Enabled: false
22
+ Lint/LiteralAsCondition:
23
+ Enabled: false
24
+ Lint/LiteralInInterpolation:
25
+ Enabled: false
26
+ Metrics/AbcSize:
27
+ Enabled: false
28
+ Max: 15
29
+ Metrics/BlockLength:
30
+ Exclude:
31
+ - Rakefile
32
+ - "**/*.rake"
33
+ - spec/**/*.rb
34
+ - config/routes.rb
35
+ ExcludedMethods:
36
+ - aasm
37
+ - class_methods
38
+ Metrics/ClassLength:
39
+ Enabled: false
40
+ CountComments: false
41
+ Max: 100
42
+ Metrics/CyclomaticComplexity:
43
+ Enabled: false
44
+ Max: 6
45
+ Metrics/LineLength:
46
+ Max: 140
47
+ AllowHeredoc: true
48
+ AllowURI: true
49
+ URISchemes:
50
+ - http
51
+ - https
52
+ Metrics/MethodLength:
53
+ Enabled: false
54
+ CountComments: false
55
+ Max: 10
56
+ Metrics/ModuleLength:
57
+ CountComments: false
58
+ Max: 100
59
+ Enabled: false
60
+ Metrics/ParameterLists:
61
+ Enabled: false
62
+ Max: 5
63
+ CountKeywordArgs: true
64
+ Metrics/PerceivedComplexity:
65
+ Enabled: false
66
+ Max: 7
67
+ Naming/AccessorMethodName:
68
+ Enabled: false
69
+ Naming/FileName:
70
+ Enabled: false
71
+ Exclude: []
72
+ Naming/PredicateName:
73
+ Enabled: true
74
+ NamePrefix:
75
+ - is_
76
+ - has_
77
+ - have_
78
+ NamePrefixBlacklist:
79
+ - is_
80
+ Exclude:
81
+ - spec/**/*
82
+ Naming/UncommunicativeMethodParamName:
83
+ MinNameLength: 3
84
+ AllowNamesEndingInNumbers: true
85
+ AllowedNames:
86
+ - io
87
+ - id
88
+ - to
89
+ - by
90
+ - 'on'
91
+ - in
92
+ - at
93
+ - '_'
94
+ ForbiddenNames: []
95
+ Style/Alias:
96
+ Enabled: false
7
97
  Style/CollectionMethods:
8
- Description: Preferred collection methods.
9
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#map-find-select-reduce-size
10
98
  Enabled: true
11
99
  PreferredMethods:
12
100
  collect: map
@@ -14,35 +102,31 @@ Style/CollectionMethods:
14
102
  find: detect
15
103
  find_all: select
16
104
  reduce: inject
17
- Style/DotPosition:
18
- Description: Checks the position of the dot in multi-line method calls.
19
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#consistent-multi-line-chains
20
- Enabled: true
21
- EnforcedStyle: trailing
22
- SupportedStyles:
23
- - leading
24
- - trailing
25
- Style/FileName:
26
- Description: Use snake_case for source file names.
27
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#snake-case-files
105
+ Style/Documentation:
106
+ Enabled: false
107
+ Style/DoubleNegation:
108
+ Enabled: false
109
+ Style/EachWithObject:
110
+ Enabled: false
111
+ Style/EmptyLiteral:
28
112
  Enabled: false
29
- Exclude: []
30
113
  Style/GuardClause:
31
- Description: Check for conditionals that can be replaced with guard clauses
32
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals
33
114
  Enabled: false
34
115
  MinBodyLength: 1
35
116
  Style/IfUnlessModifier:
36
- Description: Favor modifier if/unless usage when you have a single-line body.
37
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#if-as-a-modifier
38
117
  Enabled: false
39
- MaxLineLength: 80
118
+ Style/InlineComment:
119
+ Enabled: false
120
+ Style/MethodMissing:
121
+ Exclude:
122
+ - app/presenters/**/*
123
+ Style/ModuleFunction:
124
+ Enabled: false
125
+ Style/OneLineConditional:
126
+ Enabled: false
40
127
  Style/OptionHash:
41
- Description: Don't use option hashes when you can use keyword arguments.
42
128
  Enabled: false
43
129
  Style/PercentLiteralDelimiters:
44
- Description: Use `%`-literal delimiters consistently
45
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#percent-literal-braces
46
130
  Enabled: false
47
131
  PreferredDelimiters:
48
132
  "%": "()"
@@ -54,29 +138,17 @@ Style/PercentLiteralDelimiters:
54
138
  "%w": "()"
55
139
  "%W": "()"
56
140
  "%x": "()"
57
- Style/PredicateName:
58
- Description: Check the names of predicate methods.
59
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#bool-methods-qmark
60
- Enabled: true
61
- NamePrefix:
62
- - is_
63
- - has_
64
- - have_
65
- NamePrefixBlacklist:
66
- - is_
67
- Exclude:
68
- - spec/**/*
141
+ Style/PerlBackrefs:
142
+ Enabled: false
69
143
  Style/RaiseArgs:
70
- Description: Checks the arguments passed to raise/fail.
71
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#exception-class-messages
72
144
  Enabled: false
73
145
  EnforcedStyle: exploded
74
146
  SupportedStyles:
75
147
  - compact
76
148
  - exploded
149
+ Style/Send:
150
+ Enabled: false
77
151
  Style/SignalException:
78
- Description: Checks for proper usage of fail and raise.
79
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#fail-method
80
152
  Enabled: false
81
153
  EnforcedStyle: semantic
82
154
  SupportedStyles:
@@ -84,8 +156,6 @@ Style/SignalException:
84
156
  - only_fail
85
157
  - semantic
86
158
  Style/SingleLineBlockParams:
87
- Description: Enforces the names of some block params.
88
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#reduce-blocks
89
159
  Enabled: false
90
160
  Methods:
91
161
  - reduce:
@@ -95,158 +165,26 @@ Style/SingleLineBlockParams:
95
165
  - a
96
166
  - e
97
167
  Style/SingleLineMethods:
98
- Description: Avoid single-line methods.
99
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-single-line-methods
100
168
  Enabled: false
101
169
  AllowIfMethodIsEmpty: true
170
+ Style/SpecialGlobalVars:
171
+ Enabled: false
102
172
  Style/StringLiterals:
103
- Description: Checks if uses of quotes match the configured preference.
104
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#consistent-string-literals
105
173
  Enabled: true
106
174
  EnforcedStyle: single_quotes
107
175
  SupportedStyles:
108
176
  - single_quotes
109
177
  - double_quotes
110
178
  Style/StringLiteralsInInterpolation:
111
- Description: Checks if uses of quotes inside expressions in interpolated strings
112
- match the configured preference.
113
179
  Enabled: true
114
180
  EnforcedStyle: single_quotes
115
181
  SupportedStyles:
116
182
  - single_quotes
117
183
  - double_quotes
118
184
  Style/TrailingCommaInArguments:
119
- Description: 'Checks for trailing comma in argument lists.'
120
- StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas'
121
- Enabled: false
122
- EnforcedStyleForMultiline: no_comma
123
- SupportedStyles:
124
- - comma
125
- - consistent_comma
126
- - no_comma
127
- Style/TrailingCommaInLiteral:
128
- Description: 'Checks for trailing comma in array and hash literals.'
129
- StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas'
130
185
  Enabled: false
131
186
  EnforcedStyleForMultiline: no_comma
132
- SupportedStyles:
133
- - comma
134
- - consistent_comma
135
- - no_comma
136
- Metrics/AbcSize:
137
- Description: A calculated magnitude based on number of assignments, branches, and
138
- conditions.
139
- Enabled: false
140
- Max: 15
141
- Metrics/ClassLength:
142
- Description: Avoid classes longer than 100 lines of code.
143
- Enabled: false
144
- CountComments: false
145
- Max: 100
146
- Metrics/LineLength:
147
- Description: Limit lines to max 140 characters
148
- Max: 140
149
- AllowHeredoc: true
150
- AllowURI: true
151
- URISchemes:
152
- - http
153
- - https
154
- Metrics/ModuleLength:
155
- CountComments: false
156
- Max: 100
157
- Description: Avoid modules longer than 100 lines of code.
158
- Enabled: false
159
- Metrics/CyclomaticComplexity:
160
- Description: A complexity metric that is strongly correlated to the number of test
161
- cases needed to validate a method.
162
- Enabled: false
163
- Max: 6
164
- Metrics/MethodLength:
165
- Description: Avoid methods longer than 10 lines of code.
166
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#short-methods
167
- Enabled: false
168
- CountComments: false
169
- Max: 10
170
- Metrics/ParameterLists:
171
- Description: Avoid parameter lists longer than three or four parameters.
172
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#too-many-params
173
- Enabled: false
174
- Max: 5
175
- CountKeywordArgs: true
176
- Metrics/PerceivedComplexity:
177
- Description: A complexity metric geared towards measuring complexity for a human
178
- reader.
179
- Enabled: false
180
- Max: 7
181
- Lint/AssignmentInCondition:
182
- Description: Don't use assignment in conditions.
183
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#safe-assignment-in-condition
184
- Enabled: false
185
- AllowSafeAssignment: true
186
- Style/InlineComment:
187
- Description: Avoid inline comments.
188
- Enabled: false
189
- Style/AccessorMethodName:
190
- Description: Check the naming of accessor methods for get_/set_.
191
- Enabled: false
192
- Style/Alias:
193
- Description: Use alias_method instead of alias.
194
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#alias-method
195
- Enabled: false
196
- Style/Documentation:
197
- Description: Document classes and non-namespace modules.
198
- Enabled: false
199
- Style/DoubleNegation:
200
- Description: Checks for uses of double negation (!!).
201
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-bang-bang
202
- Enabled: false
203
- Style/EachWithObject:
204
- Description: Prefer `each_with_object` over `inject` or `reduce`.
205
- Enabled: false
206
- Style/EmptyLiteral:
207
- Description: Prefer literals to Array.new/Hash.new/String.new.
208
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#literal-array-hash
209
- Enabled: false
210
- Style/ModuleFunction:
211
- Description: Checks for usage of `extend self` in modules.
212
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#module-function
213
- Enabled: false
214
- Style/OneLineConditional:
215
- Description: Favor the ternary operator(?:) over if/then/else/end constructs.
216
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#ternary-operator
217
- Enabled: false
218
- Style/PerlBackrefs:
219
- Description: Avoid Perl-style regex back references.
220
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-perl-regexp-last-matchers
221
- Enabled: false
222
- Style/Send:
223
- Description: Prefer `Object#__send__` or `Object#public_send` to `send`, as `send`
224
- may overlap with existing methods.
225
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#prefer-public-send
226
- Enabled: false
227
- Style/SpecialGlobalVars:
228
- Description: Avoid Perl-style global variables.
229
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-cryptic-perlisms
230
- Enabled: false
231
187
  Style/VariableInterpolation:
232
- Description: Don't interpolate global, instance and class variables directly in
233
- strings.
234
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#curlies-interpolate
235
188
  Enabled: false
236
189
  Style/WhenThen:
237
- Description: Use when x then ... for one-line cases.
238
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#one-line-cases
239
- Enabled: false
240
- Lint/EachWithObjectArgument:
241
- Description: Check for immutable argument given to each_with_object.
242
- Enabled: true
243
- Lint/HandleExceptions:
244
- Description: Don't suppress exception.
245
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#dont-hide-exceptions
246
- Enabled: false
247
- Lint/LiteralInCondition:
248
- Description: Checks of literals used in conditions.
249
- Enabled: false
250
- Lint/LiteralInInterpolation:
251
- Description: Checks for literals used in interpolation.
252
190
  Enabled: false
data/.travis.yml CHANGED
@@ -1,14 +1,22 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.2
4
- - 2.2.3
3
+ - 2.3.0
5
4
  - 2.3.1
6
5
  - 2.3.3
7
6
  - 2.4.0
7
+ - 2.5.0
8
8
  notifications:
9
9
  email: false
10
10
  sudo: false
11
11
  cache:
12
12
  bundler: true
13
13
  before_install:
14
- - gem update --system
14
+ - gem update --system
15
+ before_script:
16
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
17
+ - chmod +x ./cc-test-reporter
18
+ - ./cc-test-reporter before-build
19
+ script:
20
+ - bundle exec rspec
21
+ after_script:
22
+ - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
data/Gemfile CHANGED
@@ -3,3 +3,11 @@ source 'https://rubygems.org'
3
3
 
4
4
  # Specify your gem's dependencies in europeana.gemspec
5
5
  gemspec
6
+
7
+ group :test do
8
+ gem 'simplecov', require: false
9
+ end
10
+
11
+ group :test, :development do
12
+ gem 'rubocop', '~> 0.53', require: false
13
+ end
data/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # Europeana API
2
2
 
3
- [![Build Status](https://travis-ci.org/europeana/europeana-api-client-ruby.svg?branch=develop)](https://travis-ci.org/europeana/europeana-api-client-ruby) [![Coverage Status](https://coveralls.io/repos/europeana/europeana-api-client-ruby/badge.svg?branch=develop&service=github)](https://coveralls.io/github/europeana/europeana-api-client-ruby?branch=develop) [![security](https://hakiri.io/github/europeana/europeana-api-client-ruby/develop.svg)](https://hakiri.io/github/europeana/europeana-api-client-ruby/develop) [![Dependency Status](https://gemnasium.com/europeana/europeana-api-client-ruby.svg)](https://gemnasium.com/europeana/europeana-api-client-ruby)
3
+ [![Build Status](https://travis-ci.org/europeana/europeana-api-client-ruby.svg?branch=develop)](https://travis-ci.org/europeana/europeana-api-client-ruby) [![Security](https://hakiri.io/github/europeana/europeana-api-client-ruby/develop.svg)](https://hakiri.io/github/europeana/europeana-api-client-ruby/develop) [![Maintainability](https://api.codeclimate.com/v1/badges/ee765a461fd16730c02d/maintainability)](https://codeclimate.com/github/europeana/europeana-api-client-ruby/maintainability) [![Test Coverage](https://api.codeclimate.com/v1/badges/ee765a461fd16730c02d/test_coverage)](https://codeclimate.com/github/europeana/europeana-api-client-ruby/test_coverage)
4
4
 
5
5
  Ruby client library for the search and retrieval of records from the [Europeana
6
- REST API](http://labs.europeana.eu/api/introduction/).
6
+ REST APIs](https://pro.europeana.eu/resources/apis).
7
7
 
8
8
  ## Requirements
9
9
 
10
- * Ruby >= 2.2.2
10
+ * Ruby >= 2.3
11
11
 
12
12
  ## Installation
13
13
 
@@ -35,7 +35,7 @@ gem install europeana-api
35
35
 
36
36
  Authentication by API key is *required* for all requests to the Europeana API.
37
37
 
38
- Sign up for an API key at: http://labs.europeana.eu/api/registration/
38
+ Sign up for an API key at: https://pro.europeana.eu/get-api
39
39
 
40
40
  Configure your application with the API key:
41
41
 
@@ -66,7 +66,7 @@ search[:items] # => [ item1, item2, ... ]
66
66
  search[:totalResults] # => 81530
67
67
  ```
68
68
 
69
- See http://labs.europeana.eu/api/search/ for details of the available request
69
+ See https://pro.europeana.eu/resources/apis/search for details of the available request
70
70
  parameters, and of the data returned in the search response.
71
71
 
72
72
  #### Fetch
@@ -77,7 +77,7 @@ record[:object][:title] # => ["Panorama des Schafberges in Ober-Österreich. Bla
77
77
  record[:object][:proxies].first[:dcCreator][:def] # => ["Simony, Friedrich"]
78
78
  ```
79
79
 
80
- See http://labs.europeana.eu/api/record/ for details of the data returned in
80
+ See https://pro.europeana.eu/resources/apis/record for details of the data returned in
81
81
  the record response.
82
82
 
83
83
  #### Hierarchies
@@ -97,12 +97,9 @@ Europeana::API.record.following_siblings
97
97
  Europeana::API.record.ancestor_self_siblings
98
98
  ```
99
99
 
100
- See http://labs.europeana.eu/api/hierarchical-records for details of the various
101
- hierarchy methods and their responses.
102
-
103
100
  ### Annotations
104
101
 
105
- See http://labs.europeana.eu/api/annotations-methods for details of the responses
102
+ See https://pro.europeana.eu/resources/apis/annotations for details of the responses
106
103
  received from the Annotations API methods.
107
104
 
108
105
  #### Search
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.name = 'europeana-api'
9
9
  spec.version = Europeana::API::VERSION
10
10
  spec.authors = ['Richard Doe']
11
- spec.email = ['richard.doe@rwdit.net']
11
+ spec.email = %w(richard.doe@europeana.eu)
12
12
  spec.description = 'Search and retrieve records from the Europeana REST API'
13
13
  spec.summary = 'Ruby client library for the Europeana API'
14
14
  spec.homepage = 'https://github.com/europeana/europeana-api-client-ruby'
@@ -17,25 +17,24 @@ Gem::Specification.new do |spec|
17
17
  spec.files = `git ls-files`.split($RS)
18
18
  spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
19
19
  spec.test_files = spec.files.grep(/^(test|spec|features)\//)
20
- spec.require_paths = ['lib']
20
+ spec.require_paths = %w(lib)
21
21
 
22
- spec.required_ruby_version = '>= 2.0.0'
22
+ spec.required_ruby_version = '>= 2.3.0'
23
23
 
24
24
  spec.add_dependency 'activesupport', '>= 4.2', '< 6.0'
25
25
  # Locked to < v0.12.2 due to incompatibility with v0.12.2
26
26
  # TODO: resolve incompatibility and unlock
27
27
  spec.add_dependency 'faraday', '~> 0.9', '< 0.12.2'
28
28
  spec.add_dependency 'faraday_middleware'
29
+ spec.add_dependency 'iso-639', '~> 0.2.5'
29
30
  spec.add_dependency 'multi_json', '~> 1.0'
30
31
  spec.add_dependency 'rack', '> 1.6.2'
31
32
  spec.add_dependency 'typhoeus', '~> 1.1'
32
33
 
33
34
  spec.add_development_dependency 'bundler', '~> 1.3'
34
- spec.add_development_dependency 'coveralls'
35
35
  spec.add_development_dependency 'dotenv'
36
36
  spec.add_development_dependency 'rake'
37
37
  spec.add_development_dependency 'rspec', '~> 3.0'
38
- spec.add_development_dependency 'rubocop', '0.39.0' # only update when Hound does
39
38
  spec.add_development_dependency 'shoulda-matchers', '~> 3.1'
40
39
  spec.add_development_dependency 'webmock', '~> 1.18.0'
41
40
  end
@@ -8,6 +8,8 @@ module Europeana
8
8
  class Record
9
9
  include Resource
10
10
 
11
+ autoload :LangMap, 'europeana/api/record/lang_map'
12
+
11
13
  has_api_endpoint :search,
12
14
  path: '/v2/search.json',
13
15
  errors: {
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'iso-639'
4
+
5
+ module Europeana
6
+ module API
7
+ class Record
8
+ ##
9
+ # Methods for working with "LangMap" data types in Record API JSON responses
10
+ #
11
+ # @see https://pro.europeana.eu/resources/apis/search#json-langmap
12
+ module LangMap
13
+ # @see https://www.loc.gov/standards/iso639-2/php/code_changes.php
14
+ DEPRECATED_ISO_LANG_CODES = %w(in iw jaw ji jw mo mol scc scr sh)
15
+
16
+ # Special keys API may return in a LangMap, not ISO codes
17
+ # TODO: Empty key acceptance is a workaround for malformed API data
18
+ # output; remove when fixed at source
19
+ NON_ISO_LANG_CODES = ['def', '']
20
+
21
+ class << self
22
+ # Is the argument a language map?
23
+ #
24
+ # Critera:
25
+ # * Must be a +Hash+.
26
+ # * Must have only keys which are known language codes
27
+ #
28
+ # @param candidate [Object] Object to check
29
+ # @return [Boolean]
30
+ def lang_map?(candidate)
31
+ return false unless candidate.is_a?(Hash)
32
+ candidate.keys.map(&:to_s).all? { |key| known_lang_map_key?(key) }
33
+ end
34
+
35
+ # Is the argument a known language map key?
36
+ #
37
+ # @param key [String] String to check
38
+ # @return [Boolean]
39
+ def known_lang_map_key?(key)
40
+ key = key.dup.downcase
41
+ DEPRECATED_ISO_LANG_CODES.include?(key) ||
42
+ NON_ISO_LANG_CODES.include?(key) ||
43
+ !ISO_639.find(key.split('-').first).nil?
44
+ end
45
+
46
+ # Localise a language map
47
+ #
48
+ # 1. If the argument is not a language map, return as-is
49
+ # 2. If the language map has a key for the current locale, return that
50
+ # value
51
+ # 3. If the language map has a key for the default locale, return that
52
+ # value
53
+ # 4. Else, return all values
54
+ #
55
+ # Arrays will be recursed over, localising each element.
56
+ #
57
+ # @param lang_map [Object] Object to attempt to localise
58
+ # @return [Object,Array<Object>] Localised value
59
+ def localise_lang_map(lang_map)
60
+ if lang_map.is_a?(Array)
61
+ return lang_map.map { |val| localise_lang_map(val) }
62
+ end
63
+
64
+ return lang_map unless lang_map?(lang_map)
65
+
66
+ lang_map_value(lang_map, ::I18n.locale.to_s) ||
67
+ lang_map_value(lang_map, ::I18n.default_locale.to_s) ||
68
+ lang_map_value(lang_map, 'def') ||
69
+ lang_map.values
70
+ end
71
+
72
+ # Fetch the language map value for a given locale
73
+ #
74
+ # @param lang_map [Hash] Verified language map
75
+ # @param locale [String] Locale to fetch the value for
76
+ # @return [Array<Object>,nil] Array of value(s) for the given locale,
77
+ # or nil if none are present
78
+ def lang_map_value(lang_map, locale)
79
+ keys = salient_lang_map_keys(lang_map, locale)
80
+ return nil unless keys.present?
81
+ keys.map { |k| lang_map[k] }.flatten.uniq
82
+ end
83
+
84
+ protected
85
+
86
+ # @return [Array<String>] valid keys in the language map for the given locale
87
+ def salient_lang_map_keys(lang_map, locale)
88
+ iso_code = locale.split('-').first
89
+ iso_locale = ISO_639.find(iso_code)
90
+
91
+ # Favour exact matches
92
+ keys = lang_map.keys.select do |k|
93
+ [locale, iso_locale&.alpha2, iso_locale&.alpha3].include?(k)
94
+ end.flatten.compact
95
+ return keys unless keys.blank?
96
+
97
+ # Any sub-code will do
98
+ lang_map.keys.select do |k|
99
+ k =~ %r{\A#{iso_code}-}
100
+ end.flatten.compact
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Europeana
3
4
  ##
4
5
  # Sets the *gem* version (not the *API* version)
5
6
  module API
6
- VERSION = '1.0.0'
7
+ VERSION = '1.1.0'
7
8
  end
8
9
  end
@@ -0,0 +1,108 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Europeana::API::Record::LangMap do
4
+ before do
5
+ I18n.config.available_locales = %i(de en fr nl)
6
+ end
7
+ let(:lang_map_hash) do
8
+ { 'def' => 'this', 'en' => 'this', 'fr' => 'ce' }
9
+ end
10
+ let(:non_lang_map_hash) do
11
+ { 'first' => 'this', 'then' => 'that' }
12
+ end
13
+
14
+ describe '.lang_map?' do
15
+ subject { described_class.lang_map?(var) }
16
+
17
+ context 'when not a Hash' do
18
+ let(:var) { [] }
19
+ it { is_expected.to be false }
20
+ end
21
+
22
+ context 'when a Hash' do
23
+ context 'with non-language code keys' do
24
+ let(:var) { non_lang_map_hash }
25
+ it { is_expected.to be false }
26
+ end
27
+
28
+ context 'with language code keys' do
29
+ let(:var) { lang_map_hash }
30
+ it { is_expected.to be true }
31
+ end
32
+ end
33
+ end
34
+
35
+ describe '.localise_lang_map' do
36
+ subject { described_class.localise_lang_map(var) }
37
+
38
+ context 'when an Array' do
39
+ let(:var) { [lang_map_hash, lang_map_hash] }
40
+ before do
41
+ I18n.locale = :fr
42
+ end
43
+
44
+ it 'localises each element' do
45
+ expect(subject).to eq([[lang_map_hash['fr']], [lang_map_hash['fr']]])
46
+ end
47
+ end
48
+
49
+ context 'when not an Array' do
50
+ context 'when a language map' do
51
+ let(:var) { lang_map_hash }
52
+ context 'when current locale is present' do
53
+ before do
54
+ I18n.locale = :fr
55
+ end
56
+
57
+ it 'is returned in array' do
58
+ expect(subject).to eq([var['fr']])
59
+ end
60
+ end
61
+
62
+ context 'when current locale is not present' do
63
+ before do
64
+ I18n.locale = :de
65
+ end
66
+
67
+ context 'when default locale is present' do
68
+ before do
69
+ I18n.default_locale = :en
70
+ end
71
+
72
+ it 'is returned in array' do
73
+ expect(subject).to eq([var['en']])
74
+ end
75
+ end
76
+
77
+ context 'when default locale is not present' do
78
+ before do
79
+ I18n.default_locale = :nl
80
+ end
81
+
82
+ context 'when "def" is present' do
83
+ it 'is returned in array' do
84
+ expect(subject).to eq([var['def']])
85
+ end
86
+ end
87
+
88
+ context 'when "def" is not present' do
89
+ before do
90
+ lang_map_hash.delete('def')
91
+ end
92
+ it 'returns all values' do
93
+ expect(subject).to eq(var.values)
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+
100
+ context 'when not a language map' do
101
+ let(:var) { non_lang_map_hash }
102
+ it 'returns the argument' do
103
+ expect(subject).to eq(var)
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,13 +1,15 @@
1
1
  # frozen_string_literal: true
2
- require 'coveralls'
2
+
3
+ # Generate Simplecov report
4
+ require 'simplecov'
5
+ SimpleCov.start
6
+
3
7
  require 'europeana/api'
4
8
  require 'shoulda/matchers'
5
9
  require 'webmock/rspec'
6
10
 
7
11
  Dir['./spec/support/**/*.rb'].each { |f| require f }
8
12
 
9
- Coveralls.wear! unless Coveralls.will_run?.nil?
10
-
11
13
  Europeana::API.logger.level = Logger::ERROR
12
14
 
13
15
  RSpec.configure do |config|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: europeana-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Doe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-26 00:00:00.000000000 Z
11
+ date: 2018-07-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -64,6 +64,20 @@ dependencies:
64
64
  - - ">="
65
65
  - !ruby/object:Gem::Version
66
66
  version: '0'
67
+ - !ruby/object:Gem::Dependency
68
+ name: iso-639
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: 0.2.5
74
+ type: :runtime
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: 0.2.5
67
81
  - !ruby/object:Gem::Dependency
68
82
  name: multi_json
69
83
  requirement: !ruby/object:Gem::Requirement
@@ -120,20 +134,6 @@ dependencies:
120
134
  - - "~>"
121
135
  - !ruby/object:Gem::Version
122
136
  version: '1.3'
123
- - !ruby/object:Gem::Dependency
124
- name: coveralls
125
- requirement: !ruby/object:Gem::Requirement
126
- requirements:
127
- - - ">="
128
- - !ruby/object:Gem::Version
129
- version: '0'
130
- type: :development
131
- prerelease: false
132
- version_requirements: !ruby/object:Gem::Requirement
133
- requirements:
134
- - - ">="
135
- - !ruby/object:Gem::Version
136
- version: '0'
137
137
  - !ruby/object:Gem::Dependency
138
138
  name: dotenv
139
139
  requirement: !ruby/object:Gem::Requirement
@@ -176,20 +176,6 @@ dependencies:
176
176
  - - "~>"
177
177
  - !ruby/object:Gem::Version
178
178
  version: '3.0'
179
- - !ruby/object:Gem::Dependency
180
- name: rubocop
181
- requirement: !ruby/object:Gem::Requirement
182
- requirements:
183
- - - '='
184
- - !ruby/object:Gem::Version
185
- version: 0.39.0
186
- type: :development
187
- prerelease: false
188
- version_requirements: !ruby/object:Gem::Requirement
189
- requirements:
190
- - - '='
191
- - !ruby/object:Gem::Version
192
- version: 0.39.0
193
179
  - !ruby/object:Gem::Dependency
194
180
  name: shoulda-matchers
195
181
  requirement: !ruby/object:Gem::Requirement
@@ -220,14 +206,14 @@ dependencies:
220
206
  version: 1.18.0
221
207
  description: Search and retrieve records from the Europeana REST API
222
208
  email:
223
- - richard.doe@rwdit.net
209
+ - richard.doe@europeana.eu
224
210
  executables:
225
211
  - console
226
212
  extensions: []
227
213
  extra_rdoc_files: []
228
214
  files:
215
+ - ".codeclimate.yml"
229
216
  - ".gitignore"
230
- - ".hound.yml"
231
217
  - ".rspec"
232
218
  - ".rubocop.yml"
233
219
  - ".ruby-style.yml"
@@ -251,6 +237,7 @@ files:
251
237
  - lib/europeana/api/logger.rb
252
238
  - lib/europeana/api/queue.rb
253
239
  - lib/europeana/api/record.rb
240
+ - lib/europeana/api/record/lang_map.rb
254
241
  - lib/europeana/api/request.rb
255
242
  - lib/europeana/api/resource.rb
256
243
  - lib/europeana/api/response.rb
@@ -260,6 +247,7 @@ files:
260
247
  - spec/europeana/api/entity_spec.rb
261
248
  - spec/europeana/api/faraday_middleware/request/authenticated_request_spec.rb
262
249
  - spec/europeana/api/queue_spec.rb
250
+ - spec/europeana/api/record/lang_map_spec.rb
263
251
  - spec/europeana/api/record_spec.rb
264
252
  - spec/europeana/api/request_spec.rb
265
253
  - spec/europeana/api/resource_spec.rb
@@ -279,7 +267,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
279
267
  requirements:
280
268
  - - ">="
281
269
  - !ruby/object:Gem::Version
282
- version: 2.0.0
270
+ version: 2.3.0
283
271
  required_rubygems_version: !ruby/object:Gem::Requirement
284
272
  requirements:
285
273
  - - ">="
@@ -287,7 +275,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
287
275
  version: '0'
288
276
  requirements: []
289
277
  rubyforge_project:
290
- rubygems_version: 2.6.12
278
+ rubygems_version: 2.7.3
291
279
  signing_key:
292
280
  specification_version: 4
293
281
  summary: Ruby client library for the Europeana API
@@ -297,6 +285,7 @@ test_files:
297
285
  - spec/europeana/api/entity_spec.rb
298
286
  - spec/europeana/api/faraday_middleware/request/authenticated_request_spec.rb
299
287
  - spec/europeana/api/queue_spec.rb
288
+ - spec/europeana/api/record/lang_map_spec.rb
300
289
  - spec/europeana/api/record_spec.rb
301
290
  - spec/europeana/api/request_spec.rb
302
291
  - spec/europeana/api/resource_spec.rb
data/.hound.yml DELETED
@@ -1,10 +0,0 @@
1
- coffeescript:
2
- enabled: false
3
- haml:
4
- enabled: false
5
- javascript:
6
- enabled: false
7
- ruby:
8
- config_file: .ruby-style.yml
9
- scss:
10
- enabled: false