ledger_sync 2.5.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/codeql.yml +76 -0
  3. data/.github/workflows/gem-workflow.yml +10 -8
  4. data/.gitignore +3 -1
  5. data/.rubocop.yml +7 -1
  6. data/Gemfile +2 -0
  7. data/Gemfile.lock +94 -70
  8. data/documentation/generators/generator.rb +1 -1
  9. data/documentation/generators/reference/generator.rb +1 -3
  10. data/documentation/generators/template.rb +1 -1
  11. data/ledger_sync.gemspec +19 -20
  12. data/lib/ledger_sync/deserializer.rb +4 -4
  13. data/lib/ledger_sync/error/ledger_errors.rb +2 -8
  14. data/lib/ledger_sync/error/operation_errors.rb +1 -0
  15. data/lib/ledger_sync/error/resource_errors.rb +2 -2
  16. data/lib/ledger_sync/ledger_configuration_store.rb +4 -4
  17. data/lib/ledger_sync/ledgers/client.rb +3 -3
  18. data/lib/ledger_sync/ledgers/mixins/infer_serializer_mixin.rb +12 -24
  19. data/lib/ledger_sync/ledgers/mixins/infer_validation_contract_mixin.rb +3 -5
  20. data/lib/ledger_sync/resource.rb +7 -7
  21. data/lib/ledger_sync/resource_attribute/dirty_mixin.rb +2 -2
  22. data/lib/ledger_sync/serialization/mixin.rb +1 -1
  23. data/lib/ledger_sync/serializer.rb +4 -4
  24. data/lib/ledger_sync/test/support/factory_bot.rb +2 -2
  25. data/lib/ledger_sync/test/support/qa/ledger_support_setup.rb +2 -2
  26. data/lib/ledger_sync/test/support/record_collection.rb +1 -1
  27. data/lib/ledger_sync/type/reference_many.rb +1 -1
  28. data/lib/ledger_sync/type/value_mixin.rb +1 -1
  29. data/lib/ledger_sync/util/dotenv_updator.rb +1 -1
  30. data/lib/ledger_sync/util/resource_converter/attribute_set.rb +1 -1
  31. data/lib/ledger_sync/util/resource_converter.rb +8 -8
  32. data/lib/ledger_sync/util/resources_builder.rb +23 -25
  33. data/lib/ledger_sync/util/signer.rb +4 -2
  34. data/lib/ledger_sync/util/string_helpers.rb +1 -1
  35. data/lib/ledger_sync/version.rb +2 -2
  36. metadata +13 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 32299764617ee63656db259230c9dc83f5b6ebff7d40a1ea6830f8a16b261b51
4
- data.tar.gz: 0c7d7de6fc3d28038cd8c925132cd2fb9d9add8f0df358d7a4edc820b26e2842
3
+ metadata.gz: b63db8eefe2b7ef796c61c32d875751b2a3959086f01ae9f1706e0248a0a8875
4
+ data.tar.gz: 4cb44ba51344f600e60a3f10e33ef3d4d4bad7d1530d2935a732e33f0d63a75d
5
5
  SHA512:
6
- metadata.gz: fe10259bd15e59e80c2ac6775d2e917912a7a50d694e4e697b9753de221ca9fcdfc6f8add78341dacfd294db5e87c7705d36cc146ae6ec3f4c455d2a95206018
7
- data.tar.gz: d68b13010d1c65bb4b1df46b55727d3fac55af179498e52fd02a9bd333c91e8062c12e31154f101ea108cc0726476ce443bdd6a6fcc69b4a576a56cacabe776f
6
+ metadata.gz: 9039f8c4f393591c4a048f89c30344bf83329580b753edfbc65c2ad256f0e4c4c6f25656de6aec20261686157754c5353c8a86329c62b4092ce025e5d3bccbd4
7
+ data.tar.gz: 5038845e3146b964d104686c11e89744245f7c708f8811f813e222ac485dedb1dc4304757d642346c48b158b02a7afc6173f5ce7b7e13767dce3cd4dec391a0b
@@ -0,0 +1,76 @@
1
+ # For most projects, this workflow file will not need changing; you simply need
2
+ # to commit it to your repository.
3
+ #
4
+ # You may wish to alter this file to override the set of languages analyzed,
5
+ # or to provide custom queries or build logic.
6
+ #
7
+ # ******** NOTE ********
8
+ # We have attempted to detect the languages in your repository. Please check
9
+ # the `language` matrix defined below to confirm you have the correct set of
10
+ # supported CodeQL languages.
11
+ #
12
+ name: "CodeQL"
13
+
14
+ on:
15
+ push:
16
+ branches: [ "master", develop ]
17
+ pull_request:
18
+ # The branches below must be a subset of the branches above
19
+ branches: [ "master" ]
20
+ schedule:
21
+ - cron: '38 21 * * 6'
22
+
23
+ jobs:
24
+ analyze:
25
+ name: Analyze
26
+ runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
27
+ permissions:
28
+ actions: read
29
+ contents: read
30
+ security-events: write
31
+
32
+ strategy:
33
+ fail-fast: false
34
+ matrix:
35
+ language: [ 'ruby' ]
36
+ # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
37
+ # Use only 'java' to analyze code written in Java, Kotlin or both
38
+ # Use only 'javascript' to analyze code written in JavaScript, TypeScript or both
39
+ # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
40
+
41
+ steps:
42
+ - name: Checkout repository
43
+ uses: actions/checkout@v3
44
+
45
+ # Initializes the CodeQL tools for scanning.
46
+ - name: Initialize CodeQL
47
+ uses: github/codeql-action/init@v2
48
+ with:
49
+ languages: ${{ matrix.language }}
50
+ # If you wish to specify custom queries, you can do so here or in a config file.
51
+ # By default, queries listed here will override any specified in a config file.
52
+ # Prefix the list here with "+" to use these queries and those in the config file.
53
+
54
+ # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
55
+ # queries: security-extended,security-and-quality
56
+
57
+
58
+ # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java).
59
+ # If this step fails, then you should remove it and run the build manually (see below)
60
+ - name: Autobuild
61
+ uses: github/codeql-action/autobuild@v2
62
+
63
+ # ℹ️ Command-line programs to run using the OS shell.
64
+ # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
65
+
66
+ # If the Autobuild fails above, remove it and uncomment the following three lines.
67
+ # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
68
+
69
+ # - run: |
70
+ # echo "Run, Build Application using script"
71
+ # ./location_of_script_within_repo/buildscript.sh
72
+
73
+ - name: Perform CodeQL Analysis
74
+ uses: github/codeql-action/analyze@v2
75
+ with:
76
+ category: "/language:${{matrix.language}}"
@@ -9,28 +9,30 @@ jobs:
9
9
  strategy:
10
10
  matrix:
11
11
  os: [ubuntu-latest]
12
- ruby-version: ['2.7', '3.0']
12
+ ruby-version: ['3.1.6', '3.2.6', '3.3.6']
13
13
  runs-on: ${{ matrix.os }}
14
14
  steps:
15
15
  - uses: actions/checkout@v3
16
16
  with:
17
17
  persist-credentials: false
18
18
  fetch-depth: 0
19
- - name: Ruby Setup and Bundle
19
+ - name: Ruby Setup
20
20
  uses: ruby/setup-ruby@v1
21
21
  with:
22
22
  ruby-version: ${{ matrix.ruby-version }}
23
23
  bundler-cache: true
24
- run: |
25
- gem install bundler
26
- bundle update
27
- bundle install
28
- - run: bundle exec rubocop
24
+ - name: Bundle install
25
+ run: |
26
+ gem install bundler
27
+ bundle config path vendor/bundle
28
+ bundle install --jobs 4 --retry 3
29
+ - name: Rubocop
30
+ run: bundle exec rubocop
29
31
  rspec:
30
32
  strategy:
31
33
  matrix:
32
34
  os: [ubuntu-latest]
33
- ruby-version: ['2.7', '3.0']
35
+ ruby-version: ['3.1.6', '3.2.6', '3.3.6']
34
36
  runs-on: ${{ matrix.os }}
35
37
  steps:
36
38
  - uses: actions/checkout@v3
data/.gitignore CHANGED
@@ -27,4 +27,6 @@ _site/
27
27
  *.local
28
28
 
29
29
  .tool-versions
30
- .ruby-version
30
+ .ruby-version
31
+
32
+ .vscode
data/.rubocop.yml CHANGED
@@ -4,9 +4,12 @@ AllCops:
4
4
  Exclude:
5
5
  - "documentation/site/_plugins/**/*"
6
6
  - "vendor/**/*"
7
- TargetRubyVersion: 2.5.8
7
+ TargetRubyVersion: 3.1
8
8
  NewCops: enable
9
9
 
10
+ Gemspec/DevelopmentDependencies:
11
+ Enabled: False
12
+
10
13
  Layout/LineLength:
11
14
  Enabled: True
12
15
  Max: 120
@@ -41,6 +44,9 @@ Lint/RaiseException:
41
44
  Lint/StructNewOverride:
42
45
  Enabled: True
43
46
 
47
+ Naming/VariableNumber:
48
+ Enabled: False
49
+
44
50
  Style/AccessorGrouping:
45
51
  Enabled: True
46
52
 
data/Gemfile CHANGED
@@ -6,3 +6,5 @@ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
6
6
 
7
7
  # Specify your gem's dependencies in ledger_sync.gemspec
8
8
  gemspec
9
+
10
+ gem 'rubocop', '~> 1.62'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ledger_sync (2.5.0)
4
+ ledger_sync (3.0.0)
5
5
  activemodel
6
6
  dotenv
7
7
  dry-schema
@@ -11,7 +11,7 @@ PATH
11
11
  faraday_middleware
12
12
  fingerprintable (>= 1.2.1)
13
13
  nokogiri
14
- openssl (~> 2.2.0)
14
+ openssl (> 2.2.0)
15
15
  pd_ruby
16
16
  rack (>= 2.2.3)
17
17
  rainbow (~> 3.0)
@@ -21,54 +21,70 @@ PATH
21
21
  GEM
22
22
  remote: https://rubygems.org/
23
23
  specs:
24
- activemodel (7.0.4.3)
25
- activesupport (= 7.0.4.3)
26
- activesupport (7.0.4.3)
24
+ activemodel (7.1.5)
25
+ activesupport (= 7.1.5)
26
+ activesupport (7.1.5)
27
+ base64
28
+ benchmark (>= 0.3)
29
+ bigdecimal
27
30
  concurrent-ruby (~> 1.0, >= 1.0.2)
31
+ connection_pool (>= 2.2.5)
32
+ drb
28
33
  i18n (>= 1.6, < 2)
34
+ logger (>= 1.4.2)
29
35
  minitest (>= 5.1)
36
+ mutex_m
37
+ securerandom (>= 0.3)
30
38
  tzinfo (~> 2.0)
31
- addressable (2.8.1)
32
- public_suffix (>= 2.0.2, < 6.0)
39
+ addressable (2.8.7)
40
+ public_suffix (>= 2.0.2, < 7.0)
33
41
  ast (2.4.2)
34
42
  awesome_print (1.9.2)
43
+ base64 (0.2.0)
44
+ benchmark (0.4.0)
45
+ bigdecimal (3.1.8)
35
46
  bump (0.9.0)
36
47
  byebug (11.1.3)
37
48
  childprocess (4.1.0)
38
49
  climate_control (1.2.0)
39
- colorize (0.8.1)
40
- concurrent-ruby (1.2.2)
41
- coveralls_reborn (0.27.0)
50
+ colorize (1.1.0)
51
+ concurrent-ruby (1.3.4)
52
+ connection_pool (2.4.1)
53
+ coveralls_reborn (0.28.0)
42
54
  simplecov (~> 0.22.0)
43
55
  term-ansicolor (~> 1.7)
44
56
  thor (~> 1.2)
45
57
  tins (~> 1.32)
46
- crack (0.4.5)
58
+ crack (1.0.0)
59
+ bigdecimal
47
60
  rexml
48
- diff-lcs (1.5.0)
49
- docile (1.4.0)
50
- dotenv (2.8.1)
51
- dry-configurable (1.0.1)
61
+ diff-lcs (1.5.1)
62
+ docile (1.4.1)
63
+ dotenv (3.1.4)
64
+ drb (2.2.1)
65
+ dry-configurable (1.2.0)
52
66
  dry-core (~> 1.0, < 2)
53
67
  zeitwerk (~> 2.6)
54
- dry-core (1.0.0)
68
+ dry-core (1.0.2)
55
69
  concurrent-ruby (~> 1.0)
70
+ logger
56
71
  zeitwerk (~> 2.6)
57
- dry-inflector (1.0.0)
72
+ dry-inflector (1.1.0)
58
73
  dry-initializer (3.1.1)
59
74
  dry-logic (1.5.0)
60
75
  concurrent-ruby (~> 1.0)
61
76
  dry-core (~> 1.0, < 2)
62
77
  zeitwerk (~> 2.6)
63
- dry-schema (1.13.0)
78
+ dry-schema (1.13.4)
64
79
  concurrent-ruby (~> 1.0)
65
80
  dry-configurable (~> 1.0, >= 1.0.1)
66
81
  dry-core (~> 1.0, < 2)
67
82
  dry-initializer (~> 3.0)
68
- dry-logic (>= 1.5, < 2)
83
+ dry-logic (>= 1.4, < 2)
69
84
  dry-types (>= 1.7, < 2)
70
85
  zeitwerk (~> 2.6)
71
- dry-types (1.7.1)
86
+ dry-types (1.7.2)
87
+ bigdecimal (~> 3.0)
72
88
  concurrent-ruby (~> 1.0)
73
89
  dry-core (~> 1.0)
74
90
  dry-inflector (~> 1.0)
@@ -82,7 +98,7 @@ GEM
82
98
  zeitwerk (~> 2.6)
83
99
  factory_bot (6.1.0)
84
100
  activesupport (>= 5.0.0)
85
- faraday (1.10.3)
101
+ faraday (1.10.4)
86
102
  faraday-em_http (~> 1.0)
87
103
  faraday-em_synchrony (~> 1.0)
88
104
  faraday-excon (~> 1.1)
@@ -102,95 +118,103 @@ GEM
102
118
  faraday-httpclient (1.0.1)
103
119
  faraday-multipart (1.0.4)
104
120
  multipart-post (~> 2)
105
- faraday-net_http (1.0.1)
121
+ faraday-net_http (1.0.2)
106
122
  faraday-net_http_persistent (1.2.0)
107
123
  faraday-patron (1.0.0)
108
124
  faraday-rack (1.0.0)
109
125
  faraday-retry (1.0.3)
110
- faraday_middleware (1.2.0)
126
+ faraday_middleware (1.2.1)
111
127
  faraday (~> 1.0)
112
128
  fingerprintable (1.2.1)
113
129
  colorize
114
- hashdiff (1.0.1)
115
- i18n (1.12.0)
130
+ hashdiff (1.1.2)
131
+ i18n (1.14.6)
116
132
  concurrent-ruby (~> 1.0)
117
133
  iniparse (1.5.0)
118
- ipaddr (1.2.5)
119
- mini_portile2 (2.8.1)
120
- minitest (5.18.0)
121
- multipart-post (2.3.0)
122
- nokogiri (1.14.2)
123
- mini_portile2 (~> 2.8.0)
134
+ json (2.9.1)
135
+ language_server-protocol (3.17.0.3)
136
+ logger (1.6.1)
137
+ mini_portile2 (2.8.8)
138
+ minitest (5.25.2)
139
+ multipart-post (2.4.1)
140
+ mutex_m (0.3.0)
141
+ nokogiri (1.16.7)
142
+ mini_portile2 (~> 2.8.2)
124
143
  racc (~> 1.4)
125
- nokogiri (1.14.2-x86_64-darwin)
144
+ nokogiri (1.16.7-x86_64-darwin)
126
145
  racc (~> 1.4)
127
- openssl (2.2.3)
128
- ipaddr
146
+ openssl (3.2.0)
129
147
  overcommit (0.57.0)
130
148
  childprocess (>= 0.6.3, < 5)
131
149
  iniparse (~> 1.4)
132
- parallel (1.22.1)
133
- parser (3.2.1.1)
150
+ parallel (1.26.3)
151
+ parser (3.3.6.0)
134
152
  ast (~> 2.4.1)
153
+ racc
135
154
  pd_ruby (0.2.3)
136
155
  colorize
137
- public_suffix (5.0.1)
138
- racc (1.6.2)
139
- rack (3.0.7)
156
+ public_suffix (6.0.1)
157
+ racc (1.8.1)
158
+ rack (3.1.8)
140
159
  rainbow (3.1.1)
141
- rake (13.0.6)
142
- regexp_parser (2.7.0)
160
+ rake (13.2.1)
161
+ regexp_parser (2.9.3)
143
162
  resonad (1.4.0)
144
- rexml (3.2.5)
145
- rspec (3.12.0)
146
- rspec-core (~> 3.12.0)
147
- rspec-expectations (~> 3.12.0)
148
- rspec-mocks (~> 3.12.0)
149
- rspec-core (3.12.1)
150
- rspec-support (~> 3.12.0)
151
- rspec-expectations (3.12.2)
163
+ rexml (3.4.0)
164
+ rspec (3.13.0)
165
+ rspec-core (~> 3.13.0)
166
+ rspec-expectations (~> 3.13.0)
167
+ rspec-mocks (~> 3.13.0)
168
+ rspec-core (3.13.2)
169
+ rspec-support (~> 3.13.0)
170
+ rspec-expectations (3.13.3)
152
171
  diff-lcs (>= 1.2.0, < 2.0)
153
- rspec-support (~> 3.12.0)
154
- rspec-mocks (3.12.4)
172
+ rspec-support (~> 3.13.0)
173
+ rspec-mocks (3.13.2)
155
174
  diff-lcs (>= 1.2.0, < 2.0)
156
- rspec-support (~> 3.12.0)
157
- rspec-support (3.12.0)
158
- rubocop (1.0.0)
175
+ rspec-support (~> 3.13.0)
176
+ rspec-support (3.13.1)
177
+ rubocop (1.69.2)
178
+ json (~> 2.3)
179
+ language_server-protocol (>= 3.17.0)
159
180
  parallel (~> 1.10)
160
- parser (>= 2.7.1.5)
181
+ parser (>= 3.3.0.2)
161
182
  rainbow (>= 2.2.2, < 4.0)
162
- regexp_parser (>= 1.8)
163
- rexml
164
- rubocop-ast (>= 0.6.0)
183
+ regexp_parser (>= 2.9.3, < 3.0)
184
+ rubocop-ast (>= 1.36.2, < 2.0)
165
185
  ruby-progressbar (~> 1.7)
166
- unicode-display_width (>= 1.4.0, < 2.0)
167
- rubocop-ast (1.27.0)
168
- parser (>= 3.2.1.0)
186
+ unicode-display_width (>= 2.4.0, < 4.0)
187
+ rubocop-ast (1.37.0)
188
+ parser (>= 3.3.1.0)
169
189
  ruby-progressbar (1.13.0)
170
190
  ruby2_keywords (0.0.5)
191
+ securerandom (0.3.2)
171
192
  simplecov (0.22.0)
172
193
  docile (~> 1.1)
173
194
  simplecov-html (~> 0.11)
174
195
  simplecov_json_formatter (~> 0.1)
175
- simplecov-html (0.12.3)
196
+ simplecov-html (0.13.1)
176
197
  simplecov-lcov (0.8.0)
177
198
  simplecov_json_formatter (0.1.4)
178
199
  simply_serializable (1.5.1)
179
200
  fingerprintable (>= 1.2.1)
180
201
  sync (0.5.0)
181
- term-ansicolor (1.7.1)
202
+ term-ansicolor (1.11.2)
182
203
  tins (~> 1.0)
183
- thor (1.2.1)
184
- tins (1.32.1)
204
+ thor (1.3.2)
205
+ tins (1.37.0)
206
+ bigdecimal
185
207
  sync
186
208
  tzinfo (2.0.6)
187
209
  concurrent-ruby (~> 1.0)
188
- unicode-display_width (1.8.0)
189
- webmock (3.18.1)
210
+ unicode-display_width (3.1.2)
211
+ unicode-emoji (~> 4.0, >= 4.0.4)
212
+ unicode-emoji (4.0.4)
213
+ webmock (3.24.0)
190
214
  addressable (>= 2.8.0)
191
215
  crack (>= 0.3.2)
192
216
  hashdiff (>= 0.4.0, < 2.0.0)
193
- zeitwerk (2.6.7)
217
+ zeitwerk (2.6.18)
194
218
 
195
219
  PLATFORMS
196
220
  ruby
@@ -208,10 +232,10 @@ DEPENDENCIES
208
232
  overcommit (~> 0.57.0)
209
233
  rake (~> 13.0)
210
234
  rspec (~> 3.2)
211
- rubocop (= 1.0.0)
235
+ rubocop (~> 1.62)
212
236
  simplecov
213
237
  simplecov-lcov
214
238
  webmock
215
239
 
216
240
  BUNDLED WITH
217
- 2.2.22
241
+ 2.6.2
@@ -29,7 +29,7 @@ module Docs
29
29
  end
30
30
 
31
31
  def destination_path(*args, **keywords)
32
- docs_path(*args, **{ format: :md }.merge(keywords))
32
+ docs_path(*args, format: :md, **keywords)
33
33
  end
34
34
 
35
35
  def docs_path(*path, format: nil)
@@ -67,9 +67,7 @@ module Docs
67
67
  end
68
68
  end
69
69
 
70
- File.open(config_path, 'w') do |h|
71
- h.write config.to_yaml
72
- end
70
+ File.write(config_path, config.to_yaml)
73
71
  end
74
72
  end
75
73
  end
@@ -15,7 +15,7 @@ module Docs
15
15
  def write
16
16
  template = ERB.new(File.read(template_path), trim_mode: '-')
17
17
  yellow "Generating template: #{template_path}"
18
- File.open(destination_path, 'w') { |f| f.write template.result_with_hash(data) }
18
+ File.write(destination_path, template.result_with_hash(data))
19
19
  green "Wrote to destination: #{destination_path}"
20
20
  end
21
21
  end
data/ledger_sync.gemspec CHANGED
@@ -8,17 +8,15 @@ Gem::Specification.new do |spec|
8
8
  spec.name = 'ledger_sync'
9
9
  spec.version = LedgerSync.version
10
10
 
11
- spec.required_ruby_version = '>= 2.5.8'
11
+ spec.required_ruby_version = '>= 3.1'
12
12
 
13
13
  # spec.required_rubygems_version = Gem::Requirement.new('>= 0') if spec.respond_to? :required_rubygems_version=
14
14
  spec.authors = ['Ryan Jackson']
15
- spec.date = '2019-05-21'
16
- spec.description = 'LedgerSync is a simple library that allows you to sync common objects to popular accounting '\
15
+ spec.description = 'LedgerSync is a simple library that allows you to sync common objects to popular accounting ' \
17
16
  'software like QuickBooks Online, Xero, NetSuite, etc.'
18
17
  spec.email = ['ryanwjackson@gmail.com']
19
18
  spec.homepage = 'https://github.com/LedgerSync/ledger_sync'
20
19
  spec.licenses = ['MIT']
21
- spec.rubygems_version = '3.0.3'
22
20
  spec.summary = 'Sync common objects to accounting software.'
23
21
 
24
22
  # Specify which files should be added to the gem when it is released.
@@ -40,23 +38,24 @@ Gem::Specification.new do |spec|
40
38
  spec.add_development_dependency('overcommit', '~> 0.57.0')
41
39
  spec.add_development_dependency('rake', '~> 13.0')
42
40
  spec.add_development_dependency('rspec', '~> 3.2')
43
- spec.add_development_dependency('rubocop', '1.0.0')
41
+ spec.add_development_dependency('rubocop', '~> 1.62')
44
42
  spec.add_development_dependency('simplecov')
45
43
  spec.add_development_dependency('simplecov-lcov')
46
44
  spec.add_development_dependency('webmock', '>= 0')
47
- spec.add_runtime_dependency('activemodel', '>= 0')
48
- spec.add_runtime_dependency('dotenv')
49
- spec.add_runtime_dependency('dry-schema')
50
- spec.add_runtime_dependency('dry-validation')
51
- spec.add_runtime_dependency('faraday', '>= 0')
52
- spec.add_runtime_dependency('faraday-detailed_logger', '>= 0')
53
- spec.add_runtime_dependency('faraday_middleware', '>= 0')
54
- spec.add_runtime_dependency('fingerprintable', '>= 1.2.1')
55
- spec.add_runtime_dependency('nokogiri', '>= 0')
56
- spec.add_runtime_dependency('openssl', '~> 2.2.0')
57
- spec.add_runtime_dependency('pd_ruby', '>= 0')
58
- spec.add_runtime_dependency('rack', '>= 2.2.3')
59
- spec.add_runtime_dependency('rainbow', '~> 3.0')
60
- spec.add_runtime_dependency('resonad', '>= 0')
61
- spec.add_runtime_dependency('simply_serializable', '>= 1.5.1')
45
+ spec.add_dependency('activemodel', '>= 0')
46
+ spec.add_dependency('dotenv')
47
+ spec.add_dependency('dry-schema')
48
+ spec.add_dependency('dry-validation')
49
+ spec.add_dependency('faraday', '>= 0')
50
+ spec.add_dependency('faraday-detailed_logger', '>= 0')
51
+ spec.add_dependency('faraday_middleware', '>= 0')
52
+ spec.add_dependency('fingerprintable', '>= 1.2.1')
53
+ spec.add_dependency('nokogiri', '>= 0')
54
+ spec.add_dependency('openssl', '> 2.2.0')
55
+ spec.add_dependency('pd_ruby', '>= 0')
56
+ spec.add_dependency('rack', '>= 2.2.3')
57
+ spec.add_dependency('rainbow', '~> 3.0')
58
+ spec.add_dependency('resonad', '>= 0')
59
+ spec.add_dependency('simply_serializable', '>= 1.5.1')
60
+ spec.metadata['rubygems_mfa_required'] = 'true'
62
61
  end
@@ -71,7 +71,7 @@ module LedgerSync
71
71
  @attributes ||= Serialization::DeserializerAttributeSet.new(serializer_class: self)
72
72
  end
73
73
 
74
- def self.references_one(resource_attribute, args = {}, &block)
74
+ def self.references_one(resource_attribute, args = {}, &)
75
75
  attribute(
76
76
  resource_attribute,
77
77
  {
@@ -79,11 +79,11 @@ module LedgerSync
79
79
  deserializer: deserializer_from(resource_attribute, args)
80
80
  )
81
81
  }.merge(args),
82
- &block
82
+ &
83
83
  )
84
84
  end
85
85
 
86
- def self.references_many(resource_attribute, args = {}, &block)
86
+ def self.references_many(resource_attribute, args = {}, &)
87
87
  attribute(
88
88
  resource_attribute,
89
89
  {
@@ -91,7 +91,7 @@ module LedgerSync
91
91
  deserializer: deserializer_from(resource_attribute, args)
92
92
  )
93
93
  }.merge(args),
94
- &block
94
+ &
95
95
  )
96
96
  end
97
97
 
@@ -46,11 +46,7 @@ module LedgerSync
46
46
  client_class: client.class
47
47
  ).rate_limiting_wait_in_seconds
48
48
 
49
- super(
50
- client: client,
51
- message: message,
52
- response: response
53
- )
49
+ super
54
50
  end
55
51
  end
56
52
 
@@ -62,9 +58,7 @@ module LedgerSync
62
58
 
63
59
  super(
64
60
  *args,
65
- **{
66
- message: "Unknown URL format for #{resource.class}"
67
- }.merge(keywords)
61
+ message: "Unknown URL format for #{resource.class}", **keywords
68
62
  )
69
63
  end
70
64
  end
@@ -15,6 +15,7 @@ module LedgerSync
15
15
  class DuplicateLedgerResourceError < self; end
16
16
  class NotFoundError < self; end
17
17
  class LedgerValidationError < self; end
18
+
18
19
  class PerformedOperationError < self
19
20
  def initialize(operation:, message: nil, response: nil)
20
21
  message ||= 'Operation has already been performed. Please check the result.'
@@ -22,8 +22,8 @@ module LedgerSync
22
22
  when LedgerSync::ResourceAttribute::Reference::Many
23
23
  invalid_classes = value.reject { |e| e.is_a?(type_resource_class) }.map(&:class)
24
24
  if type_resource_class.is_a?(Array)
25
- "an array of one or more of the following: #{type_resource_class.name}. Given array containing: "\
26
- "#{invalid_classes.join(', ')}"
25
+ "an array of one or more of the following: #{type_resource_class.name}. Given array containing: " \
26
+ "#{invalid_classes.join(', ')}"
27
27
  else
28
28
  "an array of #{type_resource_class.name}. Given array containing: #{invalid_classes.join(', ')}"
29
29
  end
@@ -32,12 +32,12 @@ module LedgerSync
32
32
  @base_module_to_config_mapping.fetch(base_module, nil)
33
33
  end
34
34
 
35
- def each(&block)
36
- configs.each(&block)
35
+ def each(&)
36
+ configs.each(&)
37
37
  end
38
38
 
39
- def find(&block)
40
- configs.values.find(&block)
39
+ def find(&)
40
+ configs.values.find(&)
41
41
  end
42
42
 
43
43
  def register_ledger(ledger_config:)
@@ -30,9 +30,9 @@ module LedgerSync
30
30
  def ledger_attributes_to_save
31
31
  return {} if self.class.ledger_attributes_to_save.nil?
32
32
 
33
- Hash[self.class.ledger_attributes_to_save.map do |attribute|
33
+ self.class.ledger_attributes_to_save.to_h do |attribute|
34
34
  [attribute, send(attribute)]
35
- end]
35
+ end
36
36
  end
37
37
 
38
38
  def operation_for(args = {})
@@ -98,7 +98,7 @@ module LedgerSync
98
98
  end
99
99
 
100
100
  def resource_from_ledger_type(type:, converter: nil)
101
- converter ||= proc { |n| n.underscore }
101
+ converter ||= proc(&:underscore)
102
102
  ledger_resource_type_overrides.invert[converter.call(type).to_sym] || resources[converter.call(type).to_sym]
103
103
  end
104
104
 
@@ -9,45 +9,33 @@ module LedgerSync
9
9
  module InferSerializerMixin
10
10
  module ClassMethods
11
11
  def inferred_deserializer_class
12
- @inferred_deserializer_class ||= begin
13
- inferred_config.base_module.const_get(
14
- inferred_deserializer_class_name
15
- )
16
- end
12
+ @inferred_deserializer_class ||= inferred_config.base_module.const_get(
13
+ inferred_deserializer_class_name
14
+ )
17
15
  end
18
16
 
19
17
  def inferred_deserializer_class_name
20
- @inferred_deserializer_class_name ||= begin
21
- "#{inferred_resource_class}::Deserializer"
22
- end
18
+ @inferred_deserializer_class_name ||= "#{inferred_resource_class}::Deserializer"
23
19
  end
24
20
 
25
21
  def inferred_searcher_deserializer_class
26
- @inferred_searcher_deserializer_class ||= begin
27
- inferred_config.base_module.const_get(
28
- inferred_searcher_deserializer_class_name
29
- )
30
- end
22
+ @inferred_searcher_deserializer_class ||= inferred_config.base_module.const_get(
23
+ inferred_searcher_deserializer_class_name
24
+ )
31
25
  end
32
26
 
33
27
  def inferred_searcher_deserializer_class_name
34
- @inferred_searcher_deserializer_class_name ||= begin
35
- "#{inferred_resource_class}::SearcherDeserializer"
36
- end
28
+ @inferred_searcher_deserializer_class_name ||= "#{inferred_resource_class}::SearcherDeserializer"
37
29
  end
38
30
 
39
31
  def inferred_serializer_class
40
- @inferred_serializer_class ||= begin
41
- inferred_config.base_module.const_get(
42
- inferred_serializer_class_name
43
- )
44
- end
32
+ @inferred_serializer_class ||= inferred_config.base_module.const_get(
33
+ inferred_serializer_class_name
34
+ )
45
35
  end
46
36
 
47
37
  def inferred_serializer_class_name
48
- @inferred_serializer_class_name ||= begin
49
- "#{inferred_resource_class}::Serializer"
50
- end
38
+ @inferred_serializer_class_name ||= "#{inferred_resource_class}::Serializer"
51
39
  end
52
40
  end
53
41
 
@@ -6,11 +6,9 @@ module LedgerSync
6
6
  module InferValidationContractMixin
7
7
  module ClassMethods
8
8
  def inferred_validation_contract_class
9
- @inferred_validation_contract_class ||= begin
10
- const_get(
11
- inferred_validation_contract_class_name
12
- )
13
- end
9
+ @inferred_validation_contract_class ||= const_get(
10
+ inferred_validation_contract_class_name
11
+ )
14
12
  end
15
13
 
16
14
  def inferred_validation_contract_class_name
@@ -44,13 +44,13 @@ module LedgerSync
44
44
  end
45
45
 
46
46
  def changed?
47
- super || resource_attributes.references_many.select(&:changed?).any?
47
+ super || resource_attributes.references_many.any?(&:changed?)
48
48
  end
49
49
 
50
50
  def changes
51
- super.merge(Hash[resource_attributes.references_many.map do |ref|
52
- [ref.name, ref.changes['value']] if ref.changed?
53
- end.compact])
51
+ super.merge(resource_attributes.references_many.map do |ref|
52
+ [ref.name, ref.changes['value']] if ref.changed?
53
+ end.compact.to_h)
54
54
  end
55
55
 
56
56
  def class_from_resource_type(obj)
@@ -62,7 +62,7 @@ module LedgerSync
62
62
  end
63
63
 
64
64
  def self.inherited(subclass)
65
- resource_attributes.each do |_name, resource_attribute|
65
+ resource_attributes.each_value do |resource_attribute|
66
66
  subclass._add_resource_attribute(resource_attribute)
67
67
  end
68
68
 
@@ -80,11 +80,11 @@ module LedgerSync
80
80
  end
81
81
 
82
82
  def self.resource_module_str
83
- @resource_module_str ||= name.split('::').last
83
+ @resource_module_str ||= name.split("#{inferred_config.base_module.name}::").last
84
84
  end
85
85
 
86
86
  def self.resource_type
87
- @resource_type ||= LedgerSync::Util::StringHelpers.underscore(name.split('::').last).to_sym
87
+ @resource_type ||= LedgerSync::Util::StringHelpers.underscore(resource_module_str).to_sym
88
88
  end
89
89
 
90
90
  def self.serialize_attribute?(sattr)
@@ -40,12 +40,12 @@ module LedgerSync
40
40
  end
41
41
 
42
42
  def dirty_attributes_to_h
43
- Hash[self.class.dirty_attributes.keys.map do |k|
43
+ self.class.dirty_attributes.keys.to_h do |k|
44
44
  [
45
45
  k,
46
46
  public_send(k)
47
47
  ]
48
- end]
48
+ end
49
49
  end
50
50
 
51
51
  # Normally you would just call `changes_applied`, but because we
@@ -14,7 +14,7 @@ module LedgerSync
14
14
  #
15
15
  # @return [Serializer::Attribute]
16
16
  #
17
- def attribute(_hash_attribute, _args = {}, &_block)
17
+ def attribute(_hash_attribute, _args = {}, &)
18
18
  raise NotImplementedError
19
19
  end
20
20
 
@@ -60,7 +60,7 @@ module LedgerSync
60
60
  @attributes ||= Serialization::SerializerAttributeSet.new(serializer_class: self)
61
61
  end
62
62
 
63
- def self.references_one(hash_attribute, args = {}, &block)
63
+ def self.references_one(hash_attribute, args = {}, &)
64
64
  attribute(
65
65
  hash_attribute,
66
66
  {
@@ -68,11 +68,11 @@ module LedgerSync
68
68
  serializer: serializer_from(hash_attribute, args)
69
69
  )
70
70
  }.merge(args),
71
- &block
71
+ &
72
72
  )
73
73
  end
74
74
 
75
- def self.references_many(hash_attribute, args = {}, &block)
75
+ def self.references_many(hash_attribute, args = {}, &)
76
76
  attribute(
77
77
  hash_attribute,
78
78
  {
@@ -80,7 +80,7 @@ module LedgerSync
80
80
  serializer: serializer_from(hash_attribute, args)
81
81
  )
82
82
  }.merge(args),
83
- &block
83
+ &
84
84
  )
85
85
  end
86
86
 
@@ -65,7 +65,7 @@ end
65
65
  def generate_resource_factories
66
66
  LedgerSync.ledgers.each do |ledger_key, ledger|
67
67
  ledger.client_class.resources.each do |resource_key, resource_class|
68
- factory_key = "#{ledger_key}_#{resource_key}".to_sym
68
+ factory_key = :"#{ledger_key}_#{resource_key}"
69
69
  next if FactoryBot.factories.registered?(factory_key)
70
70
 
71
71
  register_factory(prefix: ledger_key, resource_class: resource_class)
@@ -101,7 +101,7 @@ module FactoryBot
101
101
  def self.test_run_id(*appends, **keywords)
102
102
  @test_run_id ||= rand_id(
103
103
  *appends,
104
- **keywords.merge(include_test_run_id: false)
104
+ **keywords, include_test_run_id: false
105
105
  )
106
106
  end
107
107
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  def setup_client_qa_support(*clients, keyed: false) # rubocop:disable Metrics/PerceivedComplexity
4
- qa_clients = Hash[clients.uniq.map do |client|
4
+ qa_clients = clients.uniq.to_h do |client|
5
5
  key = client.config.root_key
6
6
 
7
7
  qa_support "#{key}_helpers"
@@ -14,7 +14,7 @@ def setup_client_qa_support(*clients, keyed: false) # rubocop:disable Metrics/Pe
14
14
  key: key
15
15
  }
16
16
  ]
17
- end]
17
+ end
18
18
 
19
19
  RSpec.configure do |config|
20
20
  qa_clients.each_value do |data|
@@ -29,7 +29,7 @@ module LedgerSync
29
29
  Gem.find_files(File.join(dir, '*.json')).map do |file_path|
30
30
  record = File.basename(file_path, '.json').to_sym
31
31
  @records[record] = record_class.new(
32
- hash: JSON.parse(File.open(file_path).read),
32
+ hash: JSON.parse(File.read(file_path)),
33
33
  path: file_path,
34
34
  record: record
35
35
  )
@@ -35,7 +35,7 @@ module LedgerSync
35
35
  def valid?(args = {})
36
36
  value = args.fetch(:value)
37
37
  return false unless value.is_a?(Array)
38
- return true if (resource_classes & value.map(&:class)).any?
38
+ return true if resource_classes.intersect?(value.map(&:class))
39
39
  return true if value.is_a?(Array) && value.empty?
40
40
 
41
41
  false
@@ -44,7 +44,7 @@ module LedgerSync
44
44
  value = args.fetch(:value)
45
45
 
46
46
  return true if value.nil?
47
- return true if valid_classes.select { |e| value.is_a?(e) }.any?
47
+ return true if valid_classes.any? { |e| value.is_a?(e) }
48
48
 
49
49
  false
50
50
  end
@@ -24,7 +24,7 @@ module LedgerSync
24
24
  client_method = env_key.split(prefix).last.downcase
25
25
 
26
26
  if line =~ /\A#{prefix}/ && to_save.key?(client_method)
27
- env_value = ENV[env_key]
27
+ env_value = ENV.fetch(env_key, nil)
28
28
  new_value = to_save.delete(client_method)
29
29
  tempfile.puts "#{env_key}=#{new_value}"
30
30
  next if env_value == new_value.to_s
@@ -22,7 +22,7 @@ module LedgerSync
22
22
  def add(attribute)
23
23
  unless attribute.destination_attribute.nil?
24
24
  if @attribute_keys.key?(attribute.destination_attribute.to_s)
25
- raise "destination_attribute already defined for #{resource_converter_class.name}: "\
25
+ raise "destination_attribute already defined for #{resource_converter_class.name}: " \
26
26
  "#{attribute.destination_attribute}"
27
27
  end
28
28
 
@@ -54,15 +54,15 @@ module LedgerSync
54
54
  )
55
55
  end
56
56
 
57
- def self.attribute(*args, &block)
58
- _attribute(*args, &block)
57
+ def self.attribute(...)
58
+ _attribute(...)
59
59
  end
60
60
 
61
61
  def self.attributes
62
62
  @attributes ||= ResourceConverter::AttributeSet.new(resource_converter_class: self)
63
63
  end
64
64
 
65
- def self._references(destination_attribute = nil, args = {}, &block)
65
+ def self._references(destination_attribute = nil, args = {}, &)
66
66
  reference_type = args.fetch(:reference_type)
67
67
  resource_converter = args.fetch(:resource_converter)
68
68
 
@@ -89,27 +89,27 @@ module LedgerSync
89
89
  ]
90
90
  )
91
91
  ),
92
- &block
92
+ &
93
93
  )
94
94
  end
95
95
 
96
- def self.references_one(destination_attribute = nil, args = {}, &block)
96
+ def self.references_one(destination_attribute = nil, args = {}, &)
97
97
  _references(
98
98
  destination_attribute,
99
99
  {
100
100
  reference_type: :one
101
101
  }.merge(args),
102
- &block
102
+ &
103
103
  )
104
104
  end
105
105
 
106
- def self.references_many(destination_attribute = nil, args = {}, &block)
106
+ def self.references_many(destination_attribute = nil, args = {}, &)
107
107
  _references(
108
108
  destination_attribute,
109
109
  {
110
110
  reference_type: :many
111
111
  }.merge(args),
112
- &block
112
+ &
113
113
  )
114
114
  end
115
115
  end
@@ -51,37 +51,35 @@ module LedgerSync
51
51
  end
52
52
  raise "#{type} is an invalid resource type" if resource_class.nil?
53
53
 
54
- current_data = Hash[
55
- current_data.map do |k, v|
56
- k = k.to_sym
54
+ current_data = current_data.to_h do |k, v|
55
+ k = k.to_sym
57
56
 
58
- attribute = resource_class.resource_attributes[k]
59
- if attribute.nil? && !ignore_unrecognized_attributes
60
- raise "Unrecognized attribute for #{resource_class.name}: #{k}"
61
- end
57
+ attribute = resource_class.resource_attributes[k]
58
+ if attribute.nil? && !ignore_unrecognized_attributes
59
+ raise "Unrecognized attribute for #{resource_class.name}: #{k}"
60
+ end
62
61
 
63
- v = if attribute.is_a?(ResourceAttribute::Reference::One)
64
- resource_type = resource_type_by(external_id: current_data[k])
62
+ v = if attribute.is_a?(ResourceAttribute::Reference::One)
63
+ resource_type = resource_type_by(external_id: current_data[k])
64
+ resource_or_build(
65
+ external_id: current_data[k],
66
+ type: resource_type
67
+ )
68
+ elsif attribute.is_a?(ResourceAttribute::Reference::Many)
69
+ current_data[k].map do |many_reference|
65
70
  resource_or_build(
66
- external_id: current_data[k],
67
- type: resource_type
71
+ external_id: many_reference,
72
+ type: attribute.type.resource_class.resource_type
68
73
  )
69
- elsif attribute.is_a?(ResourceAttribute::Reference::Many)
70
- current_data[k].map do |many_reference|
71
- resource_or_build(
72
- external_id: many_reference,
73
- type: attribute.type.resource_class.resource_type
74
- )
75
- end
76
- elsif cast
77
- attribute.type.cast(value: v)
78
- else
79
- v
80
74
  end
75
+ elsif cast
76
+ attribute.type.cast(value: v)
77
+ else
78
+ v
79
+ end
81
80
 
82
- [k, v]
83
- end
84
- ]
81
+ [k, v]
82
+ end
85
83
 
86
84
  @all_resources[resource_key(external_id: external_id, type: type)] ||= resource_class.new(
87
85
  external_id: external_id,
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'base64'
4
+
3
5
  module LedgerSync
4
6
  module Util
5
7
  class Signer
@@ -25,11 +27,11 @@ module LedgerSync
25
27
  end
26
28
 
27
29
  def self.escape(str:)
28
- CGI.escape(str).gsub(/\+/, '%20')
30
+ CGI.escape(str).gsub('+', '%20')
29
31
  end
30
32
 
31
33
  def self.unescape(str:)
32
- CGI.unescape(str.gsub(/%20/, '+'))
34
+ CGI.unescape(str.gsub('%20', '+'))
33
35
  end
34
36
  end
35
37
  end
@@ -10,7 +10,7 @@ module LedgerSync
10
10
  end
11
11
 
12
12
  def underscore!(str)
13
- str.gsub!(/::/, '/')
13
+ str.gsub!('::', '/')
14
14
  str.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
15
15
  str.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
16
16
  str.tr!('-', '_')
@@ -2,11 +2,11 @@
2
2
 
3
3
  # :nocov:
4
4
  module LedgerSync
5
- VERSION = '2.5.0'
5
+ VERSION = '3.0.0'
6
6
 
7
7
  def self.version
8
8
  if ENV['PRE_RELEASE']
9
- "#{VERSION}.pre.#{ENV['GITHUB_RUN_NUMBER']}"
9
+ "#{VERSION}.pre.#{ENV.fetch('GITHUB_RUN_NUMBER', nil)}"
10
10
  else
11
11
  VERSION
12
12
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ledger_sync
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Jackson
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2019-05-21 00:00:00.000000000 Z
10
+ date: 2024-12-26 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: awesome_print
@@ -154,16 +153,16 @@ dependencies:
154
153
  name: rubocop
155
154
  requirement: !ruby/object:Gem::Requirement
156
155
  requirements:
157
- - - '='
156
+ - - "~>"
158
157
  - !ruby/object:Gem::Version
159
- version: 1.0.0
158
+ version: '1.62'
160
159
  type: :development
161
160
  prerelease: false
162
161
  version_requirements: !ruby/object:Gem::Requirement
163
162
  requirements:
164
- - - '='
163
+ - - "~>"
165
164
  - !ruby/object:Gem::Version
166
- version: 1.0.0
165
+ version: '1.62'
167
166
  - !ruby/object:Gem::Dependency
168
167
  name: simplecov
169
168
  requirement: !ruby/object:Gem::Requirement
@@ -336,14 +335,14 @@ dependencies:
336
335
  name: openssl
337
336
  requirement: !ruby/object:Gem::Requirement
338
337
  requirements:
339
- - - "~>"
338
+ - - ">"
340
339
  - !ruby/object:Gem::Version
341
340
  version: 2.2.0
342
341
  type: :runtime
343
342
  prerelease: false
344
343
  version_requirements: !ruby/object:Gem::Requirement
345
344
  requirements:
346
- - - "~>"
345
+ - - ">"
347
346
  - !ruby/object:Gem::Version
348
347
  version: 2.2.0
349
348
  - !ruby/object:Gem::Dependency
@@ -427,6 +426,7 @@ files:
427
426
  - ".env.template"
428
427
  - ".github/ISSUE_TEMPLATE/bug_report.md"
429
428
  - ".github/ISSUE_TEMPLATE/feature_request.md"
429
+ - ".github/workflows/codeql.yml"
430
430
  - ".github/workflows/gem-workflow.yml"
431
431
  - ".gitignore"
432
432
  - ".overcommit.yml"
@@ -775,8 +775,8 @@ files:
775
775
  homepage: https://github.com/LedgerSync/ledger_sync
776
776
  licenses:
777
777
  - MIT
778
- metadata: {}
779
- post_install_message:
778
+ metadata:
779
+ rubygems_mfa_required: 'true'
780
780
  rdoc_options: []
781
781
  require_paths:
782
782
  - lib
@@ -784,15 +784,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
784
784
  requirements:
785
785
  - - ">="
786
786
  - !ruby/object:Gem::Version
787
- version: 2.5.8
787
+ version: '3.1'
788
788
  required_rubygems_version: !ruby/object:Gem::Requirement
789
789
  requirements:
790
790
  - - ">="
791
791
  - !ruby/object:Gem::Version
792
792
  version: '0'
793
793
  requirements: []
794
- rubygems_version: 3.2.33
795
- signing_key:
794
+ rubygems_version: 3.6.2
796
795
  specification_version: 4
797
796
  summary: Sync common objects to accounting software.
798
797
  test_files: []