lhm-shopify 3.5.0 → 3.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +17 -4
  3. data/.gitignore +0 -2
  4. data/Appraisals +24 -0
  5. data/CHANGELOG.md +23 -0
  6. data/Gemfile.lock +66 -0
  7. data/README.md +53 -0
  8. data/Rakefile +6 -5
  9. data/dev.yml +18 -3
  10. data/docker-compose.yml +15 -3
  11. data/gemfiles/activerecord_5.2.gemfile +9 -0
  12. data/gemfiles/activerecord_5.2.gemfile.lock +65 -0
  13. data/gemfiles/activerecord_6.0.gemfile +7 -0
  14. data/gemfiles/activerecord_6.0.gemfile.lock +67 -0
  15. data/gemfiles/activerecord_6.1.gemfile +7 -0
  16. data/gemfiles/activerecord_6.1.gemfile.lock +66 -0
  17. data/gemfiles/activerecord_7.0.0.alpha2.gemfile +7 -0
  18. data/gemfiles/activerecord_7.0.0.alpha2.gemfile.lock +64 -0
  19. data/lhm.gemspec +7 -3
  20. data/lib/lhm/atomic_switcher.rb +4 -3
  21. data/lib/lhm/chunk_insert.rb +7 -3
  22. data/lib/lhm/chunker.rb +6 -6
  23. data/lib/lhm/cleanup/current.rb +4 -1
  24. data/lib/lhm/connection.rb +66 -19
  25. data/lib/lhm/entangler.rb +5 -4
  26. data/lib/lhm/invoker.rb +5 -3
  27. data/lib/lhm/locked_switcher.rb +2 -0
  28. data/lib/lhm/proxysql_helper.rb +10 -0
  29. data/lib/lhm/sql_retry.rb +135 -11
  30. data/lib/lhm/throttler/slave_lag.rb +19 -2
  31. data/lib/lhm/version.rb +1 -1
  32. data/lib/lhm.rb +32 -12
  33. data/scripts/mysql/writer/create_users.sql +3 -0
  34. data/spec/integration/atomic_switcher_spec.rb +38 -10
  35. data/spec/integration/chunk_insert_spec.rb +2 -1
  36. data/spec/integration/chunker_spec.rb +8 -6
  37. data/spec/integration/database.yml +10 -0
  38. data/spec/integration/entangler_spec.rb +3 -1
  39. data/spec/integration/integration_helper.rb +20 -4
  40. data/spec/integration/lhm_spec.rb +75 -0
  41. data/spec/integration/proxysql_spec.rb +34 -0
  42. data/spec/integration/sql_retry/db_connection_helper.rb +52 -0
  43. data/spec/integration/sql_retry/lock_wait_spec.rb +8 -6
  44. data/spec/integration/sql_retry/lock_wait_timeout_test_helper.rb +19 -9
  45. data/spec/integration/sql_retry/proxysql_helper.rb +22 -0
  46. data/spec/integration/sql_retry/retry_with_proxysql_spec.rb +108 -0
  47. data/spec/integration/toxiproxy_helper.rb +40 -0
  48. data/spec/test_helper.rb +21 -0
  49. data/spec/unit/chunk_insert_spec.rb +7 -2
  50. data/spec/unit/chunker_spec.rb +46 -42
  51. data/spec/unit/connection_spec.rb +51 -8
  52. data/spec/unit/entangler_spec.rb +71 -19
  53. data/spec/unit/lhm_spec.rb +17 -0
  54. data/spec/unit/throttler/slave_lag_spec.rb +14 -9
  55. metadata +76 -11
  56. data/gemfiles/ar-2.3_mysql.gemfile +0 -6
  57. data/gemfiles/ar-3.2_mysql.gemfile +0 -5
  58. data/gemfiles/ar-3.2_mysql2.gemfile +0 -5
  59. data/gemfiles/ar-4.0_mysql2.gemfile +0 -5
  60. data/gemfiles/ar-4.1_mysql2.gemfile +0 -5
  61. data/gemfiles/ar-4.2_mysql2.gemfile +0 -5
  62. data/gemfiles/ar-5.0_mysql2.gemfile +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6028b7c6d8d1f2e2d8b786ae3e8f41c4525c7507529085c3427a8dc9cf11bd2e
4
- data.tar.gz: de625eda2736c56cfa813ba73f8447f6e798c30080274d91164b895879a7f3a7
3
+ metadata.gz: 4f676427b10052113b08c4dda8f648bc11234024deab2f1e96de332e0906a110
4
+ data.tar.gz: dbd91d1b72d713e9d6e18edb46900971ee89c20563d5e93db9eec746887a12d7
5
5
  SHA512:
6
- metadata.gz: 6561aadaa26f6f28f4fd04987a7fca180e9130194cd756cc5a53a654e060b7bd93efaec78a6b067d39e2b31fd6b4f1826a4de9ac90da162af912b1dd101b8732
7
- data.tar.gz: b221afa7215cf36f66fdd48ffd449a2d6034c8710c36d9ccdbf909b2078b83fc610fa1c1170214752371e50f41ed6504186975c80e5a8164ef6b25dce631fe89
6
+ metadata.gz: be5dc9f5d6d2a3ae62b476fa19455bd0f864b989d6ffbff35a93a0afea4e8d9be4492a4b3bfc2bec1029193114187eaf4eda5bb6dfde9d0be34884bde317c1c1
7
+ data.tar.gz: aa4e866f74da3255586c1597ae63a3792606bd092e46c3a90335d22b9f6c9b243bc133d99e50233c884b03064dfaeee75983597f84733484e05ec456833f3395
@@ -10,15 +10,28 @@ jobs:
10
10
  test:
11
11
  name: Run tests
12
12
  runs-on: ubuntu-latest
13
+
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ include:
18
+ - ruby-version: "2.4"
19
+ activerecord-version: "5.2"
20
+ - ruby-version: "2.5"
21
+ activerecord-version: "6.0"
22
+ - ruby-version: "2.7.5"
23
+ activerecord-version: "6.1"
24
+ - ruby-version: "3.0"
25
+ activerecord-version: "7.0.0.alpha2"
13
26
  steps:
14
27
  - uses: actions/checkout@v2
15
28
  - name: Set up Ruby
16
29
  uses: ruby/setup-ruby@v1
17
30
  with:
18
- ruby-version: 2.5.1
19
- bundler-cache: true
31
+ ruby-version: ${{matrix.ruby-version}}
32
+ bundler-cache: false
20
33
  - name: Install Ruby packages
21
- run: bundle install
34
+ run: BUNDLE_GEMFILE="${GITHUB_WORKSPACE}/gemfiles/activerecord_${{ matrix.activerecord-version }}.gemfile" bundle install
22
35
  - name: Install Ubuntu packages
23
36
  run: sudo apt-get update && sudo apt-get install numactl libaio-dev libmysqlclient-dev
24
37
  - name: Setup MySQL and ProxySQL (docker-compose)
@@ -27,4 +40,4 @@ jobs:
27
40
  run: ./scripts/helpers/wait-for-dbs.sh
28
41
  timeout-minutes: 2
29
42
  - name: Run tests
30
- run: bundle exec rake specs
43
+ run: BUNDLE_GEMFILE="${GITHUB_WORKSPACE}/gemfiles/activerecord_${{ matrix.activerecord-version }}.gemfile" bundle exec rake specs
data/.gitignore CHANGED
@@ -1,6 +1,5 @@
1
1
  *.gem
2
2
  .bundle
3
- gemfiles/*.lock
4
3
  pkg/*
5
4
  .rvmrc
6
5
  .ruby-version
@@ -11,4 +10,3 @@ omg.ponies
11
10
  *~
12
11
  coverage
13
12
  .idea/
14
- Gemfile.lock
data/Appraisals ADDED
@@ -0,0 +1,24 @@
1
+ # Oldest supported Rails version
2
+ appraise "activerecord-5.2" do
3
+ gem "activerecord", "5.2.6"
4
+
5
+ # This gemfile will be ran against ruby 2.4 and some gems might require 2.4+. The following list are the gems
6
+ # and their respective versions that work with ruby <= 2.4
7
+ gem "simplecov", "0.18.5"
8
+ gem "docile", "1.3.5"
9
+ end
10
+
11
+ # First conflicted version
12
+ appraise "activerecord-6.0" do
13
+ gem "activerecord", "6.0.0"
14
+ end
15
+
16
+ # Second conflicted version
17
+ appraise "activerecord-6.1" do
18
+ gem "activerecord", "6.1.0"
19
+ end
20
+
21
+ # Latest version at the moment
22
+ appraise "activerecord-7.0.0.alpha2" do
23
+ gem "activerecord", "7.0.0.alpha2"
24
+ end
data/CHANGELOG.md CHANGED
@@ -1,3 +1,26 @@
1
+ # 3.5.4 (Dec, 2021)
2
+ * Refactored the way options are handled internally. Code is now much clearer to understand
3
+ * Removed optional connection_options from `Lhm.setup` and `Lhm.connection`
4
+ * Option `reconnect_with_consistent_host` will now be provided with `options` for `Lhm.change_table`
5
+
6
+ # 3.5.3 (Dec, 2021)
7
+ * Adds ProxySQL comments at the end of query to accommodate for internal tool's requirements
8
+
9
+ # 3.5.2 (Dec, 2021)
10
+ * Fixed error on undefined connection, when calling `Lhm.connection` without calling `Lhm.setup` first
11
+ * Changed `Lhm.connection.connection` to `lhm.connection.ar_connection` for increased clarity and readability
12
+
13
+ # 3.5.1 (Dec , 2021)
14
+ * Add better logging to the LHM components (https://github.com/Shopify/lhm/pull/112)
15
+ * Slave lag throttler now supports ActiveRecord > 6.0
16
+ * [Dev] Add `Appraisals` to test against multiple version
17
+
18
+ # 3.5.0 (Dec , 2021)
19
+ * Duplicate of 3.4.2 (unfortunate mistake)
20
+
21
+ # 3.4.2 (Sept, 2021)
22
+ * Fixed Chunker's undefined name error (https://github.com/Shopify/lhm/pull/110)
23
+
1
24
  # 3.4.1 (Sep 22, 2021)
2
25
 
3
26
  * Add better logging to the LHM components (https://github.com/Shopify/lhm/pull/108)
data/Gemfile.lock ADDED
@@ -0,0 +1,66 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ lhm-shopify (3.5.4)
5
+ retriable (>= 3.0.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ activemodel (6.1.4.1)
11
+ activesupport (= 6.1.4.1)
12
+ activerecord (6.1.4.1)
13
+ activemodel (= 6.1.4.1)
14
+ activesupport (= 6.1.4.1)
15
+ activesupport (6.1.4.1)
16
+ concurrent-ruby (~> 1.0, >= 1.0.2)
17
+ i18n (>= 1.6, < 2)
18
+ minitest (>= 5.1)
19
+ tzinfo (~> 2.0)
20
+ zeitwerk (~> 2.3)
21
+ after_do (0.4.0)
22
+ appraisal (2.4.1)
23
+ bundler
24
+ rake
25
+ thor (>= 0.14.0)
26
+ byebug (11.1.3)
27
+ concurrent-ruby (1.1.9)
28
+ docile (1.4.0)
29
+ i18n (1.8.11)
30
+ concurrent-ruby (~> 1.0)
31
+ minitest (5.14.4)
32
+ mocha (1.13.0)
33
+ mysql2 (0.5.3)
34
+ rake (13.0.6)
35
+ retriable (3.1.2)
36
+ simplecov (0.21.2)
37
+ docile (~> 1.1)
38
+ simplecov-html (~> 0.11)
39
+ simplecov_json_formatter (~> 0.1)
40
+ simplecov-html (0.12.3)
41
+ simplecov_json_formatter (0.1.3)
42
+ thor (1.1.0)
43
+ toxiproxy (2.0.0)
44
+ tzinfo (2.0.4)
45
+ concurrent-ruby (~> 1.0)
46
+ zeitwerk (2.5.1)
47
+
48
+ PLATFORMS
49
+ x86_64-darwin-20
50
+ x86_64-linux
51
+
52
+ DEPENDENCIES
53
+ activerecord
54
+ after_do
55
+ appraisal
56
+ byebug
57
+ lhm-shopify!
58
+ minitest
59
+ mocha
60
+ mysql2
61
+ rake
62
+ simplecov
63
+ toxiproxy
64
+
65
+ BUNDLED WITH
66
+ 2.2.22
data/README.md CHANGED
@@ -109,6 +109,50 @@ end
109
109
  to prevent accidental data loss. After successful or failed LHM migrations, these leftover
110
110
  tables must be cleaned up.
111
111
 
112
+ ### Usage with ProxySQL
113
+ LHM can recover from connection loss. However, when used in conjunction with ProxySQL, there are multiple ways that
114
+ connection loss could induce data loss (if triggered by a failover). Therefore it will perform additional checks to
115
+ ensure that the MySQL host stays consistent across the schema migrations if the feature is enabled.
116
+ This is done by tagging every query with `/*maintenance:lhm*/`, which will be recognized by ProxySQL.
117
+ However, to get this feature working, a new ProxySQL query rule must be added.
118
+ ```cnf
119
+ {
120
+ rule_id = <rule id>
121
+ active = 1
122
+ match_pattern = "maintenance:lhm"
123
+ destination_hostgroup = <MySQL writer's hostgroup>
124
+ }
125
+ ```
126
+
127
+ This will ensure that all relevant queries are forwarded to the current writer.
128
+
129
+ Also, ProxySQL disables [multiplexing](https://proxysql.com/documentation/multiplexing/) for `select` on `@@` variables.
130
+ Therefore, the following rules must be added to ensure that queries (even if tagged with `/*maintenance:lhm*/`) get
131
+ forwarded to the right target.
132
+ ```cnf
133
+ {
134
+ rule_id = <rule id>
135
+ active = 1
136
+ match_digest = "@@global\.server_id"
137
+ multiplex = 2
138
+ },
139
+ {
140
+ rule_id = <rule id>
141
+ active = 1
142
+ match_digest = "@@global\.hostname"
143
+ multiplex = 2
144
+ }
145
+ ```
146
+
147
+ Once these changes are added to the ProxySQL configuration (either through `.cnf` or dynamically through the admin interface),
148
+ the feature can be enabled. This is done by adding this flag when providing options to the migration:
149
+ ```ruby
150
+ Lhm.change_table(..., options: {reconnect_with_consistent_host: true}) do |t|
151
+ ...
152
+ end
153
+ ```
154
+ **Note**: This feature is disabled by default
155
+
112
156
  ## Throttler
113
157
 
114
158
  LHM uses a throttling mechanism to read data in your original table. By default, 2,000 rows are read each 0.1 second. If you want to change that behaviour, you can pass an instance of a throttler with the `throttler` option. In this example, 1,000 rows will be read with a 10 second delay between each processing:
@@ -259,6 +303,15 @@ COV=1 bundle exec rake unit && bundle exec rake integration
259
303
  open coverage/index.html
260
304
  ```
261
305
 
306
+ ### Merging for a new version
307
+ When creating a PR for a new version, make sure that th version has been bumped in `lib/lhm/version.rb`. Then run the following code snippet to ensure the everything is consistent, otherwise
308
+ the gem will not publish.
309
+ ```bash
310
+ bundle install
311
+ bundle update
312
+ bundle exec appraisals install
313
+ ```
314
+
262
315
  ### Docker Compose
263
316
  The integration tests rely on a replication configuration for MySQL which is being proxied by an instance of ProxySQL.
264
317
  It is important that every container is running to execute the integration test suite.
data/Rakefile CHANGED
@@ -16,15 +16,16 @@ Rake::TestTask.new('integration') do |t|
16
16
  t.libs << 'spec'
17
17
  t.test_files = FileList['spec/integration/**/*_spec.rb']
18
18
  t.verbose = true
19
- end
19
+ end
20
20
 
21
21
  Rake::TestTask.new('dev') do |t|
22
22
  t.libs << 'lib'
23
23
  t.libs << 'spec'
24
- t.test_files = FileList[
25
- 'spec/test_helper.rb',
26
- # Add file to test individually
27
- ]
24
+
25
+ files = FileList.new('spec/test_helper.rb')
26
+ files.add(ENV["SINGLE_TEST"]) if ENV["SINGLE_TEST"]
27
+ t.test_files = files
28
+
28
29
  t.verbose = true
29
30
  end
30
31
 
data/dev.yml CHANGED
@@ -5,12 +5,16 @@ up:
5
5
  or: [mysql@5.7]
6
6
  conflicts: [shopify/shopify/mysql-client, mysql-connector-c, mysql, mysql-client]
7
7
  - wget
8
- - ruby: 2.6.5
8
+ - ruby: 2.7.5
9
9
  - bundler
10
+ - custom:
11
+ name: Get Appraisal gems
12
+ met?: bundle exec appraisal install
13
+ meet: ":"
10
14
  - docker
11
15
  - custom:
12
16
  name: Docker Compose
13
- met?: docker compose ls | grep -ioE -q "lhm.*running\(3\)"
17
+ met?: docker compose ls | grep -ioE -q "lhm.*running\(4\)"
14
18
  meet: docker compose up -d
15
19
  - custom:
16
20
  name: Waiting for DBs to be operational
@@ -20,8 +24,19 @@ up:
20
24
  commands:
21
25
  unit: bundle exec rake unit
22
26
  int: bundle exec rake integration
23
- test: bundle exec rake unit && bundle exec rake integration
27
+ test:
28
+ optional: file
29
+ aliases: [ t ]
30
+ run: |
31
+ if [[ $# -eq 0 ]]; then
32
+ bundle exec rake unit && bundle exec rake integration
33
+ else
34
+ SINGLE_TEST="$@" bundle exec rake dev
35
+ fi
36
+ appraisals: bundle exec appraisal rake specs
24
37
  cov: rm -rf coverage; COV=1 bundle exec rake unit && bundle exec rake integration; open coverage/index.html
25
38
  logs:
26
39
  desc: "See the DB logs (ctrl-c + ctrl-c to exit)"
27
40
  run: docker-compose logs -f
41
+ clear:
42
+ run: docker-compose rm -v -s -f && docker-compose up -d && ./scripts/helpers/wait-for-dbs.sh
data/docker-compose.yml CHANGED
@@ -1,14 +1,16 @@
1
1
  services:
2
- # Writer
2
+ # Writer
3
3
  mysql-1:
4
4
  container_name: mysql-1
5
5
  image: percona:5.7
6
6
  command:
7
7
  --server-id=1
8
+ --log-bin
8
9
  --log-slave-updates=ON
9
10
  --gtid-mode=ON
10
11
  --enforce-gtid-consistency=ON
11
12
  --read-only=OFF
13
+ --max-connections=1000
12
14
  hostname: 'mysql-1'
13
15
  volumes:
14
16
  - ./scripts/mysql/writer:/docker-entrypoint-initdb.d
@@ -17,16 +19,18 @@ services:
17
19
  MYSQL_HOST: mysql-1
18
20
  ports:
19
21
  - "33006:3306"
20
- # Reader
22
+ # Reader
21
23
  mysql-2:
22
24
  container_name: mysql-2
23
25
  image: percona:5.7
24
26
  command:
25
27
  --server-id=2
28
+ --log-bin
26
29
  --log-slave-updates=ON
27
30
  --gtid-mode=ON
28
31
  --enforce-gtid-consistency=ON
29
32
  --read-only=ON
33
+ --max-connections=1000
30
34
  hostname: 'mysql-2'
31
35
  volumes:
32
36
  - ./scripts/mysql/reader:/docker-entrypoint-initdb.d
@@ -35,7 +39,7 @@ services:
35
39
  MYSQL_HOST: mysql-2
36
40
  ports:
37
41
  - "33007:3306"
38
- # Proxysql
42
+ # Proxysql
39
43
  proxysql:
40
44
  container_name: proxysql
41
45
  image: proxysql/proxysql:2.0.11
@@ -44,3 +48,11 @@ services:
44
48
  command: "proxysql -c /etc/proxysql.cnf -f --idle-threads"
45
49
  ports:
46
50
  - "33005:3306"
51
+ - "6032:6032"
52
+ toxiproxy:
53
+ container_name: toxiproxy
54
+ image: "ghcr.io/shopify/toxiproxy"
55
+ ports:
56
+ - "8474:8474"
57
+ - "22220:22220"
58
+ - "22222:22222"
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "5.2.6"
6
+ gem "simplecov", "0.18.5"
7
+ gem "docile", "1.3.5"
8
+
9
+ gemspec path: "../"
@@ -0,0 +1,65 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ lhm-shopify (3.5.4)
5
+ retriable (>= 3.0.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ activemodel (5.2.6)
11
+ activesupport (= 5.2.6)
12
+ activerecord (5.2.6)
13
+ activemodel (= 5.2.6)
14
+ activesupport (= 5.2.6)
15
+ arel (>= 9.0)
16
+ activesupport (5.2.6)
17
+ concurrent-ruby (~> 1.0, >= 1.0.2)
18
+ i18n (>= 0.7, < 2)
19
+ minitest (~> 5.1)
20
+ tzinfo (~> 1.1)
21
+ after_do (0.4.0)
22
+ appraisal (2.4.1)
23
+ bundler
24
+ rake
25
+ thor (>= 0.14.0)
26
+ arel (9.0.0)
27
+ byebug (11.1.3)
28
+ concurrent-ruby (1.1.9)
29
+ docile (1.3.5)
30
+ i18n (1.8.11)
31
+ concurrent-ruby (~> 1.0)
32
+ minitest (5.14.4)
33
+ mocha (1.13.0)
34
+ mysql2 (0.5.3)
35
+ rake (13.0.6)
36
+ retriable (3.1.2)
37
+ simplecov (0.18.5)
38
+ docile (~> 1.1)
39
+ simplecov-html (~> 0.11)
40
+ simplecov-html (0.12.3)
41
+ thor (1.1.0)
42
+ thread_safe (0.3.6)
43
+ toxiproxy (2.0.0)
44
+ tzinfo (1.2.9)
45
+ thread_safe (~> 0.1)
46
+
47
+ PLATFORMS
48
+ x86_64-darwin-20
49
+
50
+ DEPENDENCIES
51
+ activerecord (= 5.2.6)
52
+ after_do
53
+ appraisal
54
+ byebug
55
+ docile (= 1.3.5)
56
+ lhm-shopify!
57
+ minitest
58
+ mocha
59
+ mysql2
60
+ rake
61
+ simplecov (= 0.18.5)
62
+ toxiproxy
63
+
64
+ BUNDLED WITH
65
+ 2.2.22
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "6.0.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,67 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ lhm-shopify (3.5.4)
5
+ retriable (>= 3.0.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ activemodel (6.0.0)
11
+ activesupport (= 6.0.0)
12
+ activerecord (6.0.0)
13
+ activemodel (= 6.0.0)
14
+ activesupport (= 6.0.0)
15
+ activesupport (6.0.0)
16
+ concurrent-ruby (~> 1.0, >= 1.0.2)
17
+ i18n (>= 0.7, < 2)
18
+ minitest (~> 5.1)
19
+ tzinfo (~> 1.1)
20
+ zeitwerk (~> 2.1, >= 2.1.8)
21
+ after_do (0.4.0)
22
+ appraisal (2.4.1)
23
+ bundler
24
+ rake
25
+ thor (>= 0.14.0)
26
+ byebug (11.1.3)
27
+ concurrent-ruby (1.1.9)
28
+ docile (1.4.0)
29
+ i18n (1.8.11)
30
+ concurrent-ruby (~> 1.0)
31
+ minitest (5.14.4)
32
+ mocha (1.13.0)
33
+ mysql2 (0.5.3)
34
+ rake (13.0.6)
35
+ retriable (3.1.2)
36
+ simplecov (0.21.2)
37
+ docile (~> 1.1)
38
+ simplecov-html (~> 0.11)
39
+ simplecov_json_formatter (~> 0.1)
40
+ simplecov-html (0.12.3)
41
+ simplecov_json_formatter (0.1.3)
42
+ thor (1.1.0)
43
+ thread_safe (0.3.6)
44
+ toxiproxy (2.0.0)
45
+ tzinfo (1.2.9)
46
+ thread_safe (~> 0.1)
47
+ zeitwerk (2.5.1)
48
+
49
+ PLATFORMS
50
+ x86_64-darwin-20
51
+ x86_64-linux
52
+
53
+ DEPENDENCIES
54
+ activerecord (= 6.0.0)
55
+ after_do
56
+ appraisal
57
+ byebug
58
+ lhm-shopify!
59
+ minitest
60
+ mocha
61
+ mysql2
62
+ rake
63
+ simplecov
64
+ toxiproxy
65
+
66
+ BUNDLED WITH
67
+ 2.2.22
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "6.1.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,66 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ lhm-shopify (3.5.4)
5
+ retriable (>= 3.0.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ activemodel (6.1.0)
11
+ activesupport (= 6.1.0)
12
+ activerecord (6.1.0)
13
+ activemodel (= 6.1.0)
14
+ activesupport (= 6.1.0)
15
+ activesupport (6.1.0)
16
+ concurrent-ruby (~> 1.0, >= 1.0.2)
17
+ i18n (>= 1.6, < 2)
18
+ minitest (>= 5.1)
19
+ tzinfo (~> 2.0)
20
+ zeitwerk (~> 2.3)
21
+ after_do (0.4.0)
22
+ appraisal (2.4.1)
23
+ bundler
24
+ rake
25
+ thor (>= 0.14.0)
26
+ byebug (11.1.3)
27
+ concurrent-ruby (1.1.9)
28
+ docile (1.4.0)
29
+ i18n (1.8.11)
30
+ concurrent-ruby (~> 1.0)
31
+ minitest (5.14.4)
32
+ mocha (1.13.0)
33
+ mysql2 (0.5.3)
34
+ rake (13.0.6)
35
+ retriable (3.1.2)
36
+ simplecov (0.21.2)
37
+ docile (~> 1.1)
38
+ simplecov-html (~> 0.11)
39
+ simplecov_json_formatter (~> 0.1)
40
+ simplecov-html (0.12.3)
41
+ simplecov_json_formatter (0.1.3)
42
+ thor (1.1.0)
43
+ toxiproxy (2.0.0)
44
+ tzinfo (2.0.4)
45
+ concurrent-ruby (~> 1.0)
46
+ zeitwerk (2.5.1)
47
+
48
+ PLATFORMS
49
+ x86_64-darwin-20
50
+ x86_64-linux
51
+
52
+ DEPENDENCIES
53
+ activerecord (= 6.1.0)
54
+ after_do
55
+ appraisal
56
+ byebug
57
+ lhm-shopify!
58
+ minitest
59
+ mocha
60
+ mysql2
61
+ rake
62
+ simplecov
63
+ toxiproxy
64
+
65
+ BUNDLED WITH
66
+ 2.2.22
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "7.0.0.alpha2"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,64 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ lhm-shopify (3.5.4)
5
+ retriable (>= 3.0.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ activemodel (7.0.0.alpha2)
11
+ activesupport (= 7.0.0.alpha2)
12
+ activerecord (7.0.0.alpha2)
13
+ activemodel (= 7.0.0.alpha2)
14
+ activesupport (= 7.0.0.alpha2)
15
+ activesupport (7.0.0.alpha2)
16
+ concurrent-ruby (~> 1.0, >= 1.0.2)
17
+ i18n (>= 1.6, < 2)
18
+ minitest (>= 5.1)
19
+ tzinfo (~> 2.0)
20
+ after_do (0.4.0)
21
+ appraisal (2.4.1)
22
+ bundler
23
+ rake
24
+ thor (>= 0.14.0)
25
+ byebug (11.1.3)
26
+ concurrent-ruby (1.1.9)
27
+ docile (1.4.0)
28
+ i18n (1.8.11)
29
+ concurrent-ruby (~> 1.0)
30
+ minitest (5.14.4)
31
+ mocha (1.13.0)
32
+ mysql2 (0.5.3)
33
+ rake (13.0.6)
34
+ retriable (3.1.2)
35
+ simplecov (0.21.2)
36
+ docile (~> 1.1)
37
+ simplecov-html (~> 0.11)
38
+ simplecov_json_formatter (~> 0.1)
39
+ simplecov-html (0.12.3)
40
+ simplecov_json_formatter (0.1.3)
41
+ thor (1.1.0)
42
+ toxiproxy (2.0.0)
43
+ tzinfo (2.0.4)
44
+ concurrent-ruby (~> 1.0)
45
+
46
+ PLATFORMS
47
+ x86_64-darwin-20
48
+ x86_64-linux
49
+
50
+ DEPENDENCIES
51
+ activerecord (= 7.0.0.alpha2)
52
+ after_do
53
+ appraisal
54
+ byebug
55
+ lhm-shopify!
56
+ minitest
57
+ mocha
58
+ mysql2
59
+ rake
60
+ simplecov
61
+ toxiproxy
62
+
63
+ BUNDLED WITH
64
+ 2.2.22