metal_archives 2.2.3 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
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 +16 -1
  6. data/LICENSE.md +17 -4
  7. data/README.md +37 -29
  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 +57 -21
  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} +57 -50
  24. data/lib/metal_archives/models/label.rb +7 -8
  25. data/lib/metal_archives/models/release.rb +21 -18
  26. data/lib/metal_archives/parsers/artist.rb +41 -36
  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 +17 -77
  34. data/lib/metal_archives/parsers/release.rb +29 -18
  35. data/lib/metal_archives/parsers/year.rb +31 -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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa109d3fe5566a0b824be6a2dd5842aa74c23a46696ed296e2dc6eda07d98fd9
4
- data.tar.gz: 461d4cdbaa1fb598d17a44940123346bbea4bb263ac30800aafaf301acb10ae0
3
+ metadata.gz: 2c000d091859fb144ab19500353d4901a3cb2aa2e10962e5a138a12e40c5eb11
4
+ data.tar.gz: cf9428989c5b8c3f5b36169219fbb62632703a797df2c31bf041ed8dd7e053ad
5
5
  SHA512:
6
- metadata.gz: 0ad284631c8d240be0de4326f19e837e68d32c8dc812fbb399b61a3b138aa1fc0fc114b1a6b1d476d27ca8e6cf37161d9290ed6f967a52d6bc82398c075b4aaa
7
- data.tar.gz: 1b3b611ee16a1f2397d0fa1e0cc5b1ae2e66346d4ddcb5ed3c3be64bf4de0393912895de92e979aa1d484badb904d534a68545443af21fd022dcf0c96c0ff7b1
6
+ metadata.gz: 56d38a266d6d882b9df4fe4a2efb0d2d9cf9a7f473a19d0bf3ff360a1967edd566c1f49f98a58e58cfcd2d245e856dd28b9fdc3d9bca6f283d253e752c99778e
7
+ data.tar.gz: a0db17d07d3703743247ed7c59dffcdbefa7686f7d50b8af4f3b6ff9d3fcc640a25208253125ad94784f9b6755298dade393a7a435fac24a8797dcf5d85ff25f
@@ -1,32 +1,44 @@
1
- name: CI
1
+ name: Continuous Integration
2
2
 
3
3
  on:
4
4
  push:
5
- tags-ignore:
6
- - '*'
7
5
  branches:
8
6
  - '*'
7
+ tags:
8
+ - '*'
9
+ schedule:
10
+ - cron: '0 7 * * 1'
9
11
 
10
12
  jobs:
11
13
  build:
12
14
  name: Continuous Integration
13
- runs-on: ubuntu-latest
15
+ runs-on: ubuntu-20.04
16
+ strategy:
17
+ matrix:
18
+ ruby: [ "2.6", "2.7", "3.0" ]
19
+
20
+ container:
21
+ image: ruby:3.0-alpine
22
+
23
+ services:
24
+ redis:
25
+ image: redis:alpine
14
26
 
15
27
  steps:
16
- - uses: actions/checkout@v1
28
+ - uses: actions/checkout@v2
17
29
 
18
- - name: Setup Ruby
19
- uses: actions/setup-ruby@v1
20
- with:
21
- ruby-version: 2.7.x
30
+ - name: Install dependencies
31
+ run: |
32
+ apk add build-base git cmake openssl-dev
33
+ apk add tar
22
34
 
23
35
  - name: Cache Gems
24
- uses: actions/cache@v1
36
+ uses: actions/cache@v2.1.3
25
37
  with:
26
38
  path: vendor/bundle
27
- key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile') }}
39
+ key: ${{ runner.os }}-${{ matrix.ruby }}-gem-${{ hashFiles('**/Gemfile.lock') }}
28
40
  restore-keys: |
29
- ${{ runner.os }}-gem-
41
+ ${{ runner.os }}-${{ matrix.ruby }}-gem-
30
42
 
31
43
  - name: Install Gems
32
44
  run: |
@@ -40,7 +52,42 @@ jobs:
40
52
  MA_ENDPOINT_USER: ${{ secrets.MA_ENDPOINT_USER }}
41
53
  MA_ENDPOINT_PASSWORD: ${{ secrets.MA_ENDPOINT_PASSWORD }}
42
54
  WEBMOCK_ALLOW_HOST: ${{ secrets.WEBMOCK_ALLOW_HOST }}
55
+ REDIS_URL: "redis://redis:6379/"
43
56
  run: bundle exec rspec --profile 10 --format progress
44
57
 
45
58
  - name: Lint
46
59
  run: bundle exec rubocop --parallel --display-cop-names
60
+
61
+ release:
62
+ name: Release application
63
+ if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
64
+ runs-on: ubuntu-20.04
65
+ needs: build
66
+
67
+ steps:
68
+ - uses: actions/checkout@v2
69
+
70
+ - name: Set version
71
+ run: |
72
+ echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV
73
+
74
+ - name: Publish to RubyGems
75
+ run: |
76
+ mkdir -p ~/.gem
77
+ touch ~/.gem/credentials
78
+ chmod 0600 ~/.gem/credentials
79
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > ~/.gem/credentials
80
+ gem build *.gemspec
81
+ gem push *.gem
82
+ env:
83
+ GEM_HOST_API_KEY: ${{secrets.RUBYGEMS_API_KEY}}
84
+
85
+ - name: Create Github Release
86
+ uses: actions/create-release@v1
87
+ env:
88
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
89
+ with:
90
+ tag_name: ${{ github.ref }}
91
+ release_name: ${{ github.ref }}
92
+ body: |
93
+ Gem ${{ github.event.repository.name }} ${{ env.VERSION }} was released
data/.rspec CHANGED
@@ -1,2 +1,3 @@
1
+ --color
1
2
  --fail-fast
2
3
  --require spec_helper
data/.rubocop.yml CHANGED
@@ -1,7 +1,13 @@
1
- inherit_from: .rubocop_todo.yml
1
+ require:
2
+ - rubocop-performance
3
+ - rubocop-rspec
2
4
 
3
5
  AllCops:
4
- TargetRubyVersion: 2.7
6
+ NewCops: enable
7
+ TargetRubyVersion: 2.6
8
+
9
+ Layout/LineLength:
10
+ Enabled: false
5
11
 
6
12
  Layout/MultilineMethodCallIndentation:
7
13
  EnforcedStyle: indented
@@ -15,26 +21,35 @@ Lint/AssignmentInCondition:
15
21
  Lint/SafeNavigationWithEmpty:
16
22
  Enabled: false
17
23
 
24
+ Metrics/AbcSize:
25
+ Enabled: false
26
+
27
+ Metrics/CyclomaticComplexity:
28
+ Enabled: false
29
+
18
30
  Metrics/BlockLength:
19
- Exclude:
20
- - spec/**/*.rb
31
+ Enabled: false
32
+
33
+ Metrics/ClassLength:
34
+ Enabled: false
21
35
 
22
36
  Metrics/MethodLength:
23
37
  Enabled: false
24
38
 
25
- Style/Alias:
26
- EnforcedStyle: prefer_alias_method
39
+ Metrics/PerceivedComplexity:
40
+ Enabled: false
27
41
 
28
- Style/FrozenStringLiteralComment:
29
- Enabled: true
42
+ RSpec/ExampleLength:
43
+ Enabled: false
30
44
 
31
- Style/HashEachMethods:
32
- Enabled: true
45
+ RSpec/FilePath:
46
+ Exclude:
47
+ - spec/metal_archives/models/*
33
48
 
34
- Style/HashTransformKeys:
35
- Enabled: true
49
+ RSpec/MultipleExpectations:
50
+ Enabled: false
36
51
 
37
- Style/HashTransformValues:
52
+ Style/FrozenStringLiteralComment:
38
53
  Enabled: true
39
54
 
40
55
  Style/PercentLiteralDelimiters:
@@ -46,18 +61,17 @@ Style/PercentLiteralDelimiters:
46
61
  "%w": "()"
47
62
  "%W": "()"
48
63
 
49
- Style/RegexpLiteral:
50
- EnforcedStyle: slashes
51
- AllowInnerSlashes: false
52
-
53
64
  Style/StringLiterals:
54
65
  EnforcedStyle: double_quotes
55
66
 
56
67
  Style/SymbolArray:
57
- Enabled: false
68
+ EnforcedStyle: brackets
69
+
70
+ Style/TrailingCommaInArguments:
71
+ EnforcedStyleForMultiline: consistent_comma
58
72
 
59
73
  Style/TrailingCommaInArrayLiteral:
60
- EnforcedStyleForMultiline: comma
74
+ EnforcedStyleForMultiline: consistent_comma
61
75
 
62
76
  Style/TrailingCommaInHashLiteral:
63
- EnforcedStyleForMultiline: comma
77
+ EnforcedStyleForMultiline: consistent_comma
data/CHANGELOG.md CHANGED
@@ -1,8 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.2.0
4
+
5
+ - Add band property on release
6
+
7
+ ## 3.1.1
8
+
9
+ - Fix some invalid parsing
10
+
11
+ ## 3.1.0
12
+
13
+ - Add members property on band
14
+
3
15
  ## 3.0.0
4
16
 
5
- - Support for Ruby < 2.5 dropped
17
+ - Dropped support for Ruby < 2.5
18
+ - `MetalArchives::Errors::APIError` changed
19
+ - Dropped support for Faraday middleware
20
+ - Added support for basic authentication
6
21
 
7
22
  ## 2.2.0
8
23
 
data/LICENSE.md CHANGED
@@ -1,7 +1,20 @@
1
- Copyright (c) 2016-2020 Florian Dejonckheere
1
+ Copyright 2020 Florian Dejonckheere
2
2
 
3
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
4
10
 
5
- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
6
13
 
7
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Metal Archives Ruby API
2
2
 
3
+ ![Continuous Integration](https://github.com/floriandejonckheere/metal_archives/workflows/Continuous%20Integration/badge.svg)
4
+ ![Release](https://img.shields.io/github/v/release/floriandejonckheere/metal_archives?label=Latest%20release)
5
+
6
+
3
7
  MetalArchives is a Ruby API that transparently wraps, caches and normalizes the [Metal Archives](https://www.metal-archives.com) website.
4
8
 
5
9
  ## Installation
@@ -7,7 +11,7 @@ MetalArchives is a Ruby API that transparently wraps, caches and normalizes the
7
11
  Add this line to your application's Gemfile.
8
12
 
9
13
  ```ruby
10
- gem "metal_archives", "0.1.0"
14
+ gem "metal_archives"
11
15
  ```
12
16
 
13
17
  And then execute:
@@ -29,19 +33,14 @@ Configure MetalArchives before using it:
29
33
  ```ruby
30
34
  MetalArchives.configure do |c|
31
35
  ## Application identity (required)
32
- c.app_name = 'My App'
33
- c.app_version = '1.0'
34
- c.app_contact = 'support@mymusicapp.com'
35
-
36
- ## Request throttling (optional, overrides defaults)
37
- c.request_rate = 1
38
- c.request_timeout = 3
39
-
40
- ## Connect additional Faraday middleware
41
- # c.middleware = [MyMiddleware, MyOtherMiddleware]
42
-
43
- ## Custom cache size per object class (optional, overrides defaults)
44
- c.cache_size = 100
36
+ c.app_name = "My App"
37
+ c.app_version = "1.0"
38
+ c.app_contact = "support@mymusicapp.com"
39
+
40
+ ## Enable Redis as caching backend (optional, overrides default memory cache)
41
+ ## Available cache strategies: :memory, :redis or :null (disable caching)
42
+ # c.cache_strategy = :redis
43
+ # c.cache_options = { url: "redis://redis:6379", ttl: 1.month.to_i }
45
44
 
46
45
  ## Metal Archives endpoint (optional, overrides default)
47
46
  # c.endpoint = "https://www.metal-archives.com/"
@@ -49,7 +48,7 @@ MetalArchives.configure do |c|
49
48
  # c.endpoint_password = "my_password"
50
49
 
51
50
  ## Custom logger (optional)
52
- c.logger = Logger.new File.new('metal_archives.log')
51
+ c.logger = Logger.new File.new("metal_archives.log")
53
52
  c.logger.level = Logger::INFO
54
53
  end
55
54
  ```
@@ -57,24 +56,24 @@ end
57
56
  ## Usage
58
57
 
59
58
  ```ruby
60
- require 'metal_archives'
59
+ require "metal_archives"
61
60
 
62
61
  # Search for bands
63
- @alquimia_list = MetalArchives::Band.search('Alquimia')
62
+ @alquimia_list = MetalArchives::Band.search("Alquimia")
64
63
 
65
64
  # Find bands by name
66
- @iron_maiden = MetalArchives::Band.find_by(:name => 'Iron Maiden')
65
+ @iron_maiden = MetalArchives::Band.find_by(name: "Iron Maiden")
67
66
 
68
67
  # Find bands by attributes
69
- require 'countries'
68
+ require "countries"
70
69
 
71
- @bands_in_belgium = MetalArchives::Band.search_by :country => ISO3166::Country['BE']
72
- @bands_formed_in_1990 = MetalArchives::Band.search_by :year => Range.new(Date.new(1990))
70
+ @bands_in_belgium = MetalArchives::Band.search_by(country: ISO3166::Country["BE"])
71
+ @bands_formed_in_1990 = MetalArchives::Band.search_by(year: 1990..)
73
72
 
74
73
  # Metal Archives' usual tips apply
75
74
 
76
- @bands_containing_hell = MetalArchives::Band.search_by :name => '*hell*'
77
- @non_melodic_death_bands = MetalArchives::Band.search_by :genre => 'death -melodic'
75
+ @bands_containing_hell = MetalArchives::Band.search_by name: "*hell*"
76
+ @non_melodic_death_bands = MetalArchives::Band.search_by genre: "death -melodic"
78
77
 
79
78
  # Methods returning multiple results return a MetalArchives::Collection.
80
79
  # Collection wraps a paginated resource, and can be used to iterate over huge queries.
@@ -92,17 +91,27 @@ This leads to instantiation of a model with an invalid ID not throwing any error
92
91
  Calling any attribute other than `id` will cause all data to be fetched and any errors to be thrown.
93
92
  Refer to the respective methods to find out what errors are thrown in what circumstances.
94
93
 
95
- Models can be forced to load all data by calling the `:load!` method.
94
+ Models can be forced to load all data by calling the `load!` method.
96
95
 
97
96
  ## Cache
98
97
 
99
- In order not to stress the Metal Archives server, you can quickly set up a local proxy that caches the requests.
98
+ The gem has builtin caching functionality.
99
+ By default, an in-memory cache is used that evicts cache entries using an LRU-based algorithm.
100
+ However, it is also possible to use Redis as a caching backend.
101
+ Don't forget to include the `redis` gem in your application bundle if you wish to use Redis caching.
102
+
103
+ In order not to stress the Metal Archives server, you can quickly set up a local HTTP proxy that caches the requests.
100
104
 
101
105
  ```
106
+ # Generate TLS client certificates for NGINX
107
+ openssl req -nodes -new -x509 -keyout nginx/client.key -out nginx/client.pem
108
+
109
+
110
+ # Start proxy server
102
111
  docker-compose up -d
103
112
  ```
104
113
 
105
- A caching proxy server is now available on `http://localhost/`.
114
+ A caching proxy server is now available on `http://localhost:8080/`.
106
115
 
107
116
  ## Testing
108
117
 
@@ -120,7 +129,6 @@ Generate documentation:
120
129
  $ bundle exec rake rdoc
121
130
  ```
122
131
 
123
- ## Copyright
132
+ ## License
124
133
 
125
- Copyright 2016-2020 Florian Dejonckheere.
126
- All content acquired through the usage of this API is copyrighted by the respective owner.
134
+ See [LICENSE.md](LICENSE.md).
data/bin/console CHANGED
@@ -15,21 +15,18 @@ MetalArchives.configure do |c|
15
15
  c.app_version = "1.0"
16
16
  c.app_contact = "support@mymusicapp.com"
17
17
 
18
- ## Request throttling (optional, overrides defaults)
19
- # c.request_rate = 1
20
- # c.request_timeout = 3
21
-
22
- ## Connect additional Faraday middleware
23
- # c.middleware = [MyMiddleware, MyOtherMiddleware]
24
-
25
- ## Custom cache size per object class (optional, overrides defaults)
26
- # c.cache_size = 100
18
+ ## Enable Redis as caching backend (optional, overrides default memory cache)
19
+ ## Available cache strategies: :memory, :redis or :null (disable caching)
20
+ # c.cache_strategy = :redis
21
+ # c.cache_options = { url: "redis://redis:6379", ttl: 1.month.to_i }
27
22
 
28
23
  ## Metal Archives endpoint (optional, overrides default)
29
- # c.endpoint = "http://www.metal-archives.com/"
24
+ c.endpoint = ENV["MA_ENDPOINT"] if ENV["MA_ENDPOINT"]
25
+ c.endpoint_user = ENV["MA_ENDPOINT_USER"] if ENV["MA_ENDPOINT_USER"]
26
+ c.endpoint_password = ENV["MA_ENDPOINT_PASSWORD"] if ENV["MA_ENDPOINT_PASSWORD"]
30
27
 
31
28
  ## Custom logger (optional)
32
- c.logger = Logger.new STDOUT
29
+ c.logger = Logger.new $stdout
33
30
  c.logger.level = Logger::WARN
34
31
  end
35
32
 
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ MetalArchives.loader.inflector.inflect(
4
+ "id" => "ID",
5
+ "http_client" => "HTTPClient",
6
+ "lru_cache" => "LRUCache",
7
+ )
File without changes
data/docker-compose.yml CHANGED
@@ -4,11 +4,20 @@ services:
4
4
  nginx:
5
5
  image: nginx:alpine
6
6
  ports:
7
- - "80:80"
7
+ - "0.0.0.0:8080:80"
8
8
  volumes:
9
9
  - ./nginx/:/etc/nginx/conf.d/
10
10
  - nginx:/cache/
11
11
  restart: always
12
12
 
13
+ redis:
14
+ image: redis:alpine
15
+ ports:
16
+ - "0.0.0.0:6379:6379"
17
+ volumes:
18
+ - redis:/data/
19
+ restart: always
20
+
13
21
  volumes:
14
22
  nginx:
23
+ redis: