ledger_sync 1.3.4 → 1.3.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +14 -1
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +3 -2
  5. data/Dockerfile +2 -2
  6. data/Gemfile.lock +11 -11
  7. data/LICENSE.txt +97 -21
  8. data/README.md +28 -11
  9. data/bin/quickbooks_online_oauth_server.rb +101 -0
  10. data/lib/ledger_sync.rb +8 -0
  11. data/lib/ledger_sync/adaptor_configuration.rb +4 -4
  12. data/lib/ledger_sync/adaptor_configuration_store.rb +4 -4
  13. data/lib/ledger_sync/adaptors/adaptor.rb +4 -6
  14. data/lib/ledger_sync/adaptors/dashboard_url_helper.rb +23 -0
  15. data/lib/ledger_sync/adaptors/ledger_serializer_attribute_set.rb +3 -5
  16. data/lib/ledger_sync/adaptors/mixins/infer_ledger_serializer_mixin.rb +16 -0
  17. data/lib/ledger_sync/adaptors/netsuite/account/searcher_ledger_deserializer.rb +30 -0
  18. data/lib/ledger_sync/adaptors/netsuite/adaptor.rb +11 -3
  19. data/lib/ledger_sync/adaptors/netsuite/customer/searcher.rb +12 -0
  20. data/lib/ledger_sync/adaptors/netsuite/customer/searcher_ledger_deserializer.rb +23 -0
  21. data/lib/ledger_sync/adaptors/netsuite/dashboard_url_helper.rb +24 -0
  22. data/lib/ledger_sync/adaptors/netsuite/department/searcher_ledger_deserializer.rb +21 -0
  23. data/lib/ledger_sync/adaptors/netsuite/ledger_serializer_type/active_type.rb +26 -0
  24. data/lib/ledger_sync/adaptors/netsuite/location/ledger_serializer.rb +18 -0
  25. data/lib/ledger_sync/adaptors/netsuite/location/operations/create.rb +21 -0
  26. data/lib/ledger_sync/adaptors/netsuite/location/operations/delete.rb +21 -0
  27. data/lib/ledger_sync/adaptors/netsuite/location/operations/find.rb +21 -0
  28. data/lib/ledger_sync/adaptors/netsuite/location/operations/update.rb +21 -0
  29. data/lib/ledger_sync/adaptors/netsuite/location/searcher.rb +12 -0
  30. data/lib/ledger_sync/adaptors/netsuite/record/http_method.rb +1 -1
  31. data/lib/ledger_sync/adaptors/netsuite/record/metadata.rb +11 -7
  32. data/lib/ledger_sync/adaptors/netsuite/searcher.rb +30 -8
  33. data/lib/ledger_sync/adaptors/netsuite/vendor/searcher.rb +12 -0
  34. data/lib/ledger_sync/adaptors/netsuite/vendor/searcher_ledger_deserializer.rb +23 -0
  35. data/lib/ledger_sync/adaptors/operation.rb +7 -3
  36. data/lib/ledger_sync/adaptors/quickbooks_online/adaptor.rb +7 -2
  37. data/lib/ledger_sync/adaptors/quickbooks_online/dashboard_url_helper.rb +1 -26
  38. data/lib/ledger_sync/adaptors/quickbooks_online/department/ledger_serializer.rb +6 -3
  39. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer.rb +1 -1
  40. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer_type/department_reference_type.rb +26 -0
  41. data/lib/ledger_sync/adaptors/quickbooks_online/operation/full_update.rb +0 -1
  42. data/lib/ledger_sync/adaptors/quickbooks_online/util/adaptor_error_parser.rb +5 -5
  43. data/lib/ledger_sync/adaptors/quickbooks_online/util/error_matcher.rb +1 -1
  44. data/lib/ledger_sync/adaptors/quickbooks_online/util/error_parser.rb +1 -1
  45. data/lib/ledger_sync/adaptors/quickbooks_online/util/operation_error_parser.rb +5 -5
  46. data/lib/ledger_sync/adaptors/stripe/adaptor.rb +4 -12
  47. data/lib/ledger_sync/adaptors/stripe/dashboard_url_helper.rb +21 -0
  48. data/lib/ledger_sync/deserializer.rb +59 -0
  49. data/lib/ledger_sync/error/adaptor_errors.rb +2 -2
  50. data/lib/ledger_sync/error/resource_errors.rb +18 -19
  51. data/lib/ledger_sync/resource.rb +9 -8
  52. data/lib/ledger_sync/resource_attribute.rb +30 -7
  53. data/lib/ledger_sync/resource_attribute/mixin.rb +13 -23
  54. data/lib/ledger_sync/resource_attribute/reference/many.rb +11 -5
  55. data/lib/ledger_sync/resource_attribute/reference/one.rb +10 -4
  56. data/lib/ledger_sync/resource_attribute_set.rb +3 -7
  57. data/lib/ledger_sync/resources/location.rb +7 -0
  58. data/lib/ledger_sync/serialization/attribute.rb +47 -0
  59. data/lib/ledger_sync/serialization/attribute_set_mixin.rb +27 -0
  60. data/lib/ledger_sync/serialization/deserializer_attribute.rb +60 -0
  61. data/lib/ledger_sync/serialization/deserializer_attribute_set.rb +22 -0
  62. data/lib/ledger_sync/serialization/deserializer_delegator.rb +17 -0
  63. data/lib/ledger_sync/serialization/mixin.rb +72 -0
  64. data/lib/ledger_sync/serialization/serializer_attribute.rb +51 -0
  65. data/lib/ledger_sync/serialization/serializer_attribute_set.rb +22 -0
  66. data/lib/ledger_sync/serialization/serializer_delegator.rb +17 -0
  67. data/lib/ledger_sync/serialization/type/references_many_type.rb +19 -0
  68. data/lib/ledger_sync/serialization/type/references_one_type.rb +12 -0
  69. data/lib/ledger_sync/serialization/type/serializer_type.rb +23 -0
  70. data/lib/ledger_sync/serialization/type/value_type.rb +15 -0
  71. data/lib/ledger_sync/serializer.rb +46 -0
  72. data/lib/ledger_sync/type/date.rb +2 -0
  73. data/lib/ledger_sync/type/id.rb +2 -0
  74. data/lib/ledger_sync/type/reference_one.rb +8 -4
  75. data/lib/ledger_sync/type/value_mixin.rb +2 -2
  76. data/lib/ledger_sync/util/mixins/delegate_iterable_methods_mixin.rb +42 -0
  77. data/lib/ledger_sync/util/mixins/dupable_mixin.rb +13 -0
  78. data/lib/ledger_sync/version.rb +1 -1
  79. metadata +39 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3a9ac9abd02e87286bdff439fc491e286bb1d4d175f109f892061e7485cec2fd
4
- data.tar.gz: ef25734c3e806d530e9b50b9cec78bc93de4c11ec87dc8c9be5f004650113487
3
+ metadata.gz: 88373f5810a2313413c6d0a51ac42ff1fd80c7a58661ae37e04a0bad1d9d5e77
4
+ data.tar.gz: 626de0eb9096dc719354afee2e82fefdb392595869c07a22b8cfe2a89c502d0a
5
5
  SHA512:
6
- metadata.gz: 34d67c0a951e721b66b61fd686cdb9258d11aa7270a61fe32e5aa2c0d66a1b614643b0f14d99c8c5d49f19a631cddc742b9afb3ad5035be164d903d77a3b727b
7
- data.tar.gz: e21b60479be3bd1ed92ff65907b250e6286b0d37c9dc44ff2d3300d0aefdb6fe47d4d20359366a1be9133cb08fe3d6d2b1ee363c3c5eb2f5a44499a82827406f
6
+ metadata.gz: 489544c4dfb222723cf76a439d22b8e12624b0862de85ae5c49d419d3d1dac9b4120de88157fc9c8f0cd310924e23f776558c0a5a3663d727a90b289f1d52023
7
+ data.tar.gz: 81bf1d1a74339ad6d8ad664d9e79f07c738ef19b18e0bfb3bd9ba99c9bfe96c446133426ad582a4bed16a3ab08779efa59f9c5a7cdd3926e5b1ef19f9437bb0c
@@ -1,4 +1,17 @@
1
1
  inherit_from: .rubocop_todo.yml
2
2
 
3
3
  AllCops:
4
- TargetRubyVersion: 2.6
4
+ TargetRubyVersion: 2.6
5
+
6
+ Layout/LineLength:
7
+ Enabled: True
8
+ Max: 120
9
+
10
+ Style/HashEachMethods:
11
+ Enabled: True
12
+
13
+ Style/HashTransformKeys:
14
+ Enabled: True
15
+
16
+ Style/HashTransformValues:
17
+ Enabled: True
@@ -0,0 +1 @@
1
+ 2.6.6
@@ -1,9 +1,10 @@
1
1
  ---
2
- sudo: false
3
2
  language: ruby
4
3
  cache: bundler
5
4
  rvm:
6
- - 2.5.1
5
+ - 2.6.6
7
6
  before_install:
8
7
  - gem update --system
9
8
  - gem install bundler:1.17.3
9
+ script:
10
+ - bundle exec rspec --order rand
data/Dockerfile CHANGED
@@ -1,8 +1,8 @@
1
- FROM ruby:2.5.1
1
+ FROM ruby:2.6.6
2
2
 
3
3
  WORKDIR /lib
4
4
 
5
5
  COPY . .
6
6
  RUN bundle install
7
7
 
8
- CMD ["bundle", "exec", "rspec"]
8
+ CMD ["bundle", "exec", "rspec", "--order rand"]
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ledger_sync (1.3.4)
4
+ ledger_sync (1.3.5)
5
5
  activemodel
6
6
  colorize
7
7
  coveralls
@@ -54,7 +54,7 @@ GEM
54
54
  diff-lcs (1.3)
55
55
  docile (1.3.2)
56
56
  dotenv (2.7.5)
57
- dry-configurable (0.11.3)
57
+ dry-configurable (0.11.5)
58
58
  concurrent-ruby (~> 1.0)
59
59
  dry-core (~> 0.4, >= 0.4.7)
60
60
  dry-equalizer (~> 0.2)
@@ -70,14 +70,14 @@ GEM
70
70
  concurrent-ruby (~> 1.0)
71
71
  dry-core (~> 0.2)
72
72
  dry-equalizer (~> 0.2)
73
- dry-schema (1.4.3)
73
+ dry-schema (1.5.0)
74
74
  concurrent-ruby (~> 1.0)
75
75
  dry-configurable (~> 0.8, >= 0.8.3)
76
76
  dry-core (~> 0.4)
77
77
  dry-equalizer (~> 0.2)
78
78
  dry-initializer (~> 3.0)
79
79
  dry-logic (~> 1.0)
80
- dry-types (~> 1.2)
80
+ dry-types (~> 1.4)
81
81
  dry-types (1.4.0)
82
82
  concurrent-ruby (~> 1.0)
83
83
  dry-container (~> 0.3)
@@ -85,21 +85,21 @@ GEM
85
85
  dry-equalizer (~> 0.3)
86
86
  dry-inflector (~> 0.1, >= 0.1.2)
87
87
  dry-logic (~> 1.0, >= 1.0.2)
88
- dry-validation (1.4.2)
88
+ dry-validation (1.5.0)
89
89
  concurrent-ruby (~> 1.0)
90
90
  dry-container (~> 0.7, >= 0.7.1)
91
91
  dry-core (~> 0.4)
92
92
  dry-equalizer (~> 0.2)
93
93
  dry-initializer (~> 3.0)
94
- dry-schema (~> 1.4, >= 1.4.3)
94
+ dry-schema (~> 1.5)
95
95
  factory_bot (5.1.1)
96
96
  activesupport (>= 4.2.0)
97
- faraday (0.17.3)
97
+ faraday (1.0.1)
98
98
  multipart-post (>= 1.2, < 3)
99
99
  faraday-detailed_logger (2.3.0)
100
100
  faraday (>= 0.8, < 2)
101
- faraday_middleware (0.14.0)
102
- faraday (>= 0.7.4, < 1.0)
101
+ faraday_middleware (1.0.0)
102
+ faraday (~> 1.0)
103
103
  fingerprintable (1.2.1)
104
104
  colorize
105
105
  gyoku (1.3.1)
@@ -132,7 +132,7 @@ GEM
132
132
  parallel (1.19.1)
133
133
  parser (2.7.0.3)
134
134
  ast (~> 2.4.0)
135
- pd_ruby (0.2.0)
135
+ pd_ruby (0.2.3)
136
136
  colorize
137
137
  public_suffix (4.0.3)
138
138
  rack (2.2.2)
@@ -179,7 +179,7 @@ GEM
179
179
  simply_serializable (1.4.2)
180
180
  fingerprintable (>= 1.2.1)
181
181
  socksify (1.7.1)
182
- stripe (5.17.0)
182
+ stripe (5.21.0)
183
183
  sync (0.5.0)
184
184
  term-ansicolor (1.7.1)
185
185
  tins (~> 1.0)
@@ -1,21 +1,97 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2019 Ryan Jackson
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- THE SOFTWARE.
1
+ Business Source License 1.1
2
+
3
+ Parameters
4
+
5
+ Licensor: Modern Treasury Corp.
6
+ Licensed Work: LedgerSync
7
+ The Licensed Work is (c) 2020 Modern Treasury Corp.
8
+ Additional Use Grant: You may make use of the Licensed Work, provided that you
9
+ may not use the Licensed Work for a Connector Service.
10
+
11
+ A “Connector Service” is a commercial offering that
12
+ allows third parties (other than your employees and
13
+ contractors) to access the functionality of the Licensed
14
+ Work by connecting to and exchanging information with
15
+ general ledgers, accounting software, or other adaptors
16
+ defined in the library that are controlled by such
17
+ third parties.
18
+
19
+ Notice
20
+
21
+ The Business Source License (this document, or the “License”) is not an Open
22
+ Source license. However, the Licensed Work will eventually be made available
23
+ under an Open Source License, as stated in this License.
24
+
25
+ License text copyright (c) 2017 MariaDB Corporation Ab, All Rights Reserved.
26
+ “Business Source License” is a trademark of MariaDB Corporation Ab.
27
+
28
+ -----------------------------------------------------------------------------
29
+
30
+ Business Source License 1.1
31
+
32
+ Terms
33
+
34
+ The Licensor hereby grants you the right to copy, modify, create derivative
35
+ works, redistribute, and make non-production use of the Licensed Work. The
36
+ Licensor may make an Additional Use Grant, above, permitting limited
37
+ production use.
38
+
39
+ Effective on the Change Date, or the fourth anniversary of the first publicly
40
+ available distribution of a specific version of the Licensed Work under this
41
+ License, whichever comes first, the Licensor hereby grants you rights under
42
+ the terms of the Change License, and the rights granted in the paragraph
43
+ above terminate.
44
+
45
+ If your use of the Licensed Work does not comply with the requirements
46
+ currently in effect as described in this License, you must purchase a
47
+ commercial license from the Licensor, its affiliated entities, or authorized
48
+ resellers, or you must refrain from using the Licensed Work.
49
+
50
+ All copies of the original and modified Licensed Work, and derivative works
51
+ of the Licensed Work, are subject to this License. This License applies
52
+ separately for each version of the Licensed Work and the Change Date may vary
53
+ for each version of the Licensed Work released by Licensor.
54
+
55
+ You must conspicuously display this License on each original or modified copy
56
+ of the Licensed Work. If you receive the Licensed Work in original or
57
+ modified form from a third party, the terms and conditions set forth in this
58
+ License apply to your use of that work.
59
+
60
+ Any use of the Licensed Work in violation of this License will automatically
61
+ terminate your rights under this License for the current and all other
62
+ versions of the Licensed Work.
63
+
64
+ This License does not grant you any right in any trademark or logo of
65
+ Licensor or its affiliates (provided that you may use a trademark or logo of
66
+ Licensor as expressly required by this License).
67
+
68
+ TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON
69
+ AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,
70
+ EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF
71
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND
72
+ TITLE.
73
+
74
+ MariaDB hereby grants you permission to use this License’s text to license
75
+ your works, and to refer to it using the trademark “Business Source License”,
76
+ as long as you comply with the Covenants of Licensor below.
77
+
78
+ Covenants of Licensor
79
+
80
+ In consideration of the right to use this License’s text and the “Business
81
+ Source License” name and trademark, Licensor covenants to MariaDB, and to all
82
+ other recipients of the licensed work to be provided by Licensor:
83
+
84
+ 1. To specify as the Change License the GPL Version 2.0 or any later version,
85
+ or a license that is compatible with GPL Version 2.0 or a later version,
86
+ where “compatible” means that software provided under the Change License can
87
+ be included in a program with software provided under GPL Version 2.0 or a
88
+ later version. Licensor may specify additional Change Licenses without
89
+ limitation.
90
+
91
+ 2. To either: (a) specify an additional grant of rights to use that does not
92
+ impose any additional restriction on the right granted in this License, as
93
+ the Additional Use Grant; or (b) insert the text “None”.
94
+
95
+ 3. To specify a Change Date.
96
+
97
+ 4. Not to modify this License in any other way.
data/README.md CHANGED
@@ -4,6 +4,10 @@
4
4
  [![Gem Version](https://badge.fury.io/rb/ledger_sync.svg)](https://badge.fury.io/rb/ledger_sync)
5
5
  [![Coverage Status](https://coveralls.io/repos/github/LedgerSync/ledger_sync/badge.svg?branch=master)](https://coveralls.io/github/LedgerSync/ledger_sync?branch=master)
6
6
 
7
+ ## Join the Conversation
8
+
9
+ [Click here](https://join.slack.com/t/ledger-sync/shared_invite/zt-cn4qfhb8-~6BrVy8v7~upxQk6Pfo7oQ) to join our public Slack group.
10
+
7
11
  ## Installation
8
12
 
9
13
  Add this line to your application's Gemfile:
@@ -118,25 +122,25 @@ custom_attributes_for_customers = [
118
122
  ]
119
123
 
120
124
  custom_customer_classes = custom_attributes_for_customers.map do |attributes|
121
- klass = Class.new(LedgerSync::Customer)
125
+ customer_class = Class.new(LedgerSync::Customer)
122
126
  attributes.each do |name, type|
123
- klass.attribute name, type: type
127
+ customer_class.attribute name, type: type
124
128
  end
125
- klass
129
+ customer_class
126
130
  end
127
131
 
128
- klass1, klass2 = custom_customer_classes
132
+ customer_class_1, customer_class_2 = custom_customer_classes
129
133
 
130
134
  # First Custom Customer Class
131
- klass1.resource_attributes.include?(:foo) # => true
132
- klass1.resource_attributes[:foo].type # => #<LedgerSync::Type::String:0x00007fe04e9529b0 @precision=nil, @scale=nil, @limit=nil>
133
- klass1.resource_attributes.include?(:bar) # => false
135
+ customer_class_1.resource_attributes.include?(:foo) # => true
136
+ customer_class_1.resource_attributes[:foo].type # => #<LedgerSync::Type::String:0x00007fe04e9529b0 @precision=nil, @scale=nil, @limit=nil>
137
+ customer_class_1.resource_attributes.include?(:bar) # => false
134
138
 
135
139
  # Second Custom Customer Class
136
- klass2.resource_attributes.include?(:foo) # => true
137
- klass2.resource_attributes[:foo].type # => #<LedgerSync::Type::Integer:0x00007fe04e2c7898 @precision=nil, @scale=nil, @limit=nil, @range=-2147483648...2147483648>
138
- klass2.resource_attributes.include?(:bar) # => true
139
- klass2.resource_attributes[:bar].type # => #<LedgerSync::Type::Boolean:0x00007fe04e2e4f10 @precision=nil, @scale=nil, @limit=nil>
140
+ customer_class_2.resource_attributes.include?(:foo) # => true
141
+ customer_class_2.resource_attributes[:foo].type # => #<LedgerSync::Type::Integer:0x00007fe04e2c7898 @precision=nil, @scale=nil, @limit=nil, @range=-2147483648...2147483648>
142
+ customer_class_2.resource_attributes.include?(:bar) # => true
143
+ customer_class_2.resource_attributes[:bar].type # => #<LedgerSync::Type::Boolean:0x00007fe04e2e4f10 @precision=nil, @scale=nil, @limit=nil>
140
144
  ```
141
145
 
142
146
  You can now use these custom resources in operations that require custom attributes.
@@ -297,6 +301,19 @@ LedgerSync supports the NetSuite SOAP adaptor, leveraging [the NetSuite gem](htt
297
301
 
298
302
  QuickBooks Online utilizes OAuth 2.0, which requires frequent refreshing of the access token. The adaptor will handle this automatically, attempting a single token refresh on any single request authentication failure. Depending on how you use the library, every adaptor has implements a class method `ledger_attributes_to_save`, which is an array of attributes that may change as the adaptor is used. You can also call the instance method `ledger_attributes_to_save` which will be a hash of these values. It is a good practice to always store these attributes if you are saving access tokens in your database.
299
303
 
304
+ #### Retrieve Access Token
305
+
306
+ The library contains a lightweight script that is helpful in retrieving and refreshing access tokens. To use, do the following:
307
+
308
+ 1. Create a `.env` file in the library root.
309
+ 2. Add values for `QUICKBOOKS_ONLINE_CLIENT_ID` and `QUICKBOOKS_ONLINE_CLIENT_SECRET` (you can copy `.env.template`).
310
+ 3. Ensure your developer application in [the QuickBooks Online developer portal](https://developer.intuit.com) contains this redirect URI: `http://localhost:5678` (note: no trailing slash and port configurable with `PORT` environment variable)
311
+ 4. Run `ruby bin/quickbooks_online_oauth_server.rb` from the library root (note: it must run from the root in order to update `.env`).
312
+ 5. Visit the URL output in the terminal.
313
+ 6. Upon redirect back to your `localhost`, the new values will be printed to the console and saved back to your `.env`
314
+
315
+ #### Adaptor Helper Methods
316
+
300
317
  The adaptor also implements some helper methods for getting tokens. For example, you can set up an adaptor using the following:
301
318
 
302
319
  ```ruby
@@ -0,0 +1,101 @@
1
+ # Setup
2
+ #
3
+ # gem install bundler
4
+ # Ensure you have http://localhost:5678 (or PORT) as a Redirect URI in QBO.
5
+
6
+ require 'bundler/inline'
7
+
8
+ gemfile do
9
+ source 'https://rubygems.org'
10
+ gem 'dotenv'
11
+ gem 'ledger_sync'
12
+ gem 'rack'
13
+ gem 'pd_ruby', '0.2.2', require: true
14
+ end
15
+
16
+ puts 'Gems installed and loaded!'
17
+
18
+ require 'socket'
19
+ require 'dotenv'
20
+ require 'rack'
21
+ require 'ledger_sync'
22
+ require 'rack/lobster'
23
+
24
+ Dotenv.load
25
+
26
+ port = ENV.fetch('PORT', 5678)
27
+ app = Rack::Lobster.new
28
+ server = TCPServer.new port
29
+
30
+ base_url = "http://localhost:#{port}"
31
+
32
+ puts "Listening at #{base_url}"
33
+
34
+ client_id = ENV.fetch('QUICKBOOKS_ONLINE_CLIENT_ID')
35
+
36
+ raise 'QUICKBOOKS_ONLINE_CLIENT_ID not set in ../.env' if client_id.blank?
37
+
38
+ adaptor = LedgerSync::Adaptors::QuickBooksOnline::Adaptor.new_from_env(test: true)
39
+
40
+ puts 'Go to the following URL:'
41
+ puts adaptor.authorization_url(redirect_uri: base_url)
42
+
43
+ while session = server.accept
44
+ request = session.gets
45
+
46
+ puts request
47
+
48
+ # 1
49
+ method, full_path = request.split(' ')
50
+
51
+ # 2
52
+ path, query = full_path.split('?')
53
+
54
+ params = Hash[query.split('&').map { |e| e.split('=') }] if query.present?
55
+
56
+ adaptor.set_credentials_from_oauth_code(
57
+ code: params.fetch('code'),
58
+ realm_id: params.fetch('realmId'),
59
+ redirect_uri: base_url
60
+ )
61
+
62
+ puts "\n"
63
+
64
+ puts 'access_token:'
65
+ puts adaptor.access_token
66
+ puts "\n"
67
+ puts 'client_id:'
68
+ puts adaptor.client_id
69
+ puts "\n"
70
+ puts 'client_secret:'
71
+ puts adaptor.client_secret
72
+ puts "\n"
73
+ puts 'realm_id:'
74
+ puts adaptor.realm_id
75
+ puts "\n"
76
+ puts 'refresh_token:'
77
+ puts adaptor.refresh_token
78
+ puts "\n"
79
+
80
+ puts 'Done!'
81
+
82
+ status = 200
83
+ body = 'Done'
84
+ headers = {
85
+ 'Content-Length' => body.size
86
+ }
87
+
88
+ session.print "HTTP/1.1 #{status}\r\n"
89
+
90
+ headers.each do |key, value|
91
+ session.print "#{key}: #{value}\r\n"
92
+ end
93
+
94
+ session.print "\r\n"
95
+
96
+ session.print body
97
+
98
+ session.close
99
+
100
+ break
101
+ end
@@ -44,11 +44,18 @@ require 'ledger_sync/adaptor_configuration_store'
44
44
  require 'ledger_sync/util/performer'
45
45
  require 'ledger_sync/util/validator'
46
46
  require 'ledger_sync/util/string_helpers'
47
+ require 'ledger_sync/util/mixins/delegate_iterable_methods_mixin'
48
+ require 'ledger_sync/util/mixins/dupable_mixin'
47
49
  require 'ledger_sync/result'
50
+ require 'ledger_sync/serializer'
51
+ require 'ledger_sync/deserializer'
52
+ require 'ledger_sync/serialization/deserializer_delegator'
53
+ require 'ledger_sync/serialization/serializer_delegator'
48
54
 
49
55
  # Adaptors
50
56
  Gem.find_files('ledger_sync/adaptors/mixins/**/*.rb').each { |path| require path }
51
57
  require 'ledger_sync/adaptors/adaptor'
58
+ require 'ledger_sync/adaptors/dashboard_url_helper'
52
59
  require 'ledger_sync/adaptors/searcher'
53
60
  require 'ledger_sync/adaptors/ledger_serializer'
54
61
  require 'ledger_sync/adaptors/operation'
@@ -146,5 +153,6 @@ LedgerSync.register_resource(resource: LedgerSync::Payment)
146
153
  LedgerSync.register_resource(resource: LedgerSync::PaymentLineItem)
147
154
  LedgerSync.register_resource(resource: LedgerSync::Transfer)
148
155
  LedgerSync.register_resource(resource: LedgerSync::Vendor)
156
+ LedgerSync.register_resource(resource: LedgerSync::Location)
149
157
 
150
158
  LedgerSync.register_resource(resource: LedgerSync::Adaptors::QuickBooksOnline::Preferences)