netsuite 0.9.0 → 0.9.1
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 +4 -4
- data/Gemfile +7 -0
- data/HISTORY.md +4 -0
- data/README.md +26 -0
- data/lib/netsuite/configuration.rb +24 -4
- data/lib/netsuite/utilities.rb +19 -4
- data/lib/netsuite/version.rb +1 -1
- data/netsuite.gemspec +3 -3
- data/spec/netsuite/configuration_spec.rb +29 -5
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3429c5cb6575fd1e62738eaf1270a0c585d82bc302975e435491af2a8a5dd7b5
|
4
|
+
data.tar.gz: 41a481e39865f46c5a0b8d61c3ab44e4c547ccfb8cc2de4c9621634ec331eb2e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df1a9202d4ccdfaff26031b7f1ae957403d374e90115f063ac107e0f59fc890a4b254bc559e06eb87a2768575827bde20917bf00ae4986e52ad48acf0043c45f
|
7
|
+
data.tar.gz: 07de35d4a530d8decc1344a0ed6cdf1d198260bd3ae84dae45b00e2324837172062fc071c0f3a05bf685423e8a0b4da910e865e7cc00f878098ec125c7dcc5c7
|
data/Gemfile
CHANGED
@@ -11,3 +11,10 @@ if ENV.fetch('BUNDLE_TZINFO', 'false') == 'true'
|
|
11
11
|
# optional dependency for more accurate timezone conversion
|
12
12
|
gem 'tzinfo', '>= 1.2.5'
|
13
13
|
end
|
14
|
+
|
15
|
+
if RUBY_VERSION >= '3.1.0'
|
16
|
+
# Savon v2.13 adds a dependency on mail, which has an implicit dependency on
|
17
|
+
# net-smtp. Ruby 3.1 removed net-smtp as a default gem. mail v2.8.0.rc1 is the
|
18
|
+
# first to make that dependency explicit to support Ruby 3.1.
|
19
|
+
gem 'mail', '>= 2.8.0.rc1'
|
20
|
+
end
|
data/HISTORY.md
CHANGED
@@ -2,7 +2,11 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
### Added
|
5
|
+
* Add `Configuration#multi_tenant!` for opting into multi-tentant support where configuration/caching is per-thread (#556)
|
6
|
+
|
5
7
|
### Fixed
|
8
|
+
* Avoid Savon version `2.13.0` to prevent generating invalid envelopes. (#558, #563)
|
9
|
+
|
6
10
|
### Breaking Changes
|
7
11
|
|
8
12
|
## 0.9.0
|
data/README.md
CHANGED
@@ -159,6 +159,32 @@ NetSuite.configure do
|
|
159
159
|
end
|
160
160
|
```
|
161
161
|
|
162
|
+
### Multi-Tenancy
|
163
|
+
|
164
|
+
If you're interacting with multiple NetSuite accounts, each in separate threads, you can enable multi-tenancy to prevent your configuration and caches from being shared between threads.
|
165
|
+
|
166
|
+
From your main thread, you'd want to enable multi-tenancy:
|
167
|
+
|
168
|
+
```ruby
|
169
|
+
NetSuite.configure do
|
170
|
+
multi_tentant!
|
171
|
+
end
|
172
|
+
```
|
173
|
+
|
174
|
+
Note that `multi_tenant!` is a special configuration option which is _not_ effected by `reset!`.
|
175
|
+
|
176
|
+
Then in each child thread, you'd perform any configuration specific to the NetSuite account you're interacting with for that thread, all of which will be specific to that thread only:
|
177
|
+
|
178
|
+
```ruby
|
179
|
+
NetSuite.configure do
|
180
|
+
reset!
|
181
|
+
|
182
|
+
account ENV['NETSUITE_ACCOUNT']
|
183
|
+
|
184
|
+
# The rest of your usual configuration...
|
185
|
+
end
|
186
|
+
```
|
187
|
+
|
162
188
|
# Usage
|
163
189
|
|
164
190
|
## CRUD Operations
|
@@ -11,7 +11,11 @@ module NetSuite
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def attributes
|
14
|
-
|
14
|
+
if multi_tenant?
|
15
|
+
Thread.current[:netsuite_gem_attributes] ||= {}
|
16
|
+
else
|
17
|
+
@attributes ||= {}
|
18
|
+
end
|
15
19
|
end
|
16
20
|
|
17
21
|
def connection(params={}, credentials={})
|
@@ -51,11 +55,19 @@ module NetSuite
|
|
51
55
|
end
|
52
56
|
|
53
57
|
def wsdl_cache
|
54
|
-
|
58
|
+
if multi_tenant?
|
59
|
+
Thread.current[:netsuite_gem_wsdl_cache] ||= {}
|
60
|
+
else
|
61
|
+
@wsdl_cache ||= {}
|
62
|
+
end
|
55
63
|
end
|
56
64
|
|
57
65
|
def clear_wsdl_cache
|
58
|
-
|
66
|
+
if multi_tenant?
|
67
|
+
Thread.current[:netsuite_gem_wsdl_cache] = {}
|
68
|
+
else
|
69
|
+
@wsdl_cache = {}
|
70
|
+
end
|
59
71
|
end
|
60
72
|
|
61
73
|
def cached_wsdl
|
@@ -83,7 +95,7 @@ module NetSuite
|
|
83
95
|
if version
|
84
96
|
self.api_version = version
|
85
97
|
else
|
86
|
-
attributes[:api_version] ||= '
|
98
|
+
attributes[:api_version] ||= '2016_2'
|
87
99
|
end
|
88
100
|
end
|
89
101
|
|
@@ -407,5 +419,13 @@ module NetSuite
|
|
407
419
|
attributes[:proxy]
|
408
420
|
end
|
409
421
|
end
|
422
|
+
|
423
|
+
def multi_tenant!
|
424
|
+
@multi_tenant = true
|
425
|
+
end
|
426
|
+
|
427
|
+
def multi_tenant?
|
428
|
+
@multi_tenant
|
429
|
+
end
|
410
430
|
end
|
411
431
|
end
|
data/lib/netsuite/utilities.rb
CHANGED
@@ -7,18 +7,31 @@ module NetSuite
|
|
7
7
|
# TODO need structured logger for various statements
|
8
8
|
|
9
9
|
def clear_cache!
|
10
|
-
|
11
|
-
|
10
|
+
if NetSuite::Configuration.multi_tenant?
|
11
|
+
Thread.current[:netsuite_gem_netsuite_get_record_cache] = {}
|
12
|
+
Thread.current[:netsuite_gem_netsuite_find_record_cache] = {}
|
13
|
+
else
|
14
|
+
@netsuite_get_record_cache = {}
|
15
|
+
@netsuite_find_record_cache = {}
|
16
|
+
end
|
12
17
|
|
13
18
|
DataCenter.clear_cache!
|
14
19
|
end
|
15
20
|
|
16
21
|
def netsuite_get_record_cache
|
17
|
-
|
22
|
+
if NetSuite::Configuration.multi_tenant?
|
23
|
+
Thread.current[:netsuite_gem_netsuite_get_record_cache] ||= {}
|
24
|
+
else
|
25
|
+
@netsuite_get_record_cache ||= {}
|
26
|
+
end
|
18
27
|
end
|
19
28
|
|
20
29
|
def netsuite_find_record_cache
|
21
|
-
|
30
|
+
if NetSuite::Configuration.multi_tenant?
|
31
|
+
Thread.current[:netsuite_gem_netsuite_find_record_cache] ||= {}
|
32
|
+
else
|
33
|
+
@netsuite_find_record_cache ||= {}
|
34
|
+
end
|
22
35
|
end
|
23
36
|
|
24
37
|
def append_memo(ns_record, added_memo, opts = {})
|
@@ -112,6 +125,8 @@ module NetSuite
|
|
112
125
|
exceptions_to_retry << OpenSSL::SSL::SSLErrorWaitReadable if defined?(OpenSSL::SSL::SSLErrorWaitReadable)
|
113
126
|
|
114
127
|
# depends on the http library chosen
|
128
|
+
exceptions_to_retry << HTTPI::SSLError if defined?(HTTPI::SSLError)
|
129
|
+
exceptions_to_retry << HTTPI::TimeoutError if defined?(HTTPI::TimeoutError)
|
115
130
|
exceptions_to_retry << HTTPClient::TimeoutError if defined?(HTTPClient::TimeoutError)
|
116
131
|
exceptions_to_retry << HTTPClient::ConnectTimeoutError if defined?(HTTPClient::ConnectTimeoutError)
|
117
132
|
exceptions_to_retry << HTTPClient::ReceiveTimeoutError if defined?(HTTPClient::ReceiveTimeoutError)
|
data/lib/netsuite/version.rb
CHANGED
data/netsuite.gemspec
CHANGED
@@ -3,8 +3,8 @@ require File.expand_path('../lib/netsuite/version', __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.licenses = ['MIT']
|
6
|
-
gem.authors = ['Ryan Moran', 'Michael Bianco']
|
7
|
-
gem.email = ['ryan.moran@gmail.com', 'mike@mikebian.co']
|
6
|
+
gem.authors = ['Ryan Moran', 'Michael Bianco', 'Chris Gunther']
|
7
|
+
gem.email = ['ryan.moran@gmail.com', 'mike@mikebian.co', 'chris@room118solutions.com']
|
8
8
|
gem.description = %q{NetSuite SuiteTalk API Wrapper}
|
9
9
|
gem.summary = %q{NetSuite SuiteTalk API (SOAP) Wrapper}
|
10
10
|
gem.homepage = 'https://github.com/NetSweet/netsuite'
|
@@ -20,7 +20,7 @@ Gem::Specification.new do |gem|
|
|
20
20
|
gem.metadata['mailing_list_uri'] = 'http://opensuite-slackin.herokuapp.com'
|
21
21
|
gem.metadata['rubygems_mfa_required'] = 'true'
|
22
22
|
|
23
|
-
gem.add_dependency 'savon', '>= 2.3.0'
|
23
|
+
gem.add_dependency 'savon', '>= 2.3.0', '!= 2.13.0'
|
24
24
|
|
25
25
|
gem.add_development_dependency 'rspec', '~> 3.11.0'
|
26
26
|
gem.add_development_dependency 'rake', '~> 12.3.3'
|
@@ -15,18 +15,42 @@ describe NetSuite::Configuration do
|
|
15
15
|
expect(config.attributes).to be_empty
|
16
16
|
end
|
17
17
|
|
18
|
-
it '
|
18
|
+
it 'treats attributes as shared/global in default single tenant mode' do
|
19
19
|
config.attributes[:blah] = 'something'
|
20
20
|
expect(config.attributes[:blah]).to eq('something')
|
21
21
|
|
22
22
|
thread = Thread.new {
|
23
|
+
expect(config.attributes[:blah]).to eq('something')
|
24
|
+
|
23
25
|
config.attributes[:blah] = 'something_else'
|
24
26
|
expect(config.attributes[:blah]).to eq('something_else')
|
25
27
|
}
|
26
28
|
|
27
29
|
thread.join
|
28
30
|
|
29
|
-
expect(config.attributes[:blah]).to eq('
|
31
|
+
expect(config.attributes[:blah]).to eq('something_else')
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'treats attributes as thread-local in multi-tenant mode, which each thread starting with empty attributes' do
|
35
|
+
begin
|
36
|
+
config.multi_tenant!
|
37
|
+
|
38
|
+
config.attributes[:blah] = 'something'
|
39
|
+
expect(config.attributes[:blah]).to eq('something')
|
40
|
+
|
41
|
+
thread = Thread.new {
|
42
|
+
expect(config.attributes[:blah]).to be_nil
|
43
|
+
|
44
|
+
config.attributes[:blah] = 'something_else'
|
45
|
+
expect(config.attributes[:blah]).to eq('something_else')
|
46
|
+
}
|
47
|
+
|
48
|
+
thread.join
|
49
|
+
|
50
|
+
expect(config.attributes[:blah]).to eq('something')
|
51
|
+
ensure
|
52
|
+
config.instance_variable_set(:@multi_tenant, false)
|
53
|
+
end
|
30
54
|
end
|
31
55
|
end
|
32
56
|
|
@@ -101,7 +125,7 @@ describe NetSuite::Configuration do
|
|
101
125
|
|
102
126
|
context 'when the wsdl has not been set' do
|
103
127
|
it 'returns a path to the WSDL to use for the API' do
|
104
|
-
expect(config.wsdl).to eq("https://webservices.netsuite.com/wsdl/
|
128
|
+
expect(config.wsdl).to eq("https://webservices.netsuite.com/wsdl/v2016_2_0/netsuite.wsdl")
|
105
129
|
end
|
106
130
|
end
|
107
131
|
|
@@ -351,8 +375,8 @@ describe NetSuite::Configuration do
|
|
351
375
|
|
352
376
|
describe '#api_version' do
|
353
377
|
context 'when no api_version is defined' do
|
354
|
-
it 'defaults to
|
355
|
-
expect(config.api_version).to eq('
|
378
|
+
it 'defaults to 2016_2' do
|
379
|
+
expect(config.api_version).to eq('2016_2')
|
356
380
|
end
|
357
381
|
end
|
358
382
|
end
|
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: netsuite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Moran
|
8
8
|
- Michael Bianco
|
9
|
+
- Chris Gunther
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2022-
|
13
|
+
date: 2022-10-20 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: savon
|
@@ -18,6 +19,9 @@ dependencies:
|
|
18
19
|
- - ">="
|
19
20
|
- !ruby/object:Gem::Version
|
20
21
|
version: 2.3.0
|
22
|
+
- - "!="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 2.13.0
|
21
25
|
type: :runtime
|
22
26
|
prerelease: false
|
23
27
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -25,6 +29,9 @@ dependencies:
|
|
25
29
|
- - ">="
|
26
30
|
- !ruby/object:Gem::Version
|
27
31
|
version: 2.3.0
|
32
|
+
- - "!="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 2.13.0
|
28
35
|
- !ruby/object:Gem::Dependency
|
29
36
|
name: rspec
|
30
37
|
requirement: !ruby/object:Gem::Requirement
|
@@ -57,6 +64,7 @@ description: NetSuite SuiteTalk API Wrapper
|
|
57
64
|
email:
|
58
65
|
- ryan.moran@gmail.com
|
59
66
|
- mike@mikebian.co
|
67
|
+
- chris@room118solutions.com
|
60
68
|
executables: []
|
61
69
|
extensions: []
|
62
70
|
extra_rdoc_files: []
|
@@ -631,7 +639,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
631
639
|
- !ruby/object:Gem::Version
|
632
640
|
version: '0'
|
633
641
|
requirements: []
|
634
|
-
rubygems_version: 3.
|
642
|
+
rubygems_version: 3.1.6
|
635
643
|
signing_key:
|
636
644
|
specification_version: 4
|
637
645
|
summary: NetSuite SuiteTalk API (SOAP) Wrapper
|