ledger_sync 1.5.2 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
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