ledger_sync 1.5.2 → 1.6.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f2b28cb8266fdd627c4c7b19166f0fae7c65742556662e5fdb4150aa6d73a297
4
- data.tar.gz: 5184d055660ead3e05e63dc4e3ad6bff063d79af1e9571311d62ca1ad67acfab
3
+ metadata.gz: a222c327386f4dc5ec093f20d1396a77f4cb65e62bd46e13896f5f9a160c3cc3
4
+ data.tar.gz: 4545a5d71b699d92afc1d7a5f226a646965011e97cfe85b142f742920d28abf5
5
5
  SHA512:
6
- metadata.gz: f937d553df677636512d4e8345b2c188f0533a9cc7e8f74911b90b258646c206ed9f5c3172f422a4c31a32724d9d58086aa362ada77526f113cb733fe7554ad7
7
- data.tar.gz: 267bf6cefa55aa03de38086666917e852d865e7045c68bc923648fd2c237e26fdf71a1a700bba239c4afa15430283b6748ed8b61b334b923d56c99c43c5f6c3f
6
+ metadata.gz: 6fa511fac28518775882d9b4644a3f5becea15a8529f4c44a59a7e758908a020d10741a1377afb0dfac6ff6d10ee0ca678bd8aef928b547b7d805145203cda2f
7
+ data.tar.gz: 6a38f96c0bbb00606c5d4521f48103e29dcb60fea339e1a6c6133e45d9293760c39e16b80ac143e28686a05431ccc998b00dc348929276d5d78f2915bcc91035
data/.gitignore CHANGED
@@ -24,6 +24,7 @@ _site/
24
24
 
25
25
  # dotenv
26
26
  .env
27
+ *.local
27
28
 
28
29
  .tool-versions
29
30
  .ruby-version
data/.travis.yml CHANGED
@@ -9,7 +9,6 @@ rvm:
9
9
  before_install:
10
10
  - gem update --system
11
11
  - gem install bundler
12
- - rm Gemfile.lock
13
12
  - bundle install
14
13
  script:
15
14
  - bundle exec rspec --order rand
data/Gemfile.lock CHANGED
@@ -1,10 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ledger_sync (1.5.2)
4
+ ledger_sync (1.6.0)
5
5
  activemodel
6
6
  colorize
7
- dotenv (~> 2.7.6)
8
7
  dry-schema (~> 1.5.4)
9
8
  dry-validation (~> 1.5.6)
10
9
  faraday
@@ -41,6 +40,7 @@ GEM
41
40
  bump (0.9.0)
42
41
  byebug (11.1.3)
43
42
  childprocess (4.0.0)
43
+ climate_control (0.2.0)
44
44
  colorator (1.1.0)
45
45
  colorize (0.8.1)
46
46
  concurrent-ruby (1.1.7)
@@ -186,19 +186,19 @@ GEM
186
186
  resonad (1.3.0)
187
187
  rexml (3.2.4)
188
188
  rouge (3.24.0)
189
- rspec (3.9.0)
190
- rspec-core (~> 3.9.0)
191
- rspec-expectations (~> 3.9.0)
192
- rspec-mocks (~> 3.9.0)
193
- rspec-core (3.9.3)
194
- rspec-support (~> 3.9.3)
195
- rspec-expectations (3.9.3)
189
+ rspec (3.10.0)
190
+ rspec-core (~> 3.10.0)
191
+ rspec-expectations (~> 3.10.0)
192
+ rspec-mocks (~> 3.10.0)
193
+ rspec-core (3.10.0)
194
+ rspec-support (~> 3.10.0)
195
+ rspec-expectations (3.10.0)
196
196
  diff-lcs (>= 1.2.0, < 2.0)
197
- rspec-support (~> 3.9.0)
198
- rspec-mocks (3.9.1)
197
+ rspec-support (~> 3.10.0)
198
+ rspec-mocks (3.10.0)
199
199
  diff-lcs (>= 1.2.0, < 2.0)
200
- rspec-support (~> 3.9.0)
201
- rspec-support (3.9.4)
200
+ rspec-support (~> 3.10.0)
201
+ rspec-support (3.10.0)
202
202
  rubocop (1.0.0)
203
203
  parallel (~> 1.10)
204
204
  parser (>= 2.7.1.5)
@@ -208,7 +208,7 @@ GEM
208
208
  rubocop-ast (>= 0.6.0)
209
209
  ruby-progressbar (~> 1.7)
210
210
  unicode-display_width (>= 1.4.0, < 2.0)
211
- rubocop-ast (1.1.0)
211
+ rubocop-ast (1.1.1)
212
212
  parser (>= 2.7.1.5)
213
213
  ruby-progressbar (1.10.1)
214
214
  ruby2_keywords (0.0.2)
@@ -250,11 +250,11 @@ GEM
250
250
  addressable
251
251
  httpi (~> 2.0)
252
252
  nokogiri (>= 1.4.2)
253
- webmock (3.9.3)
253
+ webmock (3.9.4)
254
254
  addressable (>= 2.3.6)
255
255
  crack (>= 0.3.2)
256
256
  hashdiff (>= 0.4.0, < 2.0.0)
257
- zeitwerk (2.4.0)
257
+ zeitwerk (2.4.1)
258
258
 
259
259
  PLATFORMS
260
260
  ruby
@@ -264,7 +264,9 @@ DEPENDENCIES
264
264
  bump (~> 0.9.0)
265
265
  bundler (~> 2.1)
266
266
  byebug
267
+ climate_control
267
268
  coveralls (~> 0.8.23)
269
+ dotenv
268
270
  factory_bot (~> 6.1.0)
269
271
  jekyll (~> 3.8.4)
270
272
  jekyll-menus (~> 0.6.0)
@@ -274,7 +276,7 @@ DEPENDENCIES
274
276
  overcommit (~> 0.57.0)
275
277
  rake (~> 13.0)
276
278
  rspec (~> 3.2)
277
- rubocop
279
+ rubocop (= 1.0.0)
278
280
  vcr
279
281
  webmock
280
282
 
data/ledger_sync.gemspec CHANGED
@@ -34,7 +34,9 @@ Gem::Specification.new do |spec|
34
34
  spec.add_development_dependency('bump', '~> 0.9.0')
35
35
  spec.add_development_dependency('bundler', '~> 2.1')
36
36
  spec.add_development_dependency('byebug', '>= 0')
37
+ spec.add_development_dependency('climate_control')
37
38
  spec.add_development_dependency('coveralls', '~> 0.8.23')
39
+ spec.add_development_dependency('dotenv')
38
40
  spec.add_development_dependency('factory_bot', '~> 6.1.0')
39
41
  spec.add_development_dependency('jekyll', '~> 3.8.4')
40
42
  spec.add_development_dependency('jekyll-menus', '~> 0.6.0')
@@ -43,12 +45,11 @@ Gem::Specification.new do |spec|
43
45
  spec.add_development_dependency('overcommit', '~> 0.57.0')
44
46
  spec.add_development_dependency('rake', '~> 13.0')
45
47
  spec.add_development_dependency('rspec', '~> 3.2')
46
- spec.add_development_dependency('rubocop', '>= 0')
48
+ spec.add_development_dependency('rubocop', '1.0.0')
47
49
  spec.add_development_dependency('vcr', '>= 0')
48
50
  spec.add_development_dependency('webmock', '>= 0')
49
51
  spec.add_runtime_dependency('activemodel', '>= 0')
50
52
  spec.add_runtime_dependency('colorize', '>= 0')
51
- spec.add_runtime_dependency('dotenv', '~> 2.7.6')
52
53
  spec.add_runtime_dependency('dry-schema', '~> 1.5.4')
53
54
  spec.add_runtime_dependency('dry-validation', '~> 1.5.6')
54
55
  spec.add_runtime_dependency('faraday', '>= 0')
data/lib/ledger_sync.rb CHANGED
@@ -16,10 +16,6 @@ require 'oauth2'
16
16
  require 'tempfile'
17
17
  require 'pd_ruby'
18
18
 
19
- # Dotenv
20
- require 'dotenv'
21
- Dotenv.load
22
-
23
19
  # Version
24
20
  require 'ledger_sync/version'
25
21
 
@@ -40,6 +36,7 @@ require 'ledger_sync/util/signer'
40
36
  require 'ledger_sync/util/hash_helpers'
41
37
  require 'ledger_sync/util/read_only_object'
42
38
  require 'ledger_sync/util/resources_builder'
39
+ require 'ledger_sync/util/dotenv_updator'
43
40
  require 'ledger_sync/ledger_configuration'
44
41
  require 'ledger_sync/ledger_configuration_store'
45
42
  require 'ledger_sync/util/performer'
@@ -13,14 +13,20 @@ module LedgerSync
13
13
 
14
14
  module Mixin
15
15
  module InstanceMethods
16
- def ledger_configuration
17
- self.class.config
18
- end
19
-
20
16
  def base_module
21
17
  self.class.base_module
22
18
  end
23
19
 
20
+ def update_secrets_in_dotenv
21
+ return if ENV['TEST_ENV'] && !ENV['USE_DOTENV_ADAPTOR_SECRETS']
22
+
23
+ Util::DotenvUpdator.new.update(client: self)
24
+ end
25
+
26
+ def ledger_configuration
27
+ self.class.config
28
+ end
29
+
24
30
  def ledger_attributes_to_save
25
31
  return {} if self.class.ledger_attributes_to_save.nil?
26
32
 
@@ -6,9 +6,9 @@ module LedgerSync
6
6
  module InferConfigMixin
7
7
  module ClassMethods
8
8
  def inferred_config
9
- @inferred_config ||= begin
10
- return if name.nil?
9
+ return if name.nil?
11
10
 
11
+ @inferred_config ||= begin
12
12
  name_parts = name.split('::')
13
13
  name_parts_length = name_parts.count
14
14
 
@@ -17,7 +17,7 @@ module LedgerSync
17
17
  name_parts_length.times do |i|
18
18
  config = LedgerSync.ledgers.config_from_base_module(
19
19
  base_module: Object.const_get(
20
- name_parts[0..(name_parts_length - i)].join('::')
20
+ name_parts[0..(name_parts_length - 1 - i)].join('::')
21
21
  )
22
22
  )
23
23
  break if config.present?
@@ -10,8 +10,11 @@ module LedgerSync
10
10
  def inferred_resource_class
11
11
  @inferred_resource_class ||= begin
12
12
  base_module = inferred_config.base_module
13
-
14
- base_module.const_get(name.split(base_module.name).last.split('::')[1])
13
+ if name.include?('::Operations::')
14
+ base_module.const_get(name.split('::Operations::').first)
15
+ else
16
+ base_module.const_get(name.split(base_module.name).last.split('::')[1])
17
+ end
15
18
  end
16
19
  end
17
20
  end
@@ -9,24 +9,30 @@ module LedgerSync
9
9
  module InferSerializerMixin
10
10
  module ClassMethods
11
11
  def inferred_deserializer_class
12
- @inferred_deserializer_class ||= inferred_config.base_module.const_get(
13
- inferred_deserializer_class_name
14
- )
12
+ @inferred_deserializer_class ||= begin
13
+ inferred_config.base_module.const_get(
14
+ inferred_deserializer_class_name
15
+ )
16
+ end
15
17
  end
16
18
 
17
19
  def inferred_deserializer_class_name
18
- @inferred_deserializer_class_name ||= "#{inferred_resource_class.resource_module_str}::Deserializer"
20
+ @inferred_deserializer_class_name ||= begin
21
+ "#{inferred_resource_class}::Deserializer"
22
+ end
19
23
  end
20
24
 
21
25
  def inferred_searcher_deserializer_class
22
- @inferred_searcher_deserializer_class ||= inferred_config.base_module.const_get(
23
- inferred_searcher_deserializer_class_name
24
- )
26
+ @inferred_searcher_deserializer_class ||= begin
27
+ inferred_config.base_module.const_get(
28
+ inferred_searcher_deserializer_class_name
29
+ )
30
+ end
25
31
  end
26
32
 
27
33
  def inferred_searcher_deserializer_class_name
28
34
  @inferred_searcher_deserializer_class_name ||= begin
29
- "#{inferred_resource_class.resource_module_str}::SearcherDeserializer"
35
+ "#{inferred_resource_class}::SearcherDeserializer"
30
36
  end
31
37
  end
32
38
 
@@ -39,7 +45,9 @@ module LedgerSync
39
45
  end
40
46
 
41
47
  def inferred_serializer_class_name
42
- @inferred_serializer_class_name ||= "#{inferred_resource_class.resource_module_str}::Serializer"
48
+ @inferred_serializer_class_name ||= begin
49
+ "#{inferred_resource_class}::Serializer"
50
+ end
43
51
  end
44
52
  end
45
53
 
@@ -13,7 +13,7 @@ module LedgerSync
13
13
  type = args.fetch(:type)
14
14
 
15
15
  inferred_config.base_module.const_get(
16
- "#{inferred_resource_class.resource_module_str}::#{type.camelcase}"
16
+ "#{inferred_resource_class}::#{type.camelcase}"
17
17
  )
18
18
  end
19
19
 
@@ -98,6 +98,10 @@ module LedgerSync
98
98
  def upsert
99
99
  @upsert ||= http_methods.find { |e| e.key == "put /#{record}/{id}" }
100
100
  end
101
+
102
+ def self.config
103
+ Client.config
104
+ end
101
105
  end
102
106
  end
103
107
  end
@@ -148,39 +148,6 @@ module LedgerSync
148
148
  oauth_token
149
149
  end
150
150
 
151
- def update_secrets_in_dotenv # rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
152
- return if ENV['TEST_ENV'] && !ENV['USE_DOTENV_ADAPTOR_SECRETS']
153
-
154
- filename = File.join(Dir.pwd, '.env')
155
- return unless File.exist?(filename)
156
-
157
- prefix = 'QUICKBOOKS_ONLINE_'
158
-
159
- Tempfile.open(".#{File.basename(filename)}", File.dirname(filename)) do |tempfile|
160
- File.open(filename).each do |line|
161
- env_key = line.split('=').first
162
- client_method = env_key.split(prefix).last.downcase
163
-
164
- if line =~ /\A#{prefix}/ && respond_to?(client_method)
165
- env_value = ENV[env_key]
166
- new_value = send(client_method)
167
- tempfile.puts "#{env_key}=#{new_value}"
168
- next if env_value == new_value
169
-
170
- ENV[env_key] = new_value
171
- tempfile.puts "# #{env_key}=#{env_value} # Updated on #{Time.now}"
172
- else
173
- tempfile.puts line
174
- end
175
- end
176
-
177
- tempfile.close
178
- FileUtils.mv tempfile.path, filename
179
- end
180
-
181
- Dotenv.load
182
- end
183
-
184
151
  def url_for(resource:)
185
152
  DashboardURLHelper.new(
186
153
  resource: resource,
@@ -46,6 +46,8 @@ module LedgerSync
46
46
  super
47
47
  rescue LedgerSync::Error::OperationError, OAuth2::Error => e
48
48
  failure(e)
49
+ ensure
50
+ client.update_secrets_in_dotenv
49
51
  end
50
52
 
51
53
  def quickbooks_online_resource_type
@@ -28,6 +28,15 @@ module LedgerSync
28
28
  module Test
29
29
  module Support
30
30
  def self.setup(*paths_to_require)
31
+ # Dotenv
32
+ require 'dotenv'
33
+ Dotenv.load(
34
+ '.env.test.local',
35
+ '.env.test',
36
+ '.env'
37
+ )
38
+ require 'climate_control'
39
+
31
40
  require 'webmock/rspec'
32
41
  require 'simplecov'
33
42
  require 'coveralls'
@@ -1,26 +1,47 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- def setup_client_qa_support(*clients, keyed: false)
4
- clients.each do |client|
3
+ def setup_client_qa_support(*clients, keyed: false) # rubocop:disable Metrics/PerceivedComplexity
4
+ qa_clients = Hash[clients.uniq.map do |client|
5
5
  key = client.config.root_key
6
6
 
7
7
  qa_support "#{key}_helpers"
8
- helpers_module = Object.const_get("QA::#{client.base_module.name.split('::').last}Helpers")
9
- env_key = "#{key}_qa".upcase
10
8
 
11
- RSpec.configure do |config|
9
+ [
10
+ client,
11
+ {
12
+ env_key: "#{key}_qa".upcase,
13
+ helpers_module: Object.const_get("QA::#{client.base_module.name.split('::').last}Helpers"),
14
+ key: key
15
+ }
16
+ ]
17
+ end]
18
+
19
+ RSpec.configure do |config|
20
+ qa_clients.each_value do |data|
12
21
  if keyed
13
- config.include helpers_module, qa: true, client: key
22
+ config.include data[:helpers_module], qa: true, client: data[:key]
14
23
  else
15
- config.include helpers_module, qa: true
24
+ config.include data[:helpers_module], qa: true
16
25
  end
26
+ end
27
+
28
+ config.around(:each, qa: true) do |example|
29
+ described_class = example.metadata[:described_class]
30
+ config = if described_class.respond_to?(:config)
31
+ described_class.config
32
+ else
33
+ described_class.inferred_config
34
+ end
35
+ client_key = example.metadata.fetch(:client, config.root_key)
17
36
 
18
- config.around(:each, qa: true) do |example|
19
- if ENV.fetch(env_key, nil) == '1'
37
+ env_key = "#{client_key}_QA".upcase
38
+
39
+ if ENV.fetch(env_key, nil) == '1'
40
+ ClimateControl.modify(Dotenv.parse(ENV.fetch('LOCAL_DOTENV_PATH', '.env.local'))) do
20
41
  example.run
21
- else
22
- skip "Set #{env_key}=1 to run #{key} QA tests"
23
42
  end
43
+ else
44
+ skip "Set #{env_key}=1 to run #{client_key} QA tests"
24
45
  end
25
46
  end
26
47
  end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LedgerSync
4
+ module Util
5
+ class DotenvUpdator
6
+ attr_reader :file_path
7
+
8
+ def initialize(args = {})
9
+ @file_path = args.fetch(:file_path, File.join(Dir.pwd, '.env.local'))
10
+ end
11
+
12
+ def update(args = {})
13
+ client = args.fetch(:client)
14
+ prefix = args.fetch(:prefix, "#{client.class.config.root_key.upcase}_")
15
+
16
+ to_save = client.ledger_attributes_to_save.dup.stringify_keys
17
+
18
+ Tempfile.open(".#{File.basename(file_path)}", File.dirname(file_path)) do |tempfile|
19
+ File.open(file_path).each do |line|
20
+ env_key = line.split('=').first
21
+ client_method = env_key.split(prefix).last.downcase
22
+
23
+ if line =~ /\A#{prefix}/ && to_save.key?(client_method)
24
+ env_value = ENV[env_key]
25
+ new_value = to_save.delete(client_method)
26
+ tempfile.puts "#{env_key}=#{new_value}"
27
+ next if env_value == new_value.to_s
28
+
29
+ ENV[env_key] = new_value.to_s
30
+ tempfile.puts "# #{env_key}=#{env_value} # Updated on #{Time.now}"
31
+ else
32
+ tempfile.puts line
33
+ end
34
+ end
35
+
36
+ to_save.each { |k, v| tempfile.puts(["#{prefix}#{k}".upcase, v].map(&:to_s).join('=')) }
37
+
38
+ tempfile.close
39
+ FileUtils.mv tempfile.path, file_path
40
+ end
41
+
42
+ Dotenv.load
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LedgerSync
4
- VERSION = '1.5.2'
4
+ VERSION = '1.6.0'
5
5
 
6
6
  def self.version
7
7
  if !ENV['TRAVIS'] || ENV.fetch('TRAVIS_TAG', '') != ''
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ledger_sync
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.2
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Jackson
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: climate_control
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: coveralls
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +94,20 @@ dependencies:
80
94
  - - "~>"
81
95
  - !ruby/object:Gem::Version
82
96
  version: 0.8.23
97
+ - !ruby/object:Gem::Dependency
98
+ name: dotenv
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: factory_bot
85
113
  requirement: !ruby/object:Gem::Requirement
@@ -196,16 +224,16 @@ dependencies:
196
224
  name: rubocop
197
225
  requirement: !ruby/object:Gem::Requirement
198
226
  requirements:
199
- - - ">="
227
+ - - '='
200
228
  - !ruby/object:Gem::Version
201
- version: '0'
229
+ version: 1.0.0
202
230
  type: :development
203
231
  prerelease: false
204
232
  version_requirements: !ruby/object:Gem::Requirement
205
233
  requirements:
206
- - - ">="
234
+ - - '='
207
235
  - !ruby/object:Gem::Version
208
- version: '0'
236
+ version: 1.0.0
209
237
  - !ruby/object:Gem::Dependency
210
238
  name: vcr
211
239
  requirement: !ruby/object:Gem::Requirement
@@ -262,20 +290,6 @@ dependencies:
262
290
  - - ">="
263
291
  - !ruby/object:Gem::Version
264
292
  version: '0'
265
- - !ruby/object:Gem::Dependency
266
- name: dotenv
267
- requirement: !ruby/object:Gem::Requirement
268
- requirements:
269
- - - "~>"
270
- - !ruby/object:Gem::Version
271
- version: 2.7.6
272
- type: :runtime
273
- prerelease: false
274
- version_requirements: !ruby/object:Gem::Requirement
275
- requirements:
276
- - - "~>"
277
- - !ruby/object:Gem::Version
278
- version: 2.7.6
279
293
  - !ruby/object:Gem::Dependency
280
294
  name: dry-schema
281
295
  requirement: !ruby/object:Gem::Requirement
@@ -1113,6 +1127,7 @@ files:
1113
1127
  - lib/ledger_sync/type/string_from_set.rb
1114
1128
  - lib/ledger_sync/type/value.rb
1115
1129
  - lib/ledger_sync/type/value_mixin.rb
1130
+ - lib/ledger_sync/util/dotenv_updator.rb
1116
1131
  - lib/ledger_sync/util/hash_helpers.rb
1117
1132
  - lib/ledger_sync/util/mixins/delegate_iterable_methods_mixin.rb
1118
1133
  - lib/ledger_sync/util/mixins/dupable_mixin.rb