lhm-shopify 3.4.2 → 3.5.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +24 -15
  3. data/.gitignore +1 -6
  4. data/Appraisals +24 -0
  5. data/CHANGELOG.md +15 -0
  6. data/Gemfile.lock +66 -0
  7. data/README.md +53 -4
  8. data/Rakefile +10 -0
  9. data/dev.yml +28 -6
  10. data/docker-compose.yml +58 -0
  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 -11
  21. data/lib/lhm/chunk_insert.rb +4 -10
  22. data/lib/lhm/chunker.rb +7 -8
  23. data/lib/lhm/cleanup/current.rb +3 -10
  24. data/lib/lhm/connection.rb +109 -0
  25. data/lib/lhm/entangler.rb +4 -12
  26. data/lib/lhm/invoker.rb +3 -3
  27. data/lib/lhm/proxysql_helper.rb +10 -0
  28. data/lib/lhm/sql_retry.rb +132 -9
  29. data/lib/lhm/throttler/slave_lag.rb +19 -2
  30. data/lib/lhm/version.rb +1 -1
  31. data/lib/lhm.rb +25 -9
  32. data/scripts/helpers/wait-for-dbs.sh +21 -0
  33. data/scripts/mysql/reader/create_replication.sql +10 -0
  34. data/scripts/mysql/writer/create_test_db.sql +1 -0
  35. data/scripts/mysql/writer/create_users.sql +6 -0
  36. data/scripts/proxysql/proxysql.cnf +117 -0
  37. data/spec/integration/atomic_switcher_spec.rb +38 -13
  38. data/spec/integration/chunk_insert_spec.rb +2 -1
  39. data/spec/integration/chunker_spec.rb +1 -1
  40. data/spec/integration/database.yml +25 -0
  41. data/spec/integration/entangler_spec.rb +3 -1
  42. data/spec/integration/integration_helper.rb +24 -9
  43. data/spec/integration/lhm_spec.rb +75 -0
  44. data/spec/integration/proxysql_spec.rb +34 -0
  45. data/spec/integration/sql_retry/db_connection_helper.rb +52 -0
  46. data/spec/integration/sql_retry/lock_wait_spec.rb +8 -6
  47. data/spec/integration/sql_retry/lock_wait_timeout_test_helper.rb +17 -4
  48. data/spec/integration/sql_retry/proxysql_helper.rb +22 -0
  49. data/spec/integration/sql_retry/retry_with_proxysql_spec.rb +108 -0
  50. data/spec/integration/toxiproxy_helper.rb +40 -0
  51. data/spec/test_helper.rb +21 -0
  52. data/spec/unit/chunk_insert_spec.rb +7 -2
  53. data/spec/unit/chunker_spec.rb +46 -42
  54. data/spec/unit/connection_spec.rb +86 -0
  55. data/spec/unit/entangler_spec.rb +51 -10
  56. data/spec/unit/lhm_spec.rb +17 -0
  57. data/spec/unit/throttler/slave_lag_spec.rb +13 -8
  58. metadata +85 -14
  59. data/bin/.gitkeep +0 -0
  60. data/dbdeployer/config.json +0 -32
  61. data/dbdeployer/install.sh +0 -64
  62. data/gemfiles/ar-2.3_mysql.gemfile +0 -6
  63. data/gemfiles/ar-3.2_mysql.gemfile +0 -5
  64. data/gemfiles/ar-3.2_mysql2.gemfile +0 -5
  65. data/gemfiles/ar-4.0_mysql2.gemfile +0 -5
  66. data/gemfiles/ar-4.1_mysql2.gemfile +0 -5
  67. data/gemfiles/ar-4.2_mysql2.gemfile +0 -5
  68. data/gemfiles/ar-5.0_mysql2.gemfile +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cfb1802db81b2673ea5e52acec84b4e457a8d5debb74f5391fcb282bf1fc8484
4
- data.tar.gz: 88abd0ae0484efa69777b0284c253788996b2148c0cb61fc035c0ccd7d49627c
3
+ metadata.gz: ef039ab1af9028a875f5851d7b7bd21dc74f363906037cbbe3acc869b008221e
4
+ data.tar.gz: 03a9d41b63437471f2edaf2faacd1f4d543440aebc64ebe53e2445986b52eb2c
5
5
  SHA512:
6
- metadata.gz: 4b98a803678e1ab543997d4e6f9031b02511324293c2d97b3f94938ae6b701e55c122633ab6044920363c56d9746e35f9b131433eb65108437c4ffeb8ca2e5ea
7
- data.tar.gz: '018c3a179dfdf90f9b5fd4bd3f67636644fc47eda7b0b825aee00330db0f83a59cf6855a5e18105493a89ac0a372ac26fd2c356148282449ca2de84fc56c5179'
6
+ metadata.gz: 768f2438270cd0f1cfe2d3e624068cb8c45bf083615cdd936e4598db8a5c831c112983f41918ba0e82ce4ee9ecdd3728e53926251512a18b43c94f04afb14a8a
7
+ data.tar.gz: 94e677823ae472e1db287f250481cf63e8ac0a2f8d85018efb2b07b6ca197d2e4c0f8f5ea7a539d222fbd7928187e61957cd26a95dfc0ad2f39f5e8e27d45a88
@@ -10,25 +10,34 @@ 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
20
- - name: Cache MySQL
21
- uses: actions/cache@v2
22
- with:
23
- path: dbdeployer/binaries
24
- key: ${{ runner.os }}-dbdeployer-${{ hashFiles('**/dbdeployer/install.sh') }}
31
+ ruby-version: ${{matrix.ruby-version}}
32
+ bundler-cache: false
25
33
  - name: Install Ruby packages
26
- run: bundle install
34
+ run: BUNDLE_GEMFILE="${GITHUB_WORKSPACE}/gemfiles/activerecord_${{ matrix.activerecord-version }}.gemfile" bundle install
27
35
  - name: Install Ubuntu packages
28
- run: sudo apt-get install numactl libaio-dev
29
- - name: Setup MySQL
30
- run: ./dbdeployer/install.sh
31
- - name: Run integration tests
32
- run: bundle exec rake integration
33
- - name: Run unit tests
34
- run: bundle exec rake unit
36
+ run: sudo apt-get update && sudo apt-get install numactl libaio-dev libmysqlclient-dev
37
+ - name: Setup MySQL and ProxySQL (docker-compose)
38
+ run: docker-compose up -d # Might have to change to docker compose up -d (i.e. Compose V2) when the Ubuntu image changes the docker-compose version
39
+ - name: Wait until DBs are alive
40
+ run: ./scripts/helpers/wait-for-dbs.sh
41
+ timeout-minutes: 2
42
+ - name: Run tests
43
+ run: BUNDLE_GEMFILE="${GITHUB_WORKSPACE}/gemfiles/activerecord_${{ matrix.activerecord-version }}.gemfile" bundle exec rake specs
data/.gitignore CHANGED
@@ -1,17 +1,12 @@
1
1
  *.gem
2
2
  .bundle
3
- gemfiles/*.lock
4
3
  pkg/*
5
4
  .rvmrc
6
5
  .ruby-version
7
6
  .ruby-gemset
8
7
  bin/rake
9
- spec/integration/database.yml
10
8
  gemfiles/vendor
11
9
  omg.ponies
12
10
  *~
13
11
  coverage
14
- bin/dbdeployer
15
- /dbdeployer/sandboxes
16
- /dbdeployer/binaries
17
- Gemfile.lock
12
+ .idea/
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,18 @@
1
+ # 3.5.2 (Dec, 2021)
2
+ * Fixed error on undefined connection, when calling `Lhm.connection` without calling `Lhm.setup` first
3
+ * Changed `Lhm.connection.connection` to `lhm.connection.ar_connection` for increased clarity and readability
4
+
5
+ # 3.5.1 (Dec , 2021)
6
+ * Add better logging to the LHM components (https://github.com/Shopify/lhm/pull/112)
7
+ * Slave lag throttler now supports ActiveRecord > 6.0
8
+ * [Dev] Add `Appraisals` to test against multiple version
9
+
10
+ # 3.5.0 (Dec , 2021)
11
+ * Duplicate of 3.4.2 (unfortunate mistake)
12
+
13
+ # 3.4.2 (Sept, 2021)
14
+ * Fixed Chunker's undefined name error (https://github.com/Shopify/lhm/pull/110)
15
+
1
16
  # 3.4.1 (Sep 22, 2021)
2
17
 
3
18
  * 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.3)
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,48 @@ 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 doing the initial setup:
149
+ ```ruby
150
+ Lhm.setup(connection, options: {reconnect_with_consistent_host: true})
151
+ ```
152
+ **Note**: This feature is disabled by default
153
+
112
154
  ## Throttler
113
155
 
114
156
  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,11 +301,18 @@ COV=1 bundle exec rake unit && bundle exec rake integration
259
301
  open coverage/index.html
260
302
  ```
261
303
 
262
- ### dbdeployer
304
+ ### Merging for a new version
305
+ 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
306
+ the gem will not publish.
307
+ ```bash
308
+ bundle install
309
+ bundle update
310
+ bundle exec appraisals install
311
+ ```
263
312
 
264
- The integration tests rely on a replicated configuration for MySQL. We're using
265
- [`dbdeployer`](https://github.com/datacharmer/dbdeployer) to manage the test nodes
266
- required to set up these configurations.
313
+ ### Docker Compose
314
+ The integration tests rely on a replication configuration for MySQL which is being proxied by an instance of ProxySQL.
315
+ It is important that every container is running to execute the integration test suite.
267
316
 
268
317
  ## License
269
318
 
data/Rakefile CHANGED
@@ -16,6 +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
20
+
21
+ Rake::TestTask.new('dev') do |t|
22
+ t.libs << 'lib'
23
+ t.libs << 'spec'
24
+ t.test_files = FileList[
25
+ 'spec/test_helper.rb',
26
+ # Add file to test individually
27
+ ]
28
+ t.verbose = true
19
29
  end
20
30
 
21
31
  task :specs => [:unit, :integration]
data/dev.yml CHANGED
@@ -5,16 +5,38 @@ 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.0
9
9
  - bundler
10
10
  - custom:
11
- name: Database
12
- met?: test -f spec/integration/database.yml && test "$(./dbdeployer/sandboxes/rsandbox_5_7_22/status_all | grep on\ | wc -l | xargs echo)" = "2"
13
- meet: ./dbdeployer/install.sh
14
- down: ./dbdeployer/sandboxes/rsandbox_5_7_22/stop_all
11
+ name: Get Appraisal gems
12
+ met?: bundle exec appraisal install
13
+ meet: ":"
14
+ - docker
15
+ - custom:
16
+ name: Docker Compose
17
+ met?: docker compose ls | grep -ioE -q "lhm.*running\(4\)"
18
+ meet: docker compose up -d
19
+ - custom:
20
+ name: Waiting for DBs to be operational
21
+ met?: ./scripts/helpers/wait-for-dbs.sh
22
+ meet: ":"
15
23
 
16
24
  commands:
17
25
  unit: bundle exec rake unit
18
26
  int: bundle exec rake integration
19
- 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
+ bundle exec rake dev TEST="$@"
35
+ fi
36
+ appraisals: bundle exec appraisal rake specs
20
37
  cov: rm -rf coverage; COV=1 bundle exec rake unit && bundle exec rake integration; open coverage/index.html
38
+ logs:
39
+ desc: "See the DB logs (ctrl-c + ctrl-c to exit)"
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
@@ -0,0 +1,58 @@
1
+ services:
2
+ # Writer
3
+ mysql-1:
4
+ container_name: mysql-1
5
+ image: percona:5.7
6
+ command:
7
+ --server-id=1
8
+ --log-bin
9
+ --log-slave-updates=ON
10
+ --gtid-mode=ON
11
+ --enforce-gtid-consistency=ON
12
+ --read-only=OFF
13
+ --max-connections=1000
14
+ hostname: 'mysql-1'
15
+ volumes:
16
+ - ./scripts/mysql/writer:/docker-entrypoint-initdb.d
17
+ environment:
18
+ MYSQL_ROOT_PASSWORD: password
19
+ MYSQL_HOST: mysql-1
20
+ ports:
21
+ - "33006:3306"
22
+ # Reader
23
+ mysql-2:
24
+ container_name: mysql-2
25
+ image: percona:5.7
26
+ command:
27
+ --server-id=2
28
+ --log-bin
29
+ --log-slave-updates=ON
30
+ --gtid-mode=ON
31
+ --enforce-gtid-consistency=ON
32
+ --read-only=ON
33
+ --max-connections=1000
34
+ hostname: 'mysql-2'
35
+ volumes:
36
+ - ./scripts/mysql/reader:/docker-entrypoint-initdb.d
37
+ environment:
38
+ MYSQL_ROOT_PASSWORD: password
39
+ MYSQL_HOST: mysql-2
40
+ ports:
41
+ - "33007:3306"
42
+ # Proxysql
43
+ proxysql:
44
+ container_name: proxysql
45
+ image: proxysql/proxysql:2.0.11
46
+ volumes:
47
+ - ./scripts/proxysql/proxysql.cnf:/etc/proxysql.cnf
48
+ command: "proxysql -c /etc/proxysql.cnf -f --idle-threads"
49
+ ports:
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.3)
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.3)
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.3)
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.3)
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