gemika 0.3.4 → 0.6.1

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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +114 -0
  3. data/.ruby-version +1 -1
  4. data/CHANGELOG.md +91 -0
  5. data/{gemfiles/Gemfile.3.2.mysql2 → Gemfile.3.2.mysql2} +4 -3
  6. data/{gemfiles/Gemfile.3.2.mysql2.lock → Gemfile.3.2.mysql2.lock} +19 -5
  7. data/{gemfiles/Gemfile.4.2.mysql2 → Gemfile.4.2.mysql2} +3 -2
  8. data/{gemfiles/Gemfile.4.2.mysql2.lock → Gemfile.4.2.mysql2.lock} +11 -5
  9. data/{gemfiles/Gemfile.4.2.pg → Gemfile.4.2.pg} +2 -1
  10. data/{gemfiles/Gemfile.4.2.pg.lock → Gemfile.4.2.pg.lock} +9 -3
  11. data/{gemfiles/Gemfile.5.0.mysql2 → Gemfile.5.2.mysql2} +4 -3
  12. data/{gemfiles/Gemfile.5.0.mysql2.lock → Gemfile.5.2.mysql2.lock} +28 -21
  13. data/{gemfiles/Gemfile.5.0.pg → Gemfile.5.2.pg} +3 -2
  14. data/{gemfiles/Gemfile.5.0.pg.lock → Gemfile.5.2.pg.lock} +26 -19
  15. data/{gemfiles/Gemfile.5.0.sqlite3 → Gemfile.5.2.sqlite3} +3 -2
  16. data/{gemfiles/Gemfile.5.0.sqlite3.lock → Gemfile.5.2.sqlite3.lock} +20 -14
  17. data/Gemfile.6.1.pg +17 -0
  18. data/Gemfile.6.1.pg.lock +66 -0
  19. data/README.md +117 -49
  20. data/gemika.gemspec +2 -2
  21. data/lib/gemika/database.rb +9 -3
  22. data/lib/gemika/env.rb +15 -1
  23. data/lib/gemika/errors.rb +2 -0
  24. data/lib/gemika/github_actions_generator.rb +150 -0
  25. data/lib/gemika/matrix.rb +38 -33
  26. data/lib/gemika/matrix/github_actions_config.rb +61 -0
  27. data/lib/gemika/matrix/travis_config.rb +42 -0
  28. data/lib/gemika/tasks.rb +1 -0
  29. data/lib/gemika/tasks/gemika.rb +14 -0
  30. data/lib/gemika/tasks/matrix.rb +4 -4
  31. data/lib/gemika/version.rb +1 -1
  32. data/spec/fixtures/github_actions_yml/Gemfile_without_gemika +1 -0
  33. data/spec/fixtures/github_actions_yml/excludes.yml +13 -0
  34. data/spec/fixtures/github_actions_yml/gemfile_without_gemika.yml +8 -0
  35. data/spec/fixtures/github_actions_yml/includes.yml +20 -0
  36. data/spec/fixtures/github_actions_yml/invalid.yml +8 -0
  37. data/spec/fixtures/github_actions_yml/missing_gemfile.yml +8 -0
  38. data/spec/fixtures/github_actions_yml/multiple_jobs.yml +16 -0
  39. data/spec/fixtures/github_actions_yml/two_by_two.yml +10 -0
  40. data/spec/fixtures/migrate/expected_github_actions.yml +129 -0
  41. data/spec/fixtures/migrate/travis.yml +66 -0
  42. data/spec/fixtures/travis_yml/includes.yml +12 -0
  43. data/spec/gemika/matrix_spec.rb +116 -0
  44. data/spec/spec_helper.rb +1 -0
  45. data/spec/support/database.github.yml +13 -0
  46. metadata +35 -21
  47. data/.travis.yml +0 -62
  48. data/Gemfile.lock +0 -63
  49. data/gemfiles/Gemfile.2.3.mysql2 +0 -17
  50. data/gemfiles/Gemfile.2.3.mysql2.lock +0 -34
  51. data/spec/support/database.travis.yml +0 -9
@@ -9,7 +9,7 @@ namespace :matrix do
9
9
 
10
10
  desc "Run specs for all Ruby #{RUBY_VERSION} gemfiles"
11
11
  task :spec, :files do |t, options|
12
- Gemika::Matrix.from_travis_yml.each do |row|
12
+ Gemika::Matrix.from_ci_config.each do |row|
13
13
  options = options.to_hash.merge(
14
14
  :gemfile => row.gemfile,
15
15
  :fatal => false,
@@ -21,21 +21,21 @@ namespace :matrix do
21
21
 
22
22
  desc "Install all Ruby #{RUBY_VERSION} gemfiles"
23
23
  task :install do
24
- Gemika::Matrix.from_travis_yml.each do |row|
24
+ Gemika::Matrix.from_ci_config.each do |row|
25
25
  system('bundle install')
26
26
  end
27
27
  end
28
28
 
29
29
  desc "List dependencies for all Ruby #{RUBY_VERSION} gemfiles"
30
30
  task :list do
31
- Gemika::Matrix.from_travis_yml.each do |row|
31
+ Gemika::Matrix.from_ci_config.each do |row|
32
32
  system('bundle list')
33
33
  end
34
34
  end
35
35
 
36
36
  desc "Update all Ruby #{RUBY_VERSION} gemfiles"
37
37
  task :update, :gems do |t, options|
38
- Gemika::Matrix.from_travis_yml.each do |row|
38
+ Gemika::Matrix.from_ci_config.each do |row|
39
39
  system("bundle update #{options[:gems]}")
40
40
  end
41
41
  end
@@ -1,3 +1,3 @@
1
1
  module Gemika
2
- VERSION = '0.3.4'
2
+ VERSION = '0.6.1'
3
3
  end
@@ -0,0 +1 @@
1
+ gem 'some-gem'
@@ -0,0 +1,13 @@
1
+ jobs:
2
+ first_job:
3
+ strategy:
4
+ matrix:
5
+ ruby:
6
+ - "2.1.8"
7
+ - "2.3.1"
8
+ gemfile:
9
+ - gemfiles/Gemfile1
10
+ - gemfiles/Gemfile2
11
+ exclude:
12
+ - ruby: 2.1.8
13
+ gemfile: gemfiles/Gemfile1
@@ -0,0 +1,8 @@
1
+ jobs:
2
+ first_job:
3
+ strategy:
4
+ matrix:
5
+ ruby:
6
+ - 2.1.8
7
+ gemfile:
8
+ - spec/fixtures/travis_yml/Gemfile_without_gemika
@@ -0,0 +1,20 @@
1
+ matrix:
2
+ jobs:
3
+ first_job:
4
+ strategy:
5
+ matrix:
6
+ ruby:
7
+ - "2.1.8"
8
+ - "2.3.1"
9
+ gemfile:
10
+ - gemfiles/Gemfile1
11
+ - gemfiles/Gemfile2
12
+ include:
13
+ - ruby: 2.6.3
14
+ gemfile: gemfiles/Gemfile3
15
+ second_job:
16
+ strategy:
17
+ matrix:
18
+ include:
19
+ - ruby: 2.7.1
20
+ gemfile: gemfiles/Gemfile3
@@ -0,0 +1,8 @@
1
+ jobs:
2
+ first_job:
3
+ strategy:
4
+ matrix:
5
+ ruby_version:
6
+ - "2.1.8"
7
+ gemfile:
8
+ - gemfiles/Gemfile1
@@ -0,0 +1,8 @@
1
+ jobs:
2
+ first_job:
3
+ strategy:
4
+ matrix:
5
+ ruby:
6
+ - 2.1.8
7
+ gemfile:
8
+ - gemfiles/nonexisting_gemfile
@@ -0,0 +1,16 @@
1
+ jobs:
2
+ first_job:
3
+ strategy:
4
+ matrix:
5
+ ruby:
6
+ - "2.1.8"
7
+ gemfile:
8
+ - gemfiles/Gemfile1
9
+
10
+ second_job:
11
+ strategy:
12
+ matrix:
13
+ ruby:
14
+ - "2.3.1"
15
+ gemfile:
16
+ - gemfiles/Gemfile2
@@ -0,0 +1,10 @@
1
+ jobs:
2
+ first_job:
3
+ strategy:
4
+ matrix:
5
+ ruby:
6
+ - "2.1.8"
7
+ - "2.3.1"
8
+ gemfile:
9
+ - gemfiles/Gemfile1
10
+ - gemfiles/Gemfile2
@@ -0,0 +1,129 @@
1
+ name: Tests
2
+ 'on':
3
+ push:
4
+ branches:
5
+ - master
6
+ pull_request:
7
+ branches:
8
+ - master
9
+ jobs:
10
+ test_mysql:
11
+ runs-on: ubuntu-20.04
12
+ services:
13
+ mysql:
14
+ image: mysql:5.6
15
+ env:
16
+ MYSQL_ROOT_PASSWORD: password
17
+ options: --health-cmd "mysqladmin ping" --health-interval 10s --health-timeout
18
+ 5s --health-retries 5
19
+ ports:
20
+ - 3306:3306
21
+ strategy:
22
+ fail-fast: false
23
+ matrix:
24
+ include:
25
+ - ruby: 1.8.7
26
+ gemfile: Gemfile.2.3.mysql2
27
+ - ruby: 1.8.7
28
+ gemfile: Gemfile.3.2.mysql2
29
+ - ruby: 2.1.8
30
+ gemfile: Gemfile.3.2.mysql2
31
+ - ruby: 2.2.4
32
+ gemfile: Gemfile.3.2.mysql2
33
+ - ruby: 2.1.8
34
+ gemfile: Gemfile.4.2.mysql2
35
+ - ruby: 2.2.4
36
+ gemfile: Gemfile.4.2.mysql2
37
+ - ruby: 2.3.1
38
+ gemfile: Gemfile.4.2.mysql2
39
+ - ruby: 2.2.4
40
+ gemfile: Gemfile.5.2.mysql2
41
+ - ruby: 2.3.1
42
+ gemfile: Gemfile.5.2.mysql2
43
+ env:
44
+ BUNDLE_GEMFILE: "${{ matrix.gemfile }}"
45
+ steps:
46
+ - uses: actions/checkout@v2
47
+ - name: Install ruby
48
+ uses: ruby/setup-ruby@v1
49
+ with:
50
+ ruby-version: "${{ matrix.ruby }}"
51
+ - name: Setup database
52
+ run: |
53
+ sudo apt-get install -y mysql-client libmariadbclient-dev
54
+ mysql -e 'create database IF NOT EXISTS test;' -u root --password=password -P 3306 -h 127.0.0.1
55
+ - name: Bundle
56
+ run: |
57
+ gem install bundler:2.2.15
58
+ bundle install --no-deployment
59
+ - name: Run tests
60
+ run: bundle exec rspec
61
+ test_pg:
62
+ runs-on: ubuntu-20.04
63
+ services:
64
+ postgres:
65
+ image: postgres
66
+ env:
67
+ POSTGRES_PASSWORD: postgres
68
+ options: "--health-cmd pg_isready --health-interval 10s --health-timeout 5s
69
+ --health-retries 5"
70
+ ports:
71
+ - 5432:5432
72
+ strategy:
73
+ fail-fast: false
74
+ matrix:
75
+ include:
76
+ - ruby: 2.1.8
77
+ gemfile: Gemfile.4.2.pg
78
+ - ruby: 2.2.4
79
+ gemfile: Gemfile.4.2.pg
80
+ - ruby: 2.3.1
81
+ gemfile: Gemfile.4.2.pg
82
+ - ruby: 2.2.4
83
+ gemfile: Gemfile.5.2.pg
84
+ - ruby: 2.3.1
85
+ gemfile: Gemfile.5.2.pg
86
+ - ruby: 2.6.4
87
+ gemfile: Gemfile.6.1.pg
88
+ env:
89
+ BUNDLE_GEMFILE: "${{ matrix.gemfile }}"
90
+ steps:
91
+ - uses: actions/checkout@v2
92
+ - name: Install ruby
93
+ uses: ruby/setup-ruby@v1
94
+ with:
95
+ ruby-version: "${{ matrix.ruby }}"
96
+ - name: Setup database
97
+ run: |
98
+ sudo apt-get install -y postgresql-client
99
+ PGPASSWORD=postgres psql -c 'create database test;' -U postgres -p 5432 -h localhost
100
+ - name: Bundle
101
+ run: |
102
+ gem install bundler:2.2.15
103
+ bundle install --no-deployment
104
+ - name: Run tests
105
+ run: bundle exec rspec
106
+ test_sqlite:
107
+ runs-on: ubuntu-20.04
108
+ strategy:
109
+ fail-fast: false
110
+ matrix:
111
+ include:
112
+ - ruby: 2.2.4
113
+ gemfile: Gemfile.5.2.sqlite3
114
+ - ruby: 2.3.1
115
+ gemfile: Gemfile.5.2.sqlite3
116
+ env:
117
+ BUNDLE_GEMFILE: "${{ matrix.gemfile }}"
118
+ steps:
119
+ - uses: actions/checkout@v2
120
+ - name: Install ruby
121
+ uses: ruby/setup-ruby@v1
122
+ with:
123
+ ruby-version: "${{ matrix.ruby }}"
124
+ - name: Bundle
125
+ run: |
126
+ gem install bundler:2.2.15
127
+ bundle install --no-deployment
128
+ - name: Run tests
129
+ run: bundle exec rspec
@@ -0,0 +1,66 @@
1
+ language: ruby
2
+
3
+ dist: trusty
4
+
5
+ services:
6
+ - postgresql
7
+
8
+ matrix:
9
+ include:
10
+ # Rails 2.3
11
+ - gemfile: Gemfile.2.3.mysql2
12
+ rvm: 1.8.7
13
+ # Rails 3.2
14
+ - gemfile: Gemfile.3.2.mysql2
15
+ rvm: 1.8.7
16
+ - gemfile: Gemfile.3.2.mysql2
17
+ rvm: 2.1.8
18
+ - gemfile: Gemfile.3.2.mysql2
19
+ rvm: 2.2.4
20
+ # Rails 4.2
21
+ - gemfile: Gemfile.4.2.mysql2
22
+ rvm: 2.1.8
23
+ - gemfile: Gemfile.4.2.pg
24
+ rvm: 2.1.8
25
+ - gemfile: Gemfile.4.2.mysql2
26
+ rvm: 2.2.4
27
+ - gemfile: Gemfile.4.2.pg
28
+ rvm: 2.2.4
29
+ - gemfile: Gemfile.4.2.mysql2
30
+ rvm: 2.3.1
31
+ - gemfile: Gemfile.4.2.pg
32
+ rvm: 2.3.1
33
+ # Rails 5.2
34
+ - gemfile: Gemfile.5.2.mysql2
35
+ rvm: 2.2.4
36
+ - gemfile: Gemfile.5.2.pg
37
+ rvm: 2.2.4
38
+ - gemfile: Gemfile.5.2.sqlite3
39
+ rvm: 2.2.4
40
+ - gemfile: Gemfile.5.2.mysql2
41
+ rvm: 2.3.1
42
+ - gemfile: Gemfile.5.2.pg
43
+ rvm: 2.3.1
44
+ - gemfile: Gemfile.5.2.sqlite3
45
+ rvm: 2.3.1
46
+ # Rails 6.0
47
+ - gemfile: Gemfile.6.1.pg
48
+ rvm: 2.6.4
49
+
50
+ install:
51
+ # Replace default Travis CI bundler script with a version that doesn't
52
+ # explode when lockfile doesn't match recently bumped version
53
+ - bundle install --no-deployment --jobs=3 --retry=3 --path=${BUNDLE_PATH:-vendor/bundle}
54
+
55
+ before_script:
56
+ - psql -c 'create database gemika_test;' -U postgres
57
+ - mysql -e 'create database IF NOT EXISTS gemika_test;'
58
+
59
+ script: bundle exec rake current_rspec
60
+
61
+ sudo: false
62
+
63
+ cache: bundler
64
+
65
+ addons:
66
+ postgresql: 9.3
@@ -0,0 +1,12 @@
1
+ rvm:
2
+ - 2.1.8
3
+ - 2.3.1
4
+
5
+ gemfile:
6
+ - gemfiles/Gemfile1
7
+ - gemfiles/Gemfile2
8
+
9
+ matrix:
10
+ include:
11
+ - rvm: 2.6.3
12
+ gemfile: gemfiles/Gemfile3
@@ -131,6 +131,22 @@ EOF
131
131
  matrix.rows[2].gemfile.should == 'gemfiles/Gemfile2'
132
132
  end
133
133
 
134
+ it 'allows to include rows to the matrix' do
135
+ path = 'spec/fixtures/travis_yml/includes.yml'
136
+ matrix = Gemika::Matrix.from_travis_yml(:path => path, :validate => false)
137
+ matrix.rows.size.should == 5
138
+ matrix.rows[0].ruby.should == '2.1.8'
139
+ matrix.rows[0].gemfile.should == 'gemfiles/Gemfile1'
140
+ matrix.rows[1].ruby.should == '2.1.8'
141
+ matrix.rows[1].gemfile.should == 'gemfiles/Gemfile2'
142
+ matrix.rows[2].ruby.should == '2.3.1'
143
+ matrix.rows[2].gemfile.should == 'gemfiles/Gemfile1'
144
+ matrix.rows[3].ruby.should == '2.3.1'
145
+ matrix.rows[3].gemfile.should == 'gemfiles/Gemfile2'
146
+ matrix.rows[4].ruby.should == '2.6.3'
147
+ matrix.rows[4].gemfile.should == 'gemfiles/Gemfile3'
148
+ end
149
+
134
150
  it 'raises an error if a Gemfile does not exist' do
135
151
  path = 'spec/fixtures/travis_yml/missing_gemfile.yml'
136
152
  expect { Gemika::Matrix.from_travis_yml(:path => path) }.to raise_error(Gemika::MissingGemfile, /gemfile not found/i)
@@ -143,4 +159,104 @@ EOF
143
159
 
144
160
  end
145
161
 
162
+ describe '.from_github_actions_yml' do
163
+
164
+ it 'builds a matrix by combining Ruby versions and gemfiles from a Github Actions workflow configuration file' do
165
+ path = 'spec/fixtures/github_actions_yml/two_by_two.yml'
166
+ matrix = Gemika::Matrix.from_github_actions_yml(:path => path, :validate => false)
167
+ matrix.rows.size.should == 4
168
+ matrix.rows[0].ruby.should == '2.1.8'
169
+ matrix.rows[0].gemfile.should == 'gemfiles/Gemfile1'
170
+ matrix.rows[1].ruby.should == '2.1.8'
171
+ matrix.rows[1].gemfile.should == 'gemfiles/Gemfile2'
172
+ matrix.rows[2].ruby.should == '2.3.1'
173
+ matrix.rows[2].gemfile.should == 'gemfiles/Gemfile1'
174
+ matrix.rows[3].ruby.should == '2.3.1'
175
+ matrix.rows[3].gemfile.should == 'gemfiles/Gemfile2'
176
+ end
177
+
178
+ it 'combines matrixes of multiple jobs' do
179
+ path = 'spec/fixtures/github_actions_yml/multiple_jobs.yml'
180
+ matrix = Gemika::Matrix.from_github_actions_yml(:path => path, :validate => false)
181
+ matrix.rows.size.should == 2
182
+ matrix.rows[0].ruby.should == '2.1.8'
183
+ matrix.rows[0].gemfile.should == 'gemfiles/Gemfile1'
184
+ matrix.rows[1].ruby.should == '2.3.1'
185
+ matrix.rows[1].gemfile.should == 'gemfiles/Gemfile2'
186
+ end
187
+
188
+ it 'allows to exclude rows from the matrix' do
189
+ path = 'spec/fixtures/github_actions_yml/excludes.yml'
190
+ matrix = Gemika::Matrix.from_github_actions_yml(:path => path, :validate => false)
191
+ matrix.rows.size.should == 3
192
+ matrix.rows[0].ruby.should == '2.1.8'
193
+ matrix.rows[0].gemfile.should == 'gemfiles/Gemfile2'
194
+ matrix.rows[1].ruby.should == '2.3.1'
195
+ matrix.rows[1].gemfile.should == 'gemfiles/Gemfile1'
196
+ matrix.rows[2].ruby.should == '2.3.1'
197
+ matrix.rows[2].gemfile.should == 'gemfiles/Gemfile2'
198
+ end
199
+
200
+ it 'allows to include rows to the matrix' do
201
+ path = 'spec/fixtures/github_actions_yml/includes.yml'
202
+ matrix = Gemika::Matrix.from_github_actions_yml(:path => path, :validate => false)
203
+ matrix.rows.size.should == 6
204
+ matrix.rows[0].ruby.should == '2.1.8'
205
+ matrix.rows[0].gemfile.should == 'gemfiles/Gemfile1'
206
+ matrix.rows[1].ruby.should == '2.1.8'
207
+ matrix.rows[1].gemfile.should == 'gemfiles/Gemfile2'
208
+ matrix.rows[2].ruby.should == '2.3.1'
209
+ matrix.rows[2].gemfile.should == 'gemfiles/Gemfile1'
210
+ matrix.rows[3].ruby.should == '2.3.1'
211
+ matrix.rows[3].gemfile.should == 'gemfiles/Gemfile2'
212
+ matrix.rows[4].ruby.should == '2.6.3'
213
+ matrix.rows[4].gemfile.should == 'gemfiles/Gemfile3'
214
+ matrix.rows[5].ruby.should == '2.7.1'
215
+ matrix.rows[5].gemfile.should == 'gemfiles/Gemfile3'
216
+ end
217
+
218
+ it 'complains about missing keys' do
219
+ path = 'spec/fixtures/github_actions_yml/invalid.yml'
220
+ expect { Gemika::Matrix.from_github_actions_yml(:path => path) }.to raise_error(Gemika::InvalidMatrixDefinition)
221
+ end
222
+
223
+ it 'raises an error if a Gemfile does not exist' do
224
+ path = 'spec/fixtures/github_actions_yml/missing_gemfile.yml'
225
+ expect { Gemika::Matrix.from_github_actions_yml(:path => path) }.to raise_error(Gemika::MissingGemfile, /gemfile not found/i)
226
+ end
227
+
228
+ it 'raises an error if a Gemfile does not depend on "gemika"' do
229
+ path = 'spec/fixtures/github_actions_yml/gemfile_without_gemika.yml'
230
+ expect { Gemika::Matrix.from_github_actions_yml(:path => path) }.to raise_error(Gemika::UnusableGemfile, /missing gemika dependency/i)
231
+ end
232
+
233
+ end
234
+
235
+ describe '.from_ci_config' do
236
+ it 'parses the .travis.yml if it exists' do
237
+ File.should_receive(:exists?).with('.travis.yml').and_return(true)
238
+ Gemika::Matrix.should_receive(:from_travis_yml).and_return('travis matrix')
239
+ Gemika::Matrix.from_ci_config.should == 'travis matrix'
240
+ end
241
+
242
+ it 'parses the .github/workflows/test.yml if it exists' do
243
+ File.should_receive(:exists?).with('.travis.yml').and_return(false)
244
+ File.should_receive(:exists?).with('.github/workflows/test.yml').and_return(true)
245
+ Gemika::Matrix.should_receive(:from_github_actions_yml).and_return('github matrix')
246
+ Gemika::Matrix.from_ci_config.should == 'github matrix'
247
+ end
248
+
249
+ it 'raises an error if no ci definition exists' do
250
+ File.should_receive(:exists?).with('.travis.yml').and_return(false)
251
+ File.should_receive(:exists?).with('.github/workflows/test.yml').and_return(false)
252
+ expect { Gemika::Matrix.from_ci_config }.to raise_error(Gemika::MissingMatrixDefinition)
253
+ end
254
+ end
255
+
256
+ describe '.generate_github_actions_workflow' do
257
+ github_actions_workflow = Gemika::Matrix.generate_github_actions_workflow(path: 'spec/fixtures/migrate/travis.yml')
258
+ expected_github_actions_workflow = YAML.load_file('spec/fixtures/migrate/expected_github_actions.yml')
259
+ github_actions_workflow.should == expected_github_actions_workflow
260
+ end
261
+
146
262
  end