metal_archives 2.1.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.
- checksums.yaml +5 -5
- data/.github/workflows/ci.yml +93 -0
- data/.gitignore +6 -6
- data/.overcommit.yml +35 -0
- data/.rspec +2 -0
- data/.rubocop.yml +69 -6
- data/CHANGELOG.md +29 -0
- data/Gemfile +1 -1
- data/LICENSE.md +17 -4
- data/README.md +65 -86
- data/Rakefile +8 -7
- data/bin/console +38 -0
- data/bin/setup +8 -0
- data/config/inflections.rb +7 -0
- data/config/initializers/.keep +0 -0
- data/docker-compose.yml +23 -0
- data/lib/metal_archives.rb +82 -25
- data/lib/metal_archives/cache/base.rb +40 -0
- data/lib/metal_archives/cache/memory.rb +68 -0
- data/lib/metal_archives/cache/null.rb +22 -0
- data/lib/metal_archives/cache/redis.rb +49 -0
- data/lib/metal_archives/{utils/collection.rb → collection.rb} +3 -5
- data/lib/metal_archives/configuration.rb +33 -50
- data/lib/metal_archives/{error.rb → errors.rb} +9 -1
- data/lib/metal_archives/http_client.rb +45 -44
- data/lib/metal_archives/models/artist.rb +90 -45
- data/lib/metal_archives/models/band.rb +80 -55
- data/lib/metal_archives/models/base.rb +218 -0
- data/lib/metal_archives/models/label.rb +14 -15
- data/lib/metal_archives/models/release.rb +349 -0
- data/lib/metal_archives/parsers/artist.rb +86 -50
- data/lib/metal_archives/parsers/band.rb +155 -88
- data/lib/metal_archives/parsers/base.rb +14 -0
- data/lib/metal_archives/parsers/country.rb +21 -0
- data/lib/metal_archives/parsers/date.rb +31 -0
- data/lib/metal_archives/parsers/genre.rb +67 -0
- data/lib/metal_archives/parsers/label.rb +39 -31
- data/lib/metal_archives/parsers/parser.rb +16 -63
- data/lib/metal_archives/parsers/release.rb +242 -0
- data/lib/metal_archives/parsers/year.rb +29 -0
- data/lib/metal_archives/version.rb +12 -1
- data/metal_archives.env.example +10 -0
- data/metal_archives.gemspec +43 -28
- data/nginx/default.conf +60 -0
- metadata +181 -72
- data/.travis.yml +0 -12
- data/lib/metal_archives/middleware/cache_check.rb +0 -20
- data/lib/metal_archives/middleware/encoding.rb +0 -16
- data/lib/metal_archives/middleware/headers.rb +0 -38
- data/lib/metal_archives/middleware/rewrite_endpoint.rb +0 -38
- data/lib/metal_archives/models/base_model.rb +0 -215
- data/lib/metal_archives/utils/lru_cache.rb +0 -61
- data/lib/metal_archives/utils/nil_date.rb +0 -99
- data/lib/metal_archives/utils/range.rb +0 -66
- data/spec/configuration_spec.rb +0 -96
- data/spec/factories/artist_factory.rb +0 -37
- data/spec/factories/band_factory.rb +0 -60
- data/spec/factories/nil_date_factory.rb +0 -9
- data/spec/factories/range_factory.rb +0 -8
- data/spec/models/artist_spec.rb +0 -138
- data/spec/models/band_spec.rb +0 -164
- data/spec/models/base_model_spec.rb +0 -219
- data/spec/parser_spec.rb +0 -19
- data/spec/spec_helper.rb +0 -111
- data/spec/support/factory_girl.rb +0 -5
- data/spec/support/metal_archives.rb +0 -33
- data/spec/utils/collection_spec.rb +0 -72
- data/spec/utils/lru_cache_spec.rb +0 -53
- data/spec/utils/nil_date_spec.rb +0 -156
- data/spec/utils/range_spec.rb +0 -62
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cc72b807bbb20dcb70cfc38a6808b1088a3c5a187a6b033f82ef0083e5ff7794
|
4
|
+
data.tar.gz: b2424b28220556afc3c777efcd38e10f9b03d92d58905130e53723a0f5e5691c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d80a6bf547b425d5d85c1b789e62a9224cf77e06911e8e8e45f298041778e2b9e976e754fc1a6f43a939e2e5b5cabf581f7b43b8677d8d48f4023a11df516fb
|
7
|
+
data.tar.gz: 2911d68d5725d92def587f482cc01235c280e7989b1903cac2374632136e667f988384141ffbb2ae9c69bae95a555c7f7cac50e96e12af273e562bc372bb141c
|
@@ -0,0 +1,93 @@
|
|
1
|
+
name: Continuous Integration
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches:
|
6
|
+
- '*'
|
7
|
+
tags:
|
8
|
+
- '*'
|
9
|
+
schedule:
|
10
|
+
- cron: '0 7 * * 1'
|
11
|
+
|
12
|
+
jobs:
|
13
|
+
build:
|
14
|
+
name: Continuous Integration
|
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
|
26
|
+
|
27
|
+
steps:
|
28
|
+
- uses: actions/checkout@v2
|
29
|
+
|
30
|
+
- name: Install dependencies
|
31
|
+
run: |
|
32
|
+
apk add build-base git cmake openssl-dev
|
33
|
+
apk add tar
|
34
|
+
|
35
|
+
- name: Cache Gems
|
36
|
+
uses: actions/cache@v2.1.3
|
37
|
+
with:
|
38
|
+
path: vendor/bundle
|
39
|
+
key: ${{ runner.os }}-${{ matrix.ruby }}-gem-${{ hashFiles('**/Gemfile.lock') }}
|
40
|
+
restore-keys: |
|
41
|
+
${{ runner.os }}-${{ matrix.ruby }}-gem-
|
42
|
+
|
43
|
+
- name: Install Gems
|
44
|
+
run: |
|
45
|
+
gem install bundler
|
46
|
+
bundle config path vendor/bundle
|
47
|
+
bundle install --jobs 4 --retry 3
|
48
|
+
|
49
|
+
- name: Test
|
50
|
+
env:
|
51
|
+
MA_ENDPOINT: ${{ secrets.MA_ENDPOINT }}
|
52
|
+
MA_ENDPOINT_USER: ${{ secrets.MA_ENDPOINT_USER }}
|
53
|
+
MA_ENDPOINT_PASSWORD: ${{ secrets.MA_ENDPOINT_PASSWORD }}
|
54
|
+
WEBMOCK_ALLOW_HOST: ${{ secrets.WEBMOCK_ALLOW_HOST }}
|
55
|
+
REDIS_URL: "redis://redis:6379/"
|
56
|
+
run: bundle exec rspec --profile 10 --format progress
|
57
|
+
|
58
|
+
- name: Lint
|
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/.gitignore
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
Gemfile.lock
|
2
|
-
.idea
|
3
|
-
|
4
1
|
*.tar.gz
|
5
2
|
*.gem
|
6
3
|
*.rbc
|
@@ -13,9 +10,12 @@ Gemfile.lock
|
|
13
10
|
/test/tmp/
|
14
11
|
/test/version_tmp/
|
15
12
|
/tmp/
|
13
|
+
nginx/*.key
|
14
|
+
nginx/*.pem
|
16
15
|
|
17
16
|
# Used by dotenv library to load environment variables.
|
18
17
|
# .env
|
18
|
+
*.env
|
19
19
|
|
20
20
|
## Specific to RubyMotion:
|
21
21
|
.dat*
|
@@ -46,9 +46,9 @@ build-iPhoneSimulator/
|
|
46
46
|
|
47
47
|
# for a library or gem, you might want to ignore these files since the code is
|
48
48
|
# intended to run in multiple environments; otherwise, check them in:
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
Gemfile.lock
|
50
|
+
.ruby-version
|
51
|
+
.ruby-gemset
|
52
52
|
|
53
53
|
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
54
54
|
.rvmrc
|
data/.overcommit.yml
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# Use this file to configure the Overcommit hooks you wish to use. This will
|
2
|
+
# extend the default configuration defined in:
|
3
|
+
# https://github.com/sds/overcommit/blob/master/config/default.yml
|
4
|
+
#
|
5
|
+
# At the topmost level of this YAML file is a key representing type of hook
|
6
|
+
# being run (e.g. pre-commit, commit-msg, etc.). Within each type you can
|
7
|
+
# customize each hook, such as whether to only run it on certain files (via
|
8
|
+
# `include`), whether to only display output if it fails (via `quiet`), etc.
|
9
|
+
#
|
10
|
+
# For a complete list of hooks, see:
|
11
|
+
# https://github.com/sds/overcommit/tree/master/lib/overcommit/hook
|
12
|
+
#
|
13
|
+
# For a complete list of options that you can use to customize hooks, see:
|
14
|
+
# https://github.com/sds/overcommit#configuration
|
15
|
+
#
|
16
|
+
# Uncomment the following lines to make the configuration take effect.
|
17
|
+
|
18
|
+
PreCommit:
|
19
|
+
Fasterer:
|
20
|
+
enabled: true
|
21
|
+
|
22
|
+
Flay:
|
23
|
+
enabled: true
|
24
|
+
|
25
|
+
Pronto:
|
26
|
+
enabled: true
|
27
|
+
|
28
|
+
Reek:
|
29
|
+
enabled: true
|
30
|
+
|
31
|
+
RuboCop:
|
32
|
+
enabled: true
|
33
|
+
|
34
|
+
RubySyntax:
|
35
|
+
enabled: true
|
data/.rspec
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,14 +1,77 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require:
|
2
|
+
- rubocop-performance
|
3
|
+
- rubocop-rspec
|
3
4
|
|
4
|
-
|
5
|
+
AllCops:
|
6
|
+
NewCops: enable
|
7
|
+
TargetRubyVersion: 2.6
|
8
|
+
|
9
|
+
Layout/LineLength:
|
10
|
+
Enabled: false
|
11
|
+
|
12
|
+
Layout/MultilineMethodCallIndentation:
|
13
|
+
EnforcedStyle: indented
|
14
|
+
|
15
|
+
Layout/ParameterAlignment:
|
16
|
+
EnforcedStyle: with_fixed_indentation
|
17
|
+
|
18
|
+
Lint/AssignmentInCondition:
|
19
|
+
AllowSafeAssignment: true
|
20
|
+
|
21
|
+
Lint/SafeNavigationWithEmpty:
|
22
|
+
Enabled: false
|
23
|
+
|
24
|
+
Metrics/AbcSize:
|
25
|
+
Enabled: false
|
26
|
+
|
27
|
+
Metrics/CyclomaticComplexity:
|
5
28
|
Enabled: false
|
6
29
|
|
7
30
|
Metrics/BlockLength:
|
8
31
|
Enabled: false
|
9
32
|
|
10
|
-
|
11
|
-
|
33
|
+
Metrics/ClassLength:
|
34
|
+
Enabled: false
|
12
35
|
|
13
|
-
|
36
|
+
Metrics/MethodLength:
|
14
37
|
Enabled: false
|
38
|
+
|
39
|
+
Metrics/PerceivedComplexity:
|
40
|
+
Enabled: false
|
41
|
+
|
42
|
+
RSpec/ExampleLength:
|
43
|
+
Enabled: false
|
44
|
+
|
45
|
+
RSpec/FilePath:
|
46
|
+
Exclude:
|
47
|
+
- spec/metal_archives/models/*
|
48
|
+
|
49
|
+
RSpec/MultipleExpectations:
|
50
|
+
Enabled: false
|
51
|
+
|
52
|
+
Style/FrozenStringLiteralComment:
|
53
|
+
Enabled: true
|
54
|
+
|
55
|
+
Style/PercentLiteralDelimiters:
|
56
|
+
PreferredDelimiters:
|
57
|
+
default: "()"
|
58
|
+
"%i": "()"
|
59
|
+
"%I": "()"
|
60
|
+
"%r": "()"
|
61
|
+
"%w": "()"
|
62
|
+
"%W": "()"
|
63
|
+
|
64
|
+
Style/StringLiterals:
|
65
|
+
EnforcedStyle: double_quotes
|
66
|
+
|
67
|
+
Style/SymbolArray:
|
68
|
+
EnforcedStyle: brackets
|
69
|
+
|
70
|
+
Style/TrailingCommaInArguments:
|
71
|
+
EnforcedStyleForMultiline: consistent_comma
|
72
|
+
|
73
|
+
Style/TrailingCommaInArrayLiteral:
|
74
|
+
EnforcedStyleForMultiline: consistent_comma
|
75
|
+
|
76
|
+
Style/TrailingCommaInHashLiteral:
|
77
|
+
EnforcedStyleForMultiline: consistent_comma
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,34 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 3.1.0
|
4
|
+
|
5
|
+
- Add members property on band
|
6
|
+
|
7
|
+
## 3.0.0
|
8
|
+
|
9
|
+
- Dropped support for Ruby < 2.5
|
10
|
+
- `MetalArchives::Errors::APIError` changed
|
11
|
+
- Dropped support for Faraday middleware
|
12
|
+
- Added support for basic authentication
|
13
|
+
|
14
|
+
## 2.2.0
|
15
|
+
|
16
|
+
- Add `Release` model
|
17
|
+
|
18
|
+
## 2.1.1
|
19
|
+
|
20
|
+
- Fix UTF-8 conversion errors
|
21
|
+
- Don't `load!` unconditionally on `find!` and `find_by!`
|
22
|
+
|
23
|
+
## 2.1.0
|
24
|
+
|
25
|
+
- Added Ruby compatibility down to 2.1
|
26
|
+
- Band and Label: return `NilDate`
|
27
|
+
|
28
|
+
## 2.0.0
|
29
|
+
|
30
|
+
- Artist returns `NilDate`s
|
31
|
+
|
3
32
|
## 1.0.0
|
4
33
|
|
5
34
|
- Add `Artist#photo`
|
data/Gemfile
CHANGED
data/LICENSE.md
CHANGED
@@ -1,7 +1,20 @@
|
|
1
|
-
Copyright
|
1
|
+
Copyright 2020 Florian Dejonckheere
|
2
2
|
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
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
|
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,
|
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,45 +1,54 @@
|
|
1
|
-
# Metal Archives
|
1
|
+
# Metal Archives Ruby API
|
2
|
+
|
3
|
+

|
4
|
+

|
5
|
+
|
6
|
+
|
7
|
+
MetalArchives is a Ruby API that transparently wraps, caches and normalizes the [Metal Archives](https://www.metal-archives.com) website.
|
2
8
|
|
3
9
|
## Installation
|
4
10
|
|
5
|
-
|
6
|
-
|
11
|
+
Add this line to your application's Gemfile.
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem "metal_archives"
|
7
15
|
```
|
8
16
|
|
9
|
-
|
17
|
+
And then execute:
|
10
18
|
|
11
|
-
```
|
12
|
-
|
19
|
+
```sh
|
20
|
+
bundle
|
13
21
|
```
|
14
22
|
|
15
|
-
|
16
|
-
|
23
|
+
Or install it yourself as:
|
24
|
+
|
25
|
+
```sh
|
26
|
+
gem install metal_archives
|
17
27
|
```
|
18
28
|
|
19
29
|
## Configuration
|
20
30
|
|
31
|
+
Configure MetalArchives before using it:
|
32
|
+
|
21
33
|
```ruby
|
22
34
|
MetalArchives.configure do |c|
|
23
35
|
## Application identity (required)
|
24
|
-
c.app_name =
|
25
|
-
c.app_version =
|
26
|
-
c.app_contact =
|
27
|
-
|
28
|
-
##
|
29
|
-
|
30
|
-
c.
|
31
|
-
|
32
|
-
## Connect additional Faraday middleware
|
33
|
-
# c.middleware = [MyMiddleware, MyOtherMiddleware]
|
34
|
-
|
35
|
-
## Custom cache size per object class (optional, overrides defaults)
|
36
|
-
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 }
|
37
44
|
|
38
45
|
## Metal Archives endpoint (optional, overrides default)
|
39
|
-
# c.endpoint =
|
46
|
+
# c.endpoint = "https://www.metal-archives.com/"
|
47
|
+
# c.endpoint_user = "my_user"
|
48
|
+
# c.endpoint_password = "my_password"
|
40
49
|
|
41
50
|
## Custom logger (optional)
|
42
|
-
c.logger = Logger.new File.new(
|
51
|
+
c.logger = Logger.new File.new("metal_archives.log")
|
43
52
|
c.logger.level = Logger::INFO
|
44
53
|
end
|
45
54
|
```
|
@@ -47,24 +56,24 @@ end
|
|
47
56
|
## Usage
|
48
57
|
|
49
58
|
```ruby
|
50
|
-
require
|
59
|
+
require "metal_archives"
|
51
60
|
|
52
61
|
# Search for bands
|
53
|
-
@alquimia_list = MetalArchives::Band.search(
|
62
|
+
@alquimia_list = MetalArchives::Band.search("Alquimia")
|
54
63
|
|
55
64
|
# Find bands by name
|
56
|
-
@iron_maiden = MetalArchives::Band.find_by(:
|
65
|
+
@iron_maiden = MetalArchives::Band.find_by(name: "Iron Maiden")
|
57
66
|
|
58
67
|
# Find bands by attributes
|
59
|
-
require
|
68
|
+
require "countries"
|
60
69
|
|
61
|
-
@bands_in_belgium = MetalArchives::Band.search_by
|
62
|
-
@bands_formed_in_1990 = MetalArchives::Band.search_by
|
70
|
+
@bands_in_belgium = MetalArchives::Band.search_by(country: ISO3166::Country["BE"])
|
71
|
+
@bands_formed_in_1990 = MetalArchives::Band.search_by(year: 1990..)
|
63
72
|
|
64
73
|
# Metal Archives' usual tips apply
|
65
74
|
|
66
|
-
@bands_containing_hell = MetalArchives::Band.search_by :
|
67
|
-
@non_melodic_death_bands = MetalArchives::Band.search_by :
|
75
|
+
@bands_containing_hell = MetalArchives::Band.search_by name: "*hell*"
|
76
|
+
@non_melodic_death_bands = MetalArchives::Band.search_by genre: "death -melodic"
|
68
77
|
|
69
78
|
# Methods returning multiple results return a MetalArchives::Collection.
|
70
79
|
# Collection wraps a paginated resource, and can be used to iterate over huge queries.
|
@@ -77,79 +86,49 @@ Refer to the model's [RDoc documentation](https://floriandejonckheere.github.io/
|
|
77
86
|
|
78
87
|
## Lazy loading
|
79
88
|
|
80
|
-
By default when an model (Artist, Band, ...) is created, no data is fetched.
|
89
|
+
By default when an model (Artist, Band, ...) is created, no data is fetched.
|
90
|
+
This leads to instantiation of a model with an invalid ID not throwing any errors.
|
91
|
+
Calling any attribute other than `id` will cause all data to be fetched and any errors to be thrown.
|
92
|
+
Refer to the respective methods to find out what errors are thrown in what circumstances.
|
81
93
|
|
82
|
-
Models can be forced to load all data by calling the
|
94
|
+
Models can be forced to load all data by calling the `load!` method.
|
83
95
|
|
84
96
|
## Cache
|
85
97
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
proxy_cache_path /var/cache/nginx/metal_archives levels=1:2 keys_zone=metal_archives:10m;
|
91
|
-
|
92
|
-
# Set cache key to include identifying components
|
93
|
-
proxy_cache_key $scheme$proxy_host$request_uri;
|
94
|
-
|
95
|
-
# Add cache status to log
|
96
|
-
log_format cache '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" cs=$upstream_cache_status';
|
97
|
-
|
98
|
-
server {
|
99
|
-
server_name metal-archives.myhost.com;
|
100
|
-
listen 443 ssl;
|
101
|
-
listen [::]:443 ssl;
|
102
|
-
|
103
|
-
ssl_certificate /path/to/ssl_certificate.crt;
|
104
|
-
ssl_certificate_key /path/to/ssl_certificate_key.key;
|
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.
|
105
102
|
|
106
|
-
|
107
|
-
error_log /var/log/nginx/metal_archives_error.log;
|
103
|
+
In order not to stress the Metal Archives server, you can quickly set up a local HTTP proxy that caches the requests.
|
108
104
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
location / {
|
113
|
-
proxy_redirect off;
|
114
|
-
proxy_set_header Host www.metal-archives.com;
|
115
|
-
proxy_set_header X-Forwarded-Host $host;
|
116
|
-
proxy_set_header X-Forwarded-Server $host;
|
117
|
-
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
118
|
-
proxy_set_header X-Real-IP $remote_addr;
|
119
|
-
|
120
|
-
proxy_pass https://www.metal-archives.com/;
|
105
|
+
```
|
106
|
+
# Generate TLS client certificates for NGINX
|
107
|
+
openssl req -nodes -new -x509 -keyout nginx/client.key -out nginx/client.pem
|
121
108
|
|
122
|
-
limit_req zone=ma_limit_req burst=5;
|
123
109
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
proxy_ignore_headers Set-Cookie;
|
110
|
+
# Start proxy server
|
111
|
+
docker-compose up -d
|
112
|
+
```
|
128
113
|
|
129
|
-
|
130
|
-
proxy_hide_header Pragma;
|
114
|
+
A caching proxy server is now available on `http://localhost:8080/`.
|
131
115
|
|
132
|
-
|
133
|
-
proxy_cache metal_archives;
|
134
|
-
proxy_cache_valid 200 301 302 30d;
|
135
|
-
proxy_cache_valid 404 7d;
|
136
|
-
expires 30d;
|
137
|
-
}
|
116
|
+
## Testing
|
138
117
|
|
139
|
-
|
140
|
-
}
|
141
|
-
```
|
118
|
+
Run tests:
|
142
119
|
|
143
|
-
## Testing
|
144
120
|
```
|
145
|
-
|
121
|
+
bundle exec rake test
|
146
122
|
```
|
147
123
|
|
148
124
|
## Documentation
|
125
|
+
|
126
|
+
Generate documentation:
|
127
|
+
|
149
128
|
```
|
150
129
|
$ bundle exec rake rdoc
|
151
130
|
```
|
152
131
|
|
153
|
-
##
|
132
|
+
## License
|
154
133
|
|
155
|
-
|
134
|
+
See [LICENSE.md](LICENSE.md).
|