metka 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1ea5e1ca3ea95cdb4f0beb2704afc1d92986b0a7c38aa49a70e794b2653c5764
4
- data.tar.gz: e9994da8c7db21d1d079c5464d2ffae2bf06ee742f2a664df505f144b1d995be
3
+ metadata.gz: 81b76694d9f46c48214c49fd4ced765bc238534e0247e01f4cf3b50718d2d775
4
+ data.tar.gz: 659202753ebb523445de4a484c579b1a5b3b6b52628edf90908169a7c21cc14a
5
5
  SHA512:
6
- metadata.gz: 5c8da36cf3bec90c63888d24ac7d09dbec00219ca547df88289b3f858c25eb7f6a0ca729ee46021bfe47f7086a0cb7209a309ae95d8a88bb1b696acd0e772901
7
- data.tar.gz: 4f7791a9be469c60ed1505d9f037653eccb0e81c1dcb18954c90daca440264eb9c0ca57067770c4d7222a86b2fca1c6a0ae1ad977becaad7d92ecda5ebf4513a
6
+ metadata.gz: c91e5714a01ce5050da4980c1cd57ea9564717873d8bfba1602fd42cd69a527ec5f1789b84b2fd5f3401dd22c4b55f3f8443cedc0dfd0270f136255b4c27a550
7
+ data.tar.gz: 2bf4bd0866762a273bf594ecbc260595990afcb1f724bafef298c9ea71749b1b88f0459aff66d40c2cb5166680cec682c54a6234cc4e9d087412f04ef9c70e99
@@ -0,0 +1,15 @@
1
+ # Tell us about your environment
2
+
3
+ **Ruby Version:**
4
+
5
+ **Rails Version:**
6
+
7
+ **PostgreSQL Version:**
8
+
9
+ **Metka Version:**
10
+
11
+ ## What did you do?
12
+
13
+ ## What did you expect to happen?
14
+
15
+ ## What actually happened?
@@ -0,0 +1,57 @@
1
+ name: Lint Docs
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ paths:
8
+ - "*.md"
9
+ - "**/*.md"
10
+ pull_request:
11
+ paths:
12
+ - "*.md"
13
+ - "**/*.md"
14
+
15
+ jobs:
16
+ markdownlint:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@v2
20
+ - uses: ruby/setup-ruby@v1
21
+ with:
22
+ ruby-version: 2.7
23
+ - name: Run Markdown linter
24
+ run: |
25
+ gem install mdl
26
+ mdl README.md .github/*.md
27
+ rubocop:
28
+ runs-on: ubuntu-latest
29
+ steps:
30
+ - uses: actions/checkout@v2
31
+ - uses: ruby/setup-ruby@v1
32
+ with:
33
+ ruby-version: 2.7
34
+ - name: Lint Markdown files with RuboCop
35
+ run: |
36
+ gem install bundler
37
+ bundle install --gemfile gemfiles/rubocop.gemfile --jobs 4 --retry 3
38
+ bundle exec --gemfile gemfiles/rubocop.gemfile rubocop -c .rubocop-md.yml
39
+ forspell:
40
+ runs-on: ubuntu-latest
41
+ steps:
42
+ - uses: actions/checkout@v2
43
+ - name: Install Hunspell
44
+ run: |
45
+ sudo apt-get install hunspell
46
+ - uses: ruby/setup-ruby@v1
47
+ with:
48
+ ruby-version: 2.7
49
+ - name: Cache installed gems
50
+ uses: actions/cache@v1
51
+ with:
52
+ path: /home/runner/.rubies/ruby-2.7.0/lib/ruby/gems/2.7.0
53
+ key: gems-cache-${{ runner.os }}
54
+ - name: Install Forspell
55
+ run: gem install forspell
56
+ - name: Run Forspell
57
+ run: forspell *.md .github/*.md
@@ -0,0 +1,84 @@
1
+ name: Build
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+
9
+ jobs:
10
+ rspec:
11
+ runs-on: ubuntu-latest
12
+ env:
13
+ BUNDLE_JOBS: 4
14
+ BUNDLE_RETRY: 3
15
+ CI: true
16
+ RAILS_ENV: test
17
+ DATABASE_URL: postgres://postgres:postgres@localhost:5432
18
+ strategy:
19
+ fail-fast: false
20
+ matrix:
21
+ ruby: ["2.7"]
22
+ postgres: ["12"]
23
+ gemfile: [
24
+ "gemfiles/rails61.gemfile"
25
+ ]
26
+ fx: ["false"]
27
+ include:
28
+ - ruby: "3.0"
29
+ postgres: "13"
30
+ gemfile: "gemfiles/railsmaster.gemfile"
31
+ fx: "false"
32
+ - ruby: "2.6"
33
+ postgres: "12"
34
+ gemfile: "gemfiles/rails61.gemfile"
35
+ fx: "false"
36
+ - ruby: "2.6"
37
+ postgres: "12"
38
+ gemfile: "gemfiles/rails6.gemfile"
39
+ fx: "false"
40
+ - ruby: "2.5"
41
+ postgres: "11"
42
+ gemfile: "gemfiles/rails52.gemfile"
43
+ fx: "false"
44
+ services:
45
+ postgres:
46
+ image: postgres:${{ matrix.postgres }}
47
+ ports: ["5432:5432"]
48
+ env:
49
+ POSTGRES_PASSWORD: postgres
50
+ options: >-
51
+ --health-cmd pg_isready
52
+ --health-interval 10s
53
+ --health-timeout 5s
54
+ --health-retries 5
55
+ steps:
56
+ - uses: actions/checkout@v2
57
+ - uses: actions/cache@v1
58
+ with:
59
+ path: /home/runner/bundle
60
+ key: bundle-${{ matrix.ruby }}-${{ matrix.gemfile }}-${{ hashFiles(matrix.gemfile) }}-${{ hashFiles('**/*.gemspec') }}
61
+ restore-keys: |
62
+ bundle-${{ matrix.ruby }}-${{ matrix.gemfile }}-
63
+ - name: Install system deps
64
+ run: |
65
+ sudo apt-get update
66
+ sudo apt-get -yqq install libpq-dev
67
+ - uses: ruby/setup-ruby@v1
68
+ with:
69
+ ruby-version: ${{ matrix.ruby }}
70
+ - name: Bundle install
71
+ run: |
72
+ bundle config path /home/runner/bundle
73
+ bundle config --global gemfile ${{ matrix.gemfile }}
74
+ bundle install
75
+ bundle update
76
+ - name: Prepare test database
77
+ run: |
78
+ bundle exec rake dummy:db:create
79
+ bundle exec rake dummy:db:migrate:reset
80
+ - name: Run RSpec
81
+ env:
82
+ USE_FX: ${{ matrix.fx }}
83
+ run: |
84
+ bundle exec rspec -f d --force-color
@@ -0,0 +1,21 @@
1
+ name: Rubocop
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+
9
+ jobs:
10
+ rubocop:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v2
14
+ - uses: ruby/setup-ruby@v1
15
+ with:
16
+ ruby-version: 2.7
17
+ - name: RuboCop
18
+ run: |
19
+ gem install bundler
20
+ bundle install --gemfile gemfiles/rubocop.gemfile --jobs 4 --retry 3
21
+ bundle exec --gemfile gemfiles/rubocop.gemfile rubocop
data/.gitignore CHANGED
@@ -11,6 +11,7 @@
11
11
  # rspec failure tracking
12
12
  .rspec_status
13
13
  spec/debug.log
14
+ *.gem
14
15
 
15
16
  spec/dummy/log/test.log
16
17
  spec/dummy/log/development.log
data/.mdlrc ADDED
@@ -0,0 +1 @@
1
+ rules "~MD013", "~MD026", "~MD029", "~MD034", "~MD041"
@@ -0,0 +1,17 @@
1
+ inherit_from: ".rubocop.yml"
2
+
3
+ require:
4
+ - rubocop-md
5
+
6
+
7
+ AllCops:
8
+ Include:
9
+ - '**/*.md'
10
+
11
+ Lint/Void:
12
+ Exclude:
13
+ - '**/*.md'
14
+
15
+ Lint/DuplicateMethods:
16
+ Exclude:
17
+ - '**/*.md'
@@ -9,7 +9,6 @@ AllCops:
9
9
  - 'Gemfile'
10
10
  - 'vendor/**/*'
11
11
  - 'gemfiles/**/*'
12
- - '**/*.md'
13
12
  DisplayCopNames: true
14
13
  TargetRubyVersion: 2.5
15
14
 
@@ -22,8 +22,7 @@ include:
22
22
 
23
23
  Examples of unacceptable behavior by participants include:
24
24
 
25
- * The use of sexualized language or imagery and unwelcome sexual attention or
26
- advances
25
+ * The use of sexualized language or imagery and unwelcome sexual attention or advances
27
26
  * Trolling, insulting/derogatory comments, and personal or political attacks
28
27
  * Public or private harassment
29
28
  * Publishing others' private information, such as a physical or electronic
@@ -67,8 +66,8 @@ members of the project's leadership.
67
66
 
68
67
  ## Attribution
69
68
 
70
- This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
- available at [http://contributor-covenant.org/version/1/4][version]
69
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
70
+ version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
72
71
 
73
72
  [homepage]: http://contributor-covenant.org
74
73
  [version]: http://contributor-covenant.org/version/1/4/
@@ -1,73 +1,87 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- metka (2.0.3)
4
+ metka (2.1.0)
5
5
  dry-configurable (>= 0.8)
6
- rails (>= 5.1)
6
+ rails (>= 5.2)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- actioncable (5.2.4.4)
12
- actionpack (= 5.2.4.4)
11
+ actioncable (6.1.0)
12
+ actionpack (= 6.1.0)
13
+ activesupport (= 6.1.0)
13
14
  nio4r (~> 2.0)
14
15
  websocket-driver (>= 0.6.1)
15
- actionmailer (5.2.4.4)
16
- actionpack (= 5.2.4.4)
17
- actionview (= 5.2.4.4)
18
- activejob (= 5.2.4.4)
16
+ actionmailbox (6.1.0)
17
+ actionpack (= 6.1.0)
18
+ activejob (= 6.1.0)
19
+ activerecord (= 6.1.0)
20
+ activestorage (= 6.1.0)
21
+ activesupport (= 6.1.0)
22
+ mail (>= 2.7.1)
23
+ actionmailer (6.1.0)
24
+ actionpack (= 6.1.0)
25
+ actionview (= 6.1.0)
26
+ activejob (= 6.1.0)
27
+ activesupport (= 6.1.0)
19
28
  mail (~> 2.5, >= 2.5.4)
20
29
  rails-dom-testing (~> 2.0)
21
- actionpack (5.2.4.4)
22
- actionview (= 5.2.4.4)
23
- activesupport (= 5.2.4.4)
24
- rack (~> 2.0, >= 2.0.8)
30
+ actionpack (6.1.0)
31
+ actionview (= 6.1.0)
32
+ activesupport (= 6.1.0)
33
+ rack (~> 2.0, >= 2.0.9)
25
34
  rack-test (>= 0.6.3)
26
35
  rails-dom-testing (~> 2.0)
27
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
28
- actionview (5.2.4.4)
29
- activesupport (= 5.2.4.4)
36
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
37
+ actiontext (6.1.0)
38
+ actionpack (= 6.1.0)
39
+ activerecord (= 6.1.0)
40
+ activestorage (= 6.1.0)
41
+ activesupport (= 6.1.0)
42
+ nokogiri (>= 1.8.5)
43
+ actionview (6.1.0)
44
+ activesupport (= 6.1.0)
30
45
  builder (~> 3.1)
31
46
  erubi (~> 1.4)
32
47
  rails-dom-testing (~> 2.0)
33
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
34
- activejob (5.2.4.4)
35
- activesupport (= 5.2.4.4)
48
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
49
+ activejob (6.1.0)
50
+ activesupport (= 6.1.0)
36
51
  globalid (>= 0.3.6)
37
- activemodel (5.2.4.4)
38
- activesupport (= 5.2.4.4)
39
- activerecord (5.2.4.4)
40
- activemodel (= 5.2.4.4)
41
- activesupport (= 5.2.4.4)
42
- arel (>= 9.0)
43
- activestorage (5.2.4.4)
44
- actionpack (= 5.2.4.4)
45
- activerecord (= 5.2.4.4)
52
+ activemodel (6.1.0)
53
+ activesupport (= 6.1.0)
54
+ activerecord (6.1.0)
55
+ activemodel (= 6.1.0)
56
+ activesupport (= 6.1.0)
57
+ activestorage (6.1.0)
58
+ actionpack (= 6.1.0)
59
+ activejob (= 6.1.0)
60
+ activerecord (= 6.1.0)
61
+ activesupport (= 6.1.0)
46
62
  marcel (~> 0.3.1)
47
- activesupport (5.2.4.4)
63
+ mimemagic (~> 0.3.2)
64
+ activesupport (6.1.0)
48
65
  concurrent-ruby (~> 1.0, >= 1.0.2)
49
- i18n (>= 0.7, < 2)
50
- minitest (~> 5.1)
51
- tzinfo (~> 1.1)
66
+ i18n (>= 1.6, < 2)
67
+ minitest (>= 5.1)
68
+ tzinfo (~> 2.0)
69
+ zeitwerk (~> 2.3)
52
70
  ammeter (1.1.4)
53
71
  activesupport (>= 3.0)
54
72
  railties (>= 3.0)
55
73
  rspec-rails (>= 2.2)
56
- arel (9.0.0)
57
- ast (2.4.1)
58
74
  builder (3.2.4)
59
75
  coderay (1.1.3)
60
76
  concurrent-ruby (1.1.7)
61
77
  crass (1.0.6)
62
78
  database_cleaner (1.8.5)
63
79
  diff-lcs (1.4.4)
64
- dry-configurable (0.11.6)
80
+ dry-configurable (0.12.0)
65
81
  concurrent-ruby (~> 1.0)
66
- dry-core (~> 0.4, >= 0.4.7)
67
- dry-equalizer (~> 0.2)
82
+ dry-core (~> 0.5, >= 0.5.0)
68
83
  dry-core (0.5.0)
69
84
  concurrent-ruby (~> 1.0)
70
- dry-equalizer (0.3.0)
71
85
  erubi (1.10.0)
72
86
  faker (2.15.1)
73
87
  i18n (>= 1.6, < 2)
@@ -75,10 +89,6 @@ GEM
75
89
  activesupport (>= 4.2.0)
76
90
  i18n (1.8.5)
77
91
  concurrent-ruby (~> 1.0)
78
- jetrockets-standard (1.0.7)
79
- rubocop-rails (~> 2.8.1)
80
- rubocop-rspec (~> 1.43.2)
81
- standard (~> 0.6.1)
82
92
  loofah (2.8.0)
83
93
  crass (~> 1.0.2)
84
94
  nokogiri (>= 1.5.9)
@@ -94,9 +104,6 @@ GEM
94
104
  nio4r (2.5.4)
95
105
  nokogiri (1.10.10)
96
106
  mini_portile2 (~> 2.4.0)
97
- parallel (1.20.1)
98
- parser (2.7.2.0)
99
- ast (~> 2.4.1)
100
107
  pg (1.2.3)
101
108
  pry (0.13.1)
102
109
  coderay (~> 1.1)
@@ -104,76 +111,54 @@ GEM
104
111
  rack (2.2.3)
105
112
  rack-test (1.1.0)
106
113
  rack (>= 1.0, < 3)
107
- rails (5.2.4.4)
108
- actioncable (= 5.2.4.4)
109
- actionmailer (= 5.2.4.4)
110
- actionpack (= 5.2.4.4)
111
- actionview (= 5.2.4.4)
112
- activejob (= 5.2.4.4)
113
- activemodel (= 5.2.4.4)
114
- activerecord (= 5.2.4.4)
115
- activestorage (= 5.2.4.4)
116
- activesupport (= 5.2.4.4)
117
- bundler (>= 1.3.0)
118
- railties (= 5.2.4.4)
114
+ rails (6.1.0)
115
+ actioncable (= 6.1.0)
116
+ actionmailbox (= 6.1.0)
117
+ actionmailer (= 6.1.0)
118
+ actionpack (= 6.1.0)
119
+ actiontext (= 6.1.0)
120
+ actionview (= 6.1.0)
121
+ activejob (= 6.1.0)
122
+ activemodel (= 6.1.0)
123
+ activerecord (= 6.1.0)
124
+ activestorage (= 6.1.0)
125
+ activesupport (= 6.1.0)
126
+ bundler (>= 1.15.0)
127
+ railties (= 6.1.0)
119
128
  sprockets-rails (>= 2.0.0)
120
129
  rails-dom-testing (2.0.3)
121
130
  activesupport (>= 4.2.0)
122
131
  nokogiri (>= 1.6)
123
132
  rails-html-sanitizer (1.3.0)
124
133
  loofah (~> 2.3)
125
- railties (5.2.4.4)
126
- actionpack (= 5.2.4.4)
127
- activesupport (= 5.2.4.4)
134
+ railties (6.1.0)
135
+ actionpack (= 6.1.0)
136
+ activesupport (= 6.1.0)
128
137
  method_source
129
138
  rake (>= 0.8.7)
130
- thor (>= 0.19.0, < 2.0)
131
- rainbow (3.0.0)
139
+ thor (~> 1.0)
132
140
  rake (13.0.3)
133
- regexp_parser (2.0.1)
134
- rexml (3.2.4)
135
141
  rspec (3.10.0)
136
142
  rspec-core (~> 3.10.0)
137
143
  rspec-expectations (~> 3.10.0)
138
144
  rspec-mocks (~> 3.10.0)
139
- rspec-core (3.10.0)
145
+ rspec-core (3.10.1)
140
146
  rspec-support (~> 3.10.0)
141
- rspec-expectations (3.10.0)
147
+ rspec-expectations (3.10.1)
142
148
  diff-lcs (>= 1.2.0, < 2.0)
143
149
  rspec-support (~> 3.10.0)
144
150
  rspec-mocks (3.10.0)
145
151
  diff-lcs (>= 1.2.0, < 2.0)
146
152
  rspec-support (~> 3.10.0)
147
- rspec-rails (4.0.1)
153
+ rspec-rails (4.0.2)
148
154
  actionpack (>= 4.2)
149
155
  activesupport (>= 4.2)
150
156
  railties (>= 4.2)
151
- rspec-core (~> 3.9)
152
- rspec-expectations (~> 3.9)
153
- rspec-mocks (~> 3.9)
154
- rspec-support (~> 3.9)
155
- rspec-support (3.10.0)
156
- rubocop (0.91.1)
157
- parallel (~> 1.10)
158
- parser (>= 2.7.1.1)
159
- rainbow (>= 2.2.2, < 4.0)
160
- regexp_parser (>= 1.7)
161
- rexml
162
- rubocop-ast (>= 0.4.0, < 1.0)
163
- ruby-progressbar (~> 1.7)
164
- unicode-display_width (>= 1.4.0, < 2.0)
165
- rubocop-ast (0.8.0)
166
- parser (>= 2.7.1.5)
167
- rubocop-performance (1.8.1)
168
- rubocop (>= 0.87.0)
169
- rubocop-ast (>= 0.4.0)
170
- rubocop-rails (2.8.1)
171
- activesupport (>= 4.2.0)
172
- rack (>= 1.1)
173
- rubocop (>= 0.87.0)
174
- rubocop-rspec (1.43.2)
175
- rubocop (~> 0.87)
176
- ruby-progressbar (1.10.1)
157
+ rspec-core (~> 3.10)
158
+ rspec-expectations (~> 3.10)
159
+ rspec-mocks (~> 3.10)
160
+ rspec-support (~> 3.10)
161
+ rspec-support (3.10.1)
177
162
  sprockets (4.0.2)
178
163
  concurrent-ruby (~> 1.0)
179
164
  rack (> 1, < 3)
@@ -181,18 +166,14 @@ GEM
181
166
  actionpack (>= 4.0)
182
167
  activesupport (>= 4.0)
183
168
  sprockets (>= 3.0.0)
184
- standard (0.6.2)
185
- rubocop (= 0.91.1)
186
- rubocop-performance (= 1.8.1)
187
169
  thor (1.0.1)
188
- thread_safe (0.3.6)
189
170
  timecop (0.9.2)
190
- tzinfo (1.2.9)
191
- thread_safe (~> 0.1)
192
- unicode-display_width (1.7.0)
171
+ tzinfo (2.0.4)
172
+ concurrent-ruby (~> 1.0)
193
173
  websocket-driver (0.7.3)
194
174
  websocket-extensions (>= 0.1.0)
195
175
  websocket-extensions (0.1.5)
176
+ zeitwerk (2.4.2)
196
177
 
197
178
  PLATFORMS
198
179
  ruby
@@ -203,7 +184,6 @@ DEPENDENCIES
203
184
  bundler (>= 1.3)
204
185
  database_cleaner (>= 1.7)
205
186
  faker (>= 2.8)
206
- jetrockets-standard (~> 1.0.1)
207
187
  metka!
208
188
  pg (>= 1.1)
209
189
  pry (>= 0.12.2)
data/README.md CHANGED
@@ -1,11 +1,16 @@
1
1
  [![Gem Version](https://badge.fury.io/rb/metka.svg)](https://badge.fury.io/rb/metka)
2
- [![Build Status](https://travis-ci.org/jetrockets/metka.svg?branch=master)](https://travis-ci.org/jetrockets/metka)
2
+ [![Build Status](https://github.com/jetrockets/metka/workflows/Build/badge.svg?branch=master)](https://github.com/jetrockets/metka/actions)
3
3
  [![Open Source Helpers](https://www.codetriage.com/jetrockets/metka/badges/users.svg)](https://www.codetriage.com/jetrockets/metka)
4
4
 
5
5
  # Metka
6
6
 
7
7
  Rails gem to manage tags with PostgreSQL array columns.
8
8
 
9
+ :exclamation: Requirements:
10
+
11
+ * Ruby ~> 2.5
12
+ * Rails >= 5.2 (for Rails 5.1 and 5.0 use version <2.1.0)
13
+
9
14
  ## Installation
10
15
 
11
16
  Add this line to your application's Gemfile:
@@ -16,11 +21,15 @@ gem 'metka'
16
21
 
17
22
  And then execute:
18
23
 
19
- $ bundle
24
+ ```bash
25
+ bundle
26
+ ```
20
27
 
21
28
  Or install it yourself as:
22
29
 
23
- $ gem install metka
30
+ ```bash
31
+ gem install metka
32
+ ```
24
33
 
25
34
  ## Tag objects
26
35
 
@@ -32,9 +41,9 @@ rails g migration CreateSongs
32
41
  class CreateSongs < ActiveRecord::Migration[5.0]
33
42
  def change
34
43
  create_table :songs do |t|
35
- t.string :title
36
- t.string :tags, array: true
37
- t.string :genres, array: true
44
+ t.string :title
45
+ t.string :tags, array: true
46
+ t.string :genres, array: true
38
47
  t.timestamps
39
48
  end
40
49
  end
@@ -55,140 +64,152 @@ end
55
64
  ## Find tagged objects
56
65
 
57
66
  ### .with_all_#{column_name}
67
+
58
68
  ```ruby
59
69
  Song.with_all_tags('top')
60
- => [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
70
+ #=> [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
61
71
 
62
72
  Song.with_all_tags('top, 1990')
63
- => []
73
+ #=> []
64
74
 
65
75
  Song.with_all_tags('')
66
- => []
76
+ #=> []
67
77
 
68
78
  Song.with_all_genres('rock')
69
- => [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
79
+ #=> [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
70
80
  ```
71
81
 
72
82
  ### .with_any_#{column_name}
83
+
73
84
  ```ruby
74
85
  Song.with_any_tags('chill')
75
- => [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
86
+ #=> [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
76
87
 
77
88
  Song.with_any_tags('chill, 1980')
78
- => [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
89
+ #=> [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
79
90
 
80
91
  Song.with_any_tags('')
81
- => []
92
+ #=> []
82
93
 
83
94
  Song.with_any_genres('rock, rap')
84
- => [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
95
+ #=> [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
85
96
  ```
97
+
86
98
  ### .without_all_#{column_name}
99
+
87
100
  ```ruby
88
101
  Song.without_all_tags('top')
89
- => []
102
+ #=> []
90
103
 
91
104
  Song.without_all_tags('top, 1990')
92
- => [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
105
+ #=> [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
93
106
 
94
107
  Song.without_all_tags('')
95
- => []
108
+ #=> []
96
109
 
97
110
  Song.without_all_genres('rock, pop')
98
- => [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
111
+ #=> [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
99
112
 
100
113
  Song.without_all_genres('rock')
101
- => []
114
+ #=> []
102
115
  ```
103
116
 
104
117
  ### .without_any_#{column_name}
118
+
105
119
  ```ruby
106
120
  Song.without_any_tags('top, 1990')
107
- => []
121
+ #=> []
108
122
 
109
123
  Song.without_any_tags('1990, 1980')
110
- => [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
124
+ #=> [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
111
125
 
112
126
  Song.without_any_genres('rock, pop')
113
- => []
127
+ #=> []
114
128
 
115
129
  Song.without_any_genres('')
116
- => []
130
+ #=> []
117
131
  ```
118
132
 
119
133
  ### .tagged_with
134
+
120
135
  ```ruby
121
136
  Song.tagged_with('top')
122
- => [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
137
+ #=> [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
123
138
 
124
139
  Song.tagged_with('top, 1990')
125
- => []
140
+ #=> []
126
141
 
127
142
  Song.tagged_with('')
128
- => []
143
+ #=> []
129
144
 
130
145
  Song.tagged_with('rock')
131
- => [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
146
+ #=> [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
132
147
 
133
148
  Song.tagged_with('rock', join_operator: Metka::And)
134
- => []
149
+ #=> []
135
150
 
136
151
  Song.tagged_with('chill', any: true)
137
- => [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
152
+ #=> [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
138
153
 
139
154
  Song.tagged_with('chill, 1980', any: true)
140
- => [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
155
+ #=> [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
141
156
 
142
157
  Song.tagged_with('', any: true)
143
- => []
158
+ #=> []
144
159
 
145
160
  Song.tagged_with('rock, rap', any: true, on: ['genres'])
146
- => [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
161
+ #=> [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
147
162
 
148
163
  Song.without_all_tags('top')
149
- => []
164
+ #=> []
150
165
 
151
166
  Song.tagged_with('top, 1990', exclude: true)
152
- => [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
167
+ #=> [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
153
168
 
154
169
  Song.tagged_with('', exclude: true)
155
- => []
170
+ #=> []
156
171
 
157
172
  Song.tagged_with('top, 1990', any: true, exclude: true)
158
- => []
173
+ #=> []
159
174
 
160
175
  Song.tagged_with('1990, 1980', any: true, exclude: true)
161
- => [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
176
+ #=> [#<Song id: 1, title: 'Migrate tags in Rails to PostgreSQL', tags: ['top', 'chill'], genres: ['rock', 'jazz', 'pop']]
162
177
 
163
178
  Song.without_any_genres('rock, pop')
164
- => []
179
+ #=> []
165
180
  ```
166
181
 
167
182
  ## Custom delimiter
183
+
168
184
  By default, a comma is used as a delimiter to create tags from a string.
169
185
  You can make your own custom separator:
186
+
170
187
  ```ruby
171
188
  Metka.config.delimiter = '|'
172
189
  parsed_data = Metka::GenericParser.instance.call('cool, data|I have')
173
190
  parsed_data.to_a
174
- =>['cool, data', 'I have']
191
+ #=>['cool, data', 'I have']
175
192
  ```
176
193
 
177
194
  ## Tags with quote
195
+
178
196
  ```ruby
179
197
  parsed_data = Metka::GenericParser.instance.call("'cool, data', code")
180
198
  parsed_data.to_a
181
- => ['cool, data', 'code']
199
+ #=> ['cool, data', 'code']
182
200
  ```
183
201
 
184
202
  ## Custom parser
203
+
185
204
  By default we use [generic_parser](lib/metka/generic_parser.rb "generic_parser")
186
205
  If you want to use your custom parser you can do:
206
+
187
207
  ```ruby
188
208
  class Song < ActiveRecord::Base
189
209
  include Metka::Model(columns: %w[genres tags], parser: Your::Custom::Parser.instance)
190
210
  end
191
211
  ```
212
+
192
213
  Custom parser must be a singleton class that has a `.call` method that accepts the tag string
193
214
 
194
215
  ## Tag Cloud Strategies
@@ -200,29 +221,30 @@ There are several strategies to get tag statistics
200
221
  Data about taggings is accessible via class methods of your model with `Metka::Model` attached. You can calculate a cloud for a single tagged column or multiple columns, the latter case would return to you a sum of taggings from multiple tagged columns, that are provided as arguments, for each tag present. ActiveRecord Strategy is an easiest way to implement, since it wouldn't require any additional code, but it's the slowest one on SELECT.
201
222
 
202
223
  ```ruby
224
+
203
225
  class Book < ActiveRecord::Base
204
226
  include Metka::Model(column: 'authors')
205
227
  include Metka::Model(column: 'co_authors')
206
228
  end
207
229
 
208
230
  tag_cloud = Book.author_cloud
209
- => [["L.N. Tolstoy", 3], ["F.M. Dostoevsky", 6]]
231
+ #=> [["L.N. Tolstoy", 3], ["F.M. Dostoevsky", 6]]
210
232
  genre_cloud = Book.co_author_cloud
211
- => [["A.P. Chekhov", 5], ["N.V. Gogol", 8], ["L.N. Tolstoy", 2]]
233
+ #=> [["A.P. Chekhov", 5], ["N.V. Gogol", 8], ["L.N. Tolstoy", 2]]
212
234
  summary_cloud = Book.metka_cloud('authors', 'co_authors')
213
- => [["L.N. Tolstoy", 5], ["F.M. Dostoevsky", 6], ["A.P. Chekhov", 5], ["N.V. Gogol", 8]]
235
+ #=> [["L.N. Tolstoy", 5], ["F.M. Dostoevsky", 6], ["A.P. Chekhov", 5], ["N.V. Gogol", 8]]
214
236
  ```
215
237
 
216
238
  ### View Strategy
217
239
 
218
- Data about taggings will be agregated in SQL View. Performance-wise that strategy has no benefits over ActiveRecord Strategy, but if you need to store tags aggregations in a distinct model, that's an easiest way to achieve it.
240
+ Data about taggings will be aggregated in SQL View. Performance-wise that strategy has no benefits over ActiveRecord Strategy, but if you need to store tags aggregations in a distinct model, that's an easiest way to achieve it.
219
241
 
220
242
  ```bash
221
243
  rails g metka:strategies:view --source-table-name=NAME_OF_TABLE_WITH_TAGS [--source-columns=NAME_OF_COLUMN_1 NAME_OF_COLUMN_2] [--view-name=NAME_OF_RESULTING_VIEW]
222
244
  ```
223
245
 
224
246
  The code above will generate a migration that creates view with specified `NAME_OF_RESULTING_VIEW`, that would aggregate tags data from specified array of tagged columns [`NAME_OF_COLUMN_1`, `NAME_OF_COLUMN_2`, ...], that are present within specified table `NAME_OF_TABLE_WITH_TAGS`.
225
- If `source-columns` option is not provided, then `tags` column would be used as defaults. If array of multiple values would be provided to the option, then the aggregation would be made with the tags from multiple tagged columns, so if a single tag would be found within multiple tagged columns, the resulting aggregation inside the view would have a single row for that tag with a sum of it's occurences across all stated tagged columns.
247
+ If `source-columns` option is not provided, then `tags` column would be used as defaults. If array of multiple values would be provided to the option, then the aggregation would be made with the tags from multiple tagged columns, so if a single tag would be found within multiple tagged columns, the resulting aggregation inside the view would have a single row for that tag with a sum of it's occurrences across all stated tagged columns.
226
248
  `view-name` option is also optional, it would just force the resulting view's name to the one of your choice. If it's not provided, then view name would be generated automatically, you could check it within generated migration.
227
249
 
228
250
  Lets take a look at real example. We have a `notes` table with `tags` column.
@@ -290,7 +312,7 @@ Data about taggings will be aggregated in SQL Materialized View, that would be r
290
312
  rails g metka:strategies:materialized_view --source-table-name=NAME_OF_TABLE_WITH_TAGS --source-columns=NAME_OF_COLUMN_1 NAME_OF_COLUMN_2 --view-name=NAME_OF_RESULTING_VIEW
291
313
  ```
292
314
 
293
- All of the options for that stategy's generation command are the same as for the View Strategy.
315
+ All of the options for that strategy's generation command are the same as for the View Strategy.
294
316
 
295
317
  The migration template can be seen [here](spec/dummy/db/migrate/06_create_tagged_materialized_view_posts_materialized_view.rb "here")
296
318
 
@@ -308,11 +330,10 @@ And you can also create `TaggedNote` model to work with the view as with a Rails
308
330
 
309
331
  ### Table Strategy with Triggers
310
332
 
311
-
312
-
313
333
  TBD
314
334
 
315
335
  ## Inspired by
336
+
316
337
  1. [ActsAsTaggableOn](https://github.com/mbleigh/acts-as-taggable-on)
317
338
  2. [ActsAsTaggableArrayOn](https://github.com/tmiyamon/acts-as-taggable-array-on)
318
339
  3. [TagColumns](https://github.com/hopsoft/tag_columns)
@@ -447,9 +468,10 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
447
468
 
448
469
  ## Contributing
449
470
 
450
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/metka. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
471
+ Bug reports and pull requests are welcome on GitHub at [https://github.com/jetrockets/metka](https://github.com/jetrockets/metka). This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
451
472
 
452
473
  ## Credits
474
+
453
475
  ![JetRockets](https://media.jetrockets.pro/jetrockets-white.png)
454
476
  Metka is maintained by [JetRockets](http://www.jetrockets.ru).
455
477
 
@@ -0,0 +1,7 @@
1
+ # Format: one word per line. Empty lines and #-comments are supported too.
2
+ # If you want to add word with its forms, you can write 'word: example' (without quotes) on the line,
3
+ # where 'example' is existing word with the same possible forms (endings) as your word.
4
+ # Example: deduplicate: duplicate
5
+ Metka
6
+ taggings
7
+ benchmarked
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem 'rails', github: 'rails/rails'
4
+
5
+ gemspec path: '..'
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org" do
2
+ gem "rubocop-md", "~> 1.0"
3
+ gem "jetrockets-standard"
4
+ end
@@ -25,7 +25,7 @@ module Metka
25
25
 
26
26
  private
27
27
 
28
- def options_to_strategy options
28
+ def options_to_strategy(options)
29
29
  if options[:any].present?
30
30
  AnyTagsQuery
31
31
  else
@@ -7,22 +7,42 @@ module Metka
7
7
  include Singleton
8
8
 
9
9
  def call(model, column_name, tag_list)
10
- column_cast = Arel::Nodes::NamedFunction.new(
11
- 'CAST',
12
- [model.arel_table[column_name].as('text[]')]
13
- )
14
-
15
- value = Arel::Nodes::SqlLiteral.new(
16
- # In Rails 5.2 and above Sanitanization moved to public level, but still we have to support 4.2 and 5.0 and 5.1
17
- ActiveRecord::Base.send(:sanitize_sql_for_conditions, ['ARRAY[?]', tag_list.to_a])
18
- )
19
-
20
- value_cast = Arel::Nodes::NamedFunction.new(
21
- 'CAST',
22
- [value.as('text[]')]
23
- )
24
-
25
- Arel::Nodes::InfixOperation.new(infix_operator, column_cast, value_cast)
10
+ tags = tag_list.to_a
11
+
12
+ if tags.one?
13
+ value = Arel::Nodes::SqlLiteral.new(
14
+ ActiveRecord::Base.sanitize_sql_for_conditions(['?', tags.first])
15
+ )
16
+
17
+ column_cast = Arel::Nodes::NamedFunction.new(
18
+ 'ANY',
19
+ [model.arel_table[column_name]]
20
+ )
21
+
22
+ Arel::Nodes::Equality.new(value, column_cast)
23
+ else
24
+ value = Arel::Nodes::SqlLiteral.new(
25
+ ActiveRecord::Base.sanitize_sql_for_conditions(['ARRAY[?]::varchar[]', tags])
26
+ )
27
+
28
+ Arel::Nodes::InfixOperation.new(infix_operator, model.arel_table[column_name], value)
29
+ end
30
+ # column_cast = Arel::Nodes::NamedFunction.new(
31
+ # 'CAST',
32
+ # [model.arel_table[column_name].as('text[]')]
33
+ # )
34
+
35
+ # value = Arel::Nodes::SqlLiteral.new(
36
+ # ActiveRecord::Base.sanitize_sql_for_conditions(['ARRAY[?]::varchar[]', tag_list.to_a])
37
+ # )
38
+
39
+ # value_cast = Arel::Nodes::NamedFunction.new(
40
+ # 'CAST',
41
+ # [value.as('text[]')]
42
+ # )
43
+
44
+ # # Arel::Nodes::InfixOperation.new(infix_operator, column_cast, value_cast)
45
+ # Arel::Nodes::InfixOperation.new(infix_operator, model.arel_table[column_name], value)
26
46
  end
27
47
  end
28
48
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Metka
4
- VERSION = '2.1.0'
4
+ VERSION = '2.2.0'
5
5
  end
@@ -25,13 +25,12 @@ Gem::Specification.new do |spec|
25
25
  spec.require_paths = ['lib']
26
26
 
27
27
  spec.add_dependency 'dry-configurable', '>= 0.8'
28
- spec.add_dependency 'rails', '>= 5.1'
28
+ spec.add_dependency 'rails', '>= 5.2'
29
29
 
30
30
  spec.add_development_dependency 'ammeter', '>= 1.1'
31
31
  spec.add_development_dependency 'pry', '>= 0.12.2'
32
32
  spec.add_development_dependency 'bundler', '>= 1.3'
33
33
  spec.add_development_dependency 'faker', '>= 2.8'
34
- spec.add_development_dependency 'jetrockets-standard', '~> 1.0.1'
35
34
  spec.add_development_dependency 'pg', '>= 1.1'
36
35
  spec.add_development_dependency 'rake', '>= 0.8.7'
37
36
  spec.add_development_dependency 'rspec', '>= 3.9'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metka
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Alexandrov
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-12-25 00:00:00.000000000 Z
12
+ date: 2020-12-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: dry-configurable
@@ -31,14 +31,14 @@ dependencies:
31
31
  requirements:
32
32
  - - ">="
33
33
  - !ruby/object:Gem::Version
34
- version: '5.1'
34
+ version: '5.2'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
- version: '5.1'
41
+ version: '5.2'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: ammeter
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -95,20 +95,6 @@ dependencies:
95
95
  - - ">="
96
96
  - !ruby/object:Gem::Version
97
97
  version: '2.8'
98
- - !ruby/object:Gem::Dependency
99
- name: jetrockets-standard
100
- requirement: !ruby/object:Gem::Requirement
101
- requirements:
102
- - - "~>"
103
- - !ruby/object:Gem::Version
104
- version: 1.0.1
105
- type: :development
106
- prerelease: false
107
- version_requirements: !ruby/object:Gem::Requirement
108
- requirements:
109
- - - "~>"
110
- - !ruby/object:Gem::Version
111
- version: 1.0.1
112
98
  - !ruby/object:Gem::Dependency
113
99
  name: pg
114
100
  requirement: !ruby/object:Gem::Requirement
@@ -201,12 +187,16 @@ executables: []
201
187
  extensions: []
202
188
  extra_rdoc_files: []
203
189
  files:
204
- - ".github/workflows/continuous-integration-workflow.yml"
190
+ - ".github/ISSUE_TEMPLATE.md"
191
+ - ".github/workflows/docs.yml"
192
+ - ".github/workflows/rspec.yml"
193
+ - ".github/workflows/rubocop.yml"
205
194
  - ".gitignore"
195
+ - ".mdlrc"
206
196
  - ".rspec"
197
+ - ".rubocop-md.yml"
207
198
  - ".rubocop.yml"
208
199
  - ".ruby-version"
209
- - ".travis.yml"
210
200
  - CODE_OF_CONDUCT.md
211
201
  - Gemfile
212
202
  - Gemfile.lock
@@ -215,9 +205,12 @@ files:
215
205
  - Rakefile
216
206
  - bin/console
217
207
  - bin/setup
208
+ - forspell.dict
218
209
  - gemfiles/rails52.gemfile
219
210
  - gemfiles/rails6.gemfile
220
211
  - gemfiles/rails61.gemfile
212
+ - gemfiles/railsmaster.gemfile
213
+ - gemfiles/rubocop.gemfile
221
214
  - lib/generators/metka/strategies/materialized_view/materialized_view_generator.rb
222
215
  - lib/generators/metka/strategies/materialized_view/templates/migration.rb.erb
223
216
  - lib/generators/metka/strategies/view/templates/migration.rb.erb
@@ -1,11 +0,0 @@
1
- name: CI
2
- # This workflow is triggered on pushes to the repository.
3
- on: [push]
4
-
5
- jobs:
6
- build:
7
- name: RSpec
8
- # This job runs on Linux
9
- runs-on: ubuntu-latest
10
- steps:
11
- - uses: actions/checkout@v1
@@ -1,37 +0,0 @@
1
- ---
2
- language: ruby
3
- cache: bundler
4
-
5
- dist: trusty
6
- sudo: false
7
-
8
- notifications:
9
- email: false
10
-
11
- services:
12
- - postgresql
13
- addons:
14
- postgresql: "11.2"
15
-
16
- before_install:
17
- - gem install -v 2.0.2 bundler
18
- - sudo apt-get update
19
- - sudo apt-get --yes remove postgresql\*
20
- - sudo apt-get install -y postgresql-11 postgresql-client-11
21
- - sudo cp /etc/postgresql/{9.6,11}/main/pg_hba.conf
22
- - sudo service postgresql restart 11
23
-
24
- before_script:
25
- - psql -c 'CREATE ROLE travis SUPERUSER LOGIN CREATEDB;' -U postgres
26
- - ./bin/setup
27
-
28
- matrix:
29
- include:
30
- - rvm: 2.5.1
31
- gemfile: gemfiles/rails5.gemfile
32
- - rvm: 2.5.5
33
- gemfile: gemfiles/rails52.gemfile
34
- - rvm: 2.6.2
35
- gemfile: gemfiles/rails6.gemfile
36
- - rvm: 2.7.2
37
- gemfile: gemfiles/rails61.gemfile