metal_archives 3.0.1 → 3.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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +59 -12
  3. data/.rspec +1 -0
  4. data/.rubocop.yml +34 -20
  5. data/CHANGELOG.md +4 -0
  6. data/LICENSE.md +17 -4
  7. data/README.md +29 -14
  8. data/bin/console +8 -11
  9. data/config/inflections.rb +7 -0
  10. data/config/initializers/.keep +0 -0
  11. data/docker-compose.yml +10 -1
  12. data/lib/metal_archives.rb +56 -22
  13. data/lib/metal_archives/cache/base.rb +40 -0
  14. data/lib/metal_archives/cache/memory.rb +68 -0
  15. data/lib/metal_archives/cache/null.rb +22 -0
  16. data/lib/metal_archives/cache/redis.rb +49 -0
  17. data/lib/metal_archives/collection.rb +3 -5
  18. data/lib/metal_archives/configuration.rb +28 -21
  19. data/lib/metal_archives/errors.rb +9 -1
  20. data/lib/metal_archives/http_client.rb +42 -46
  21. data/lib/metal_archives/models/artist.rb +55 -26
  22. data/lib/metal_archives/models/band.rb +43 -36
  23. data/lib/metal_archives/models/{base_model.rb → base.rb} +53 -53
  24. data/lib/metal_archives/models/label.rb +7 -8
  25. data/lib/metal_archives/models/release.rb +11 -17
  26. data/lib/metal_archives/parsers/artist.rb +40 -35
  27. data/lib/metal_archives/parsers/band.rb +73 -29
  28. data/lib/metal_archives/parsers/base.rb +14 -0
  29. data/lib/metal_archives/parsers/country.rb +21 -0
  30. data/lib/metal_archives/parsers/date.rb +31 -0
  31. data/lib/metal_archives/parsers/genre.rb +67 -0
  32. data/lib/metal_archives/parsers/label.rb +21 -13
  33. data/lib/metal_archives/parsers/parser.rb +15 -77
  34. data/lib/metal_archives/parsers/release.rb +22 -18
  35. data/lib/metal_archives/parsers/year.rb +29 -0
  36. data/lib/metal_archives/version.rb +3 -3
  37. data/metal_archives.env.example +7 -4
  38. data/metal_archives.gemspec +7 -4
  39. data/nginx/default.conf +2 -2
  40. metadata +76 -32
  41. data/.github/workflows/release.yml +0 -69
  42. data/.rubocop_todo.yml +0 -92
  43. data/lib/metal_archives/lru_cache.rb +0 -61
  44. data/lib/metal_archives/middleware/cache_check.rb +0 -18
  45. data/lib/metal_archives/middleware/encoding.rb +0 -16
  46. data/lib/metal_archives/middleware/headers.rb +0 -38
  47. data/lib/metal_archives/middleware/rewrite_endpoint.rb +0 -38
  48. data/lib/metal_archives/nil_date.rb +0 -91
  49. data/lib/metal_archives/range.rb +0 -69
@@ -10,9 +10,9 @@ Gem::Specification.new do |spec|
10
10
 
11
11
  spec.summary = "Metal Archives Ruby API"
12
12
  spec.description = "Ruby API layer that transparently queries, scrapes and caches Metal Archives' website"
13
- spec.homepage = "http://github.com/floriandejonckheere/metal_archives"
13
+ spec.homepage = "https://github.com/floriandejonckheere/metal_archives"
14
14
  spec.license = "MIT"
15
- spec.required_ruby_version = Gem::Requirement.new(">= 2.5.8")
15
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.6")
16
16
 
17
17
  spec.metadata["source_code_uri"] = "https://github.com/floriandejonckheere/metal_archives"
18
18
 
@@ -26,8 +26,7 @@ Gem::Specification.new do |spec|
26
26
  spec.require_paths = ["lib"]
27
27
 
28
28
  spec.add_runtime_dependency "countries"
29
- spec.add_runtime_dependency "faraday"
30
- spec.add_runtime_dependency "faraday_throttler"
29
+ spec.add_runtime_dependency "http"
31
30
  spec.add_runtime_dependency "nokogiri"
32
31
  spec.add_runtime_dependency "zeitwerk"
33
32
 
@@ -41,8 +40,12 @@ Gem::Specification.new do |spec|
41
40
  spec.add_development_dependency "pronto"
42
41
  spec.add_development_dependency "rake"
43
42
  spec.add_development_dependency "rdoc"
43
+ spec.add_development_dependency "redis"
44
44
  spec.add_development_dependency "reek"
45
45
  spec.add_development_dependency "rspec"
46
46
  spec.add_development_dependency "rubocop"
47
+ spec.add_development_dependency "rubocop-performance"
48
+ spec.add_development_dependency "rubocop-rspec"
49
+ spec.add_development_dependency "timecop"
47
50
  spec.add_development_dependency "webmock"
48
51
  end
data/nginx/default.conf CHANGED
@@ -26,8 +26,8 @@ server {
26
26
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
27
27
  proxy_set_header X-Real-IP $remote_addr;
28
28
 
29
- proxy_ssl_certificate /etc/nginx/auth.d/client.pem;
30
- proxy_ssl_certificate_key /etc/nginx/auth.d/client.key;
29
+ proxy_ssl_certificate /etc/nginx/conf.d/client.pem;
30
+ proxy_ssl_certificate_key /etc/nginx/conf.d/client.key;
31
31
  proxy_ssl_server_name on;
32
32
  proxy_ssl_session_reuse on;
33
33
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metal_archives
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Dejonckheere
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-17 00:00:00.000000000 Z
11
+ date: 2021-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: countries
@@ -25,21 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: faraday
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: faraday_throttler
28
+ name: http
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
31
  - - ">="
@@ -220,6 +206,20 @@ dependencies:
220
206
  - - ">="
221
207
  - !ruby/object:Gem::Version
222
208
  version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: redis
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
223
  - !ruby/object:Gem::Dependency
224
224
  name: reek
225
225
  requirement: !ruby/object:Gem::Requirement
@@ -262,6 +262,48 @@ dependencies:
262
262
  - - ">="
263
263
  - !ruby/object:Gem::Version
264
264
  version: '0'
265
+ - !ruby/object:Gem::Dependency
266
+ name: rubocop-performance
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - ">="
270
+ - !ruby/object:Gem::Version
271
+ version: '0'
272
+ type: :development
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - ">="
277
+ - !ruby/object:Gem::Version
278
+ version: '0'
279
+ - !ruby/object:Gem::Dependency
280
+ name: rubocop-rspec
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - ">="
284
+ - !ruby/object:Gem::Version
285
+ version: '0'
286
+ type: :development
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - ">="
291
+ - !ruby/object:Gem::Version
292
+ version: '0'
293
+ - !ruby/object:Gem::Dependency
294
+ name: timecop
295
+ requirement: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - ">="
298
+ - !ruby/object:Gem::Version
299
+ version: '0'
300
+ type: :development
301
+ prerelease: false
302
+ version_requirements: !ruby/object:Gem::Requirement
303
+ requirements:
304
+ - - ">="
305
+ - !ruby/object:Gem::Version
306
+ version: '0'
265
307
  - !ruby/object:Gem::Dependency
266
308
  name: webmock
267
309
  requirement: !ruby/object:Gem::Requirement
@@ -287,12 +329,10 @@ extensions: []
287
329
  extra_rdoc_files: []
288
330
  files:
289
331
  - ".github/workflows/ci.yml"
290
- - ".github/workflows/release.yml"
291
332
  - ".gitignore"
292
333
  - ".overcommit.yml"
293
334
  - ".rspec"
294
335
  - ".rubocop.yml"
295
- - ".rubocop_todo.yml"
296
336
  - CHANGELOG.md
297
337
  - Gemfile
298
338
  - LICENSE.md
@@ -300,40 +340,44 @@ files:
300
340
  - Rakefile
301
341
  - bin/console
302
342
  - bin/setup
343
+ - config/inflections.rb
344
+ - config/initializers/.keep
303
345
  - docker-compose.yml
304
346
  - lib/metal_archives.rb
347
+ - lib/metal_archives/cache/base.rb
348
+ - lib/metal_archives/cache/memory.rb
349
+ - lib/metal_archives/cache/null.rb
350
+ - lib/metal_archives/cache/redis.rb
305
351
  - lib/metal_archives/collection.rb
306
352
  - lib/metal_archives/configuration.rb
307
353
  - lib/metal_archives/errors.rb
308
354
  - lib/metal_archives/http_client.rb
309
- - lib/metal_archives/lru_cache.rb
310
- - lib/metal_archives/middleware/cache_check.rb
311
- - lib/metal_archives/middleware/encoding.rb
312
- - lib/metal_archives/middleware/headers.rb
313
- - lib/metal_archives/middleware/rewrite_endpoint.rb
314
355
  - lib/metal_archives/models/artist.rb
315
356
  - lib/metal_archives/models/band.rb
316
- - lib/metal_archives/models/base_model.rb
357
+ - lib/metal_archives/models/base.rb
317
358
  - lib/metal_archives/models/label.rb
318
359
  - lib/metal_archives/models/release.rb
319
- - lib/metal_archives/nil_date.rb
320
360
  - lib/metal_archives/parsers/artist.rb
321
361
  - lib/metal_archives/parsers/band.rb
362
+ - lib/metal_archives/parsers/base.rb
363
+ - lib/metal_archives/parsers/country.rb
364
+ - lib/metal_archives/parsers/date.rb
365
+ - lib/metal_archives/parsers/genre.rb
322
366
  - lib/metal_archives/parsers/label.rb
323
367
  - lib/metal_archives/parsers/parser.rb
324
368
  - lib/metal_archives/parsers/release.rb
325
- - lib/metal_archives/range.rb
369
+ - lib/metal_archives/parsers/year.rb
326
370
  - lib/metal_archives/version.rb
327
371
  - metal_archives.env.example
328
372
  - metal_archives.gemspec
329
373
  - nginx/default.conf
330
374
  - publish.sh
331
- homepage: http://github.com/floriandejonckheere/metal_archives
375
+ homepage: https://github.com/floriandejonckheere/metal_archives
332
376
  licenses:
333
377
  - MIT
334
378
  metadata:
335
379
  source_code_uri: https://github.com/floriandejonckheere/metal_archives
336
- post_install_message:
380
+ post_install_message:
337
381
  rdoc_options: []
338
382
  require_paths:
339
383
  - lib
@@ -341,7 +385,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
341
385
  requirements:
342
386
  - - ">="
343
387
  - !ruby/object:Gem::Version
344
- version: 2.5.8
388
+ version: '2.6'
345
389
  required_rubygems_version: !ruby/object:Gem::Requirement
346
390
  requirements:
347
391
  - - ">="
@@ -349,7 +393,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
349
393
  version: '0'
350
394
  requirements: []
351
395
  rubygems_version: 3.1.2
352
- signing_key:
396
+ signing_key:
353
397
  specification_version: 4
354
398
  summary: Metal Archives Ruby API
355
399
  test_files: []
@@ -1,69 +0,0 @@
1
- name: Create release
2
-
3
- on:
4
- push:
5
- tags:
6
- - 'v*'
7
-
8
- jobs:
9
- generate:
10
- name: Create release
11
- runs-on: ubuntu-latest
12
- steps:
13
- - uses: actions/checkout@v1
14
-
15
- - name: Setup Ruby
16
- uses: actions/setup-ruby@v1
17
- with:
18
- ruby-version: 2.7.x
19
-
20
- - name: Cache Gems
21
- uses: actions/cache@v1
22
- with:
23
- path: vendor/bundle
24
- key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile') }}
25
- restore-keys: |
26
- ${{ runner.os }}-gem-
27
-
28
- - name: Install Gems
29
- run: |
30
- gem install bundler
31
- bundle config path vendor/bundle
32
- bundle install --jobs 4 --retry 3
33
-
34
- - name: Test
35
- env:
36
- MA_ENDPOINT: ${{ secrets.MA_ENDPOINT }}
37
- MA_ENDPOINT_USER: ${{ secrets.MA_ENDPOINT_USER }}
38
- MA_ENDPOINT_PASSWORD: ${{ secrets.MA_ENDPOINT_PASSWORD }}
39
- WEBMOCK_ALLOW_HOST: ${{ secrets.WEBMOCK_ALLOW_HOST }}
40
- run: bundle exec rspec --profile 10 --format progress
41
-
42
- - name: Lint
43
- run: bundle exec rubocop --parallel --display-cop-names
44
-
45
- - name: Get the version
46
- id: get_version
47
- run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//}
48
-
49
- - name: Publish to RubyGems
50
- run: |
51
- mkdir -p ~/.gem
52
- touch ~/.gem/credentials
53
- chmod 0600 ~/.gem/credentials
54
- printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > ~/.gem/credentials
55
- gem build *.gemspec
56
- gem push *.gem
57
- env:
58
- GEM_HOST_API_KEY: ${{secrets.RUBYGEMS_API_KEY}}
59
-
60
- - name: Create Release
61
- uses: actions/create-release@v1.0.0
62
- env:
63
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
64
- with:
65
- tag_name: ${{ github.ref }}
66
- release_name: ${{ github.ref }}
67
- body: |
68
- Gem is available as: ${{ github.event.repository.name }}-${{ steps.get_version.outputs.VERSION }}
69
- Created by Github Actions
data/.rubocop_todo.yml DELETED
@@ -1,92 +0,0 @@
1
- # This configuration was generated by
2
- # `rubocop --auto-gen-config`
3
- # on 2020-04-14 17:51:42 +0200 using RuboCop version 0.80.1.
4
- # The point is for the user to remove these configuration records
5
- # one by one as the offenses are removed from the code base.
6
- # Note that changes in the inspected code, or installation of new
7
- # versions of RuboCop, may require this file to be generated again.
8
-
9
- # Offense count: 1
10
- Lint/AmbiguousRegexpLiteral:
11
- Exclude:
12
- - 'lib/metal_archives/parsers/artist.rb'
13
-
14
- # Offense count: 2
15
- Lint/EmptyWhen:
16
- Exclude:
17
- - 'lib/metal_archives/parsers/label.rb'
18
- - 'lib/metal_archives/parsers/release.rb'
19
-
20
- # Offense count: 2
21
- # Configuration parameters: AllowKeywordBlockArguments.
22
- Lint/UnderscorePrefixedVariableName:
23
- Exclude:
24
- - 'lib/metal_archives/range.rb'
25
-
26
- # Offense count: 6
27
- Lint/UselessAssignment:
28
- Exclude:
29
- - 'lib/metal_archives/parsers/artist.rb'
30
- - 'lib/metal_archives/parsers/band.rb'
31
- - 'lib/metal_archives/parsers/label.rb'
32
- - 'lib/metal_archives/parsers/release.rb'
33
- - 'spec/collection_spec.rb'
34
-
35
- # Offense count: 29
36
- Metrics/AbcSize:
37
- Max: 102
38
-
39
- # Offense count: 9
40
- # Configuration parameters: CountComments, ExcludedMethods.
41
- # ExcludedMethods: refine
42
- Metrics/BlockLength:
43
- Max: 42
44
-
45
- # Offense count: 3
46
- # Configuration parameters: CountComments.
47
- Metrics/ClassLength:
48
- Max: 147
49
-
50
- # Offense count: 12
51
- Metrics/CyclomaticComplexity:
52
- Max: 17
53
-
54
- # Offense count: 12
55
- Metrics/PerceivedComplexity:
56
- Max: 18
57
-
58
- # Offense count: 1
59
- Naming/BinaryOperatorParameterName:
60
- Exclude:
61
- - 'lib/metal_archives/models/base_model.rb'
62
-
63
- # Offense count: 1
64
- # Configuration parameters: EnforcedStyleForLeadingUnderscores.
65
- # SupportedStylesForLeadingUnderscores: disallowed, required, optional
66
- Naming/MemoizedInstanceVariableName:
67
- Exclude:
68
- - 'lib/metal_archives/http_client.rb'
69
-
70
- # Offense count: 9
71
- # Cop supports --auto-correct.
72
- Style/IfUnlessModifier:
73
- Exclude:
74
- - 'lib/metal_archives.rb'
75
- - 'lib/metal_archives/middleware/cache_check.rb'
76
- - 'lib/metal_archives/models/base_model.rb'
77
-
78
- # Offense count: 5
79
- # Cop supports --auto-correct.
80
- # Configuration parameters: AutoCorrect, EnforcedStyle, IgnoredMethods.
81
- # SupportedStyles: predicate, comparison
82
- Style/NumericPredicate:
83
- Exclude:
84
- - 'spec/**/*'
85
- - 'lib/metal_archives/nil_date.rb'
86
-
87
- # Offense count: 307
88
- # Cop supports --auto-correct.
89
- # Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
90
- # URISchemes: http, https
91
- Layout/LineLength:
92
- Max: 963
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module MetalArchives
4
- ##
5
- # Generic LRU memory cache
6
- #
7
- class LRUCache
8
- def initialize(size = 100)
9
- @size = size
10
-
11
- # Underlying data store
12
- @cache = {}
13
-
14
- # Array of keys in order of insertion
15
- @keys = []
16
- end
17
-
18
- def []=(key, value)
19
- @cache[key] = value
20
-
21
- @keys.delete key if @keys.include? key
22
-
23
- @keys << key
24
-
25
- pop if @keys.size > @size
26
- end
27
-
28
- def [](key)
29
- if @keys.include? key
30
- MetalArchives.config.logger.debug "Cache hit for #{key}"
31
- @keys.delete key
32
- @keys << key
33
- else
34
- MetalArchives.config.logger.debug "Cache miss for #{key}"
35
- end
36
-
37
- @cache[key]
38
- end
39
-
40
- def clear
41
- @cache.clear
42
- @keys.clear
43
- end
44
-
45
- def include?(key)
46
- @cache.include? key
47
- end
48
-
49
- def delete(key)
50
- @cache.delete key
51
- end
52
-
53
- private
54
-
55
- def pop
56
- to_remove = @keys.shift @keys.size - @size
57
-
58
- to_remove.each { |key| @cache.delete key }
59
- end
60
- end
61
- end