qbo_api 1.6.2 → 1.6.5
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/README.md +29 -5
- data/lib/qbo_api.rb +4 -35
- data/lib/qbo_api/all.rb +31 -0
- data/lib/qbo_api/finder.rb +47 -0
- data/lib/qbo_api/version.rb +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3025022857f508d3f6522d3ab13c2d0237e6ac67
|
4
|
+
data.tar.gz: b264a7c95043b9337b94075b315c7fc74be3f72b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d9831b0aab6fd731849cb16dad761d5f4e1ef81f5494342af591edea5fa965133034d3b61b18d10e63df80100f08a72e7c3294887973dcd8d5adad4b426fc78c
|
7
|
+
data.tar.gz: 7ff2bba02f51e0cdce47086208a13e7d2f5a65e64cf9ed60ff24613fef0477f0dce092e12493522b1cbb2a2683a4597407045cfd52699d31d8ec19249fadf450
|
data/README.md
CHANGED
@@ -156,17 +156,40 @@ QboApi.minor_version = 8
|
|
156
156
|
p response['Active'] # => false
|
157
157
|
```
|
158
158
|
|
159
|
-
### Search with irregular characters
|
160
|
-
```ruby
|
161
|
-
name = qbo_api.esc "Amy's Bird Sanctuary"
|
162
|
-
response = qbo_api.query(%{SELECT * FROM Customer WHERE DisplayName = '#{name}'})
|
163
|
-
```
|
164
159
|
### Get an entity by its id
|
165
160
|
```ruby
|
166
161
|
response = qbo_api.get(:customer, 5)
|
167
162
|
p response['DisplayName'] # => "Dukes Basketball Camp"
|
168
163
|
```
|
169
164
|
|
165
|
+
### Get an entity by one its Filter attributes
|
166
|
+
```ruby
|
167
|
+
response = qbo_api.get(:customer, ["DisplayName", "Dukes Basketball Camp"])
|
168
|
+
p response['Id'] # => 5
|
169
|
+
```
|
170
|
+
|
171
|
+
### Get an entity by one its Filter attributes using a LIKE search
|
172
|
+
```ruby
|
173
|
+
response = qbo_api.get(:customer, ["DisplayName", "LIKE", "Dukes%"])
|
174
|
+
p response['Id'] # => 5
|
175
|
+
```
|
176
|
+
|
177
|
+
### Get an entity by one its Filter attributes using a IN search
|
178
|
+
```ruby
|
179
|
+
response = qbo_api.get(:vendor, ["DisplayName", "IN", "(true, false)"])
|
180
|
+
p response.size # => 28
|
181
|
+
```
|
182
|
+
|
183
|
+
### Search with irregular characters
|
184
|
+
```ruby
|
185
|
+
# Use the .esc() method
|
186
|
+
name = qbo_api.esc "Amy's Bird Sanctuary"
|
187
|
+
response = qbo_api.query(%{SELECT * FROM Customer WHERE DisplayName = '#{name}'})
|
188
|
+
# OR USE .get() method, which will automatically escape
|
189
|
+
response = qbo_api.get(:customer, ["DisplayName", "Amy's Bird Sanctuary"])
|
190
|
+
p response['Id'] # => 1
|
191
|
+
```
|
192
|
+
|
170
193
|
### Uploading an attachment
|
171
194
|
```ruby
|
172
195
|
payload = {"AttachableRef":
|
@@ -277,6 +300,7 @@ See [docs](https://developer.intuit.com/docs/0100_quickbooks_online/0100_essenti
|
|
277
300
|
```
|
278
301
|
|
279
302
|
### Import/retrieve all
|
303
|
+
*Note: There is some overlap with the `all` and the `get` methods. The `get` method is limited to 1000 results where the `all` method will return all the results no matter the number.*
|
280
304
|
```ruby
|
281
305
|
# retrieves all active customers
|
282
306
|
qbo_api.all(:customers).each do |c|
|
data/lib/qbo_api.rb
CHANGED
@@ -15,6 +15,8 @@ require_relative 'qbo_api/util'
|
|
15
15
|
require_relative 'qbo_api/attachment'
|
16
16
|
require_relative 'qbo_api/setter'
|
17
17
|
require_relative 'qbo_api/builder'
|
18
|
+
require_relative 'qbo_api/finder'
|
19
|
+
require_relative 'qbo_api/all'
|
18
20
|
|
19
21
|
class QboApi
|
20
22
|
extend Configuration
|
@@ -24,6 +26,8 @@ class QboApi
|
|
24
26
|
include Attachment
|
25
27
|
include Setter
|
26
28
|
include Builder
|
29
|
+
include Finder
|
30
|
+
include All
|
27
31
|
|
28
32
|
attr_reader :realm_id
|
29
33
|
|
@@ -64,17 +68,6 @@ class QboApi
|
|
64
68
|
end
|
65
69
|
end
|
66
70
|
|
67
|
-
def query(query, params: nil)
|
68
|
-
path = "#{realm_id}/query?query=#{CGI.escape(query)}"
|
69
|
-
entity = extract_entity_from_query(query, to_sym: true)
|
70
|
-
request(:get, entity: entity, path: path, params: params)
|
71
|
-
end
|
72
|
-
|
73
|
-
def get(entity, id, params: nil)
|
74
|
-
path = "#{entity_path(entity)}/#{id}"
|
75
|
-
request(:get, entity: entity, path: path, params: params)
|
76
|
-
end
|
77
|
-
|
78
71
|
def create(entity, payload:, params: nil)
|
79
72
|
request(:post, entity: entity, path: entity_path(entity), payload: payload, params: params)
|
80
73
|
end
|
@@ -110,16 +103,6 @@ class QboApi
|
|
110
103
|
request(:get, path: path)
|
111
104
|
end
|
112
105
|
|
113
|
-
def all(entity, max: 1000, select: nil, inactive: false, &block)
|
114
|
-
enumerator = create_all_enumerator(entity, max: max, select: select, inactive: inactive)
|
115
|
-
|
116
|
-
if block_given?
|
117
|
-
enumerator.each(&block)
|
118
|
-
else
|
119
|
-
enumerator
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
106
|
def request(method, path:, entity: nil, payload: nil, params: nil)
|
124
107
|
raw_response = connection.send(method) do |req|
|
125
108
|
path = finalize_path(path, method: method, params: params)
|
@@ -148,20 +131,6 @@ class QboApi
|
|
148
131
|
|
149
132
|
private
|
150
133
|
|
151
|
-
def create_all_enumerator(entity, max: 1000, select: nil, inactive: false)
|
152
|
-
Enumerator.new do |enum_yielder|
|
153
|
-
select = build_all_query(entity, select: select, inactive: inactive)
|
154
|
-
pos = 0
|
155
|
-
begin
|
156
|
-
pos = pos == 0 ? pos + 1 : pos + max
|
157
|
-
results = query("#{select} MAXRESULTS #{max} STARTPOSITION #{pos}")
|
158
|
-
results.each do |entry|
|
159
|
-
enum_yielder.yield(entry)
|
160
|
-
end if results
|
161
|
-
end while (results ? results.size == max : false)
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
134
|
def entity_response(data, entity)
|
166
135
|
if qr = data['QueryResponse']
|
167
136
|
qr.empty? ? nil : qr.fetch(singular(entity))
|
data/lib/qbo_api/all.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
class QboApi
|
2
|
+
module All
|
3
|
+
|
4
|
+
def all(entity, max: 1000, select: nil, inactive: false, &block)
|
5
|
+
enumerator = create_all_enumerator(entity, max: max, select: select, inactive: inactive)
|
6
|
+
|
7
|
+
if block_given?
|
8
|
+
enumerator.each(&block)
|
9
|
+
else
|
10
|
+
enumerator
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def create_all_enumerator(entity, max: 1000, select: nil, inactive: false)
|
17
|
+
Enumerator.new do |enum_yielder|
|
18
|
+
select = build_all_query(entity, select: select, inactive: inactive)
|
19
|
+
pos = 0
|
20
|
+
begin
|
21
|
+
pos = pos == 0 ? pos + 1 : pos + max
|
22
|
+
results = query("#{select} MAXRESULTS #{max} STARTPOSITION #{pos}")
|
23
|
+
results.each do |entry|
|
24
|
+
enum_yielder.yield(entry)
|
25
|
+
end if results
|
26
|
+
end while (results ? results.size == max : false)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class QboApi
|
2
|
+
module Finder
|
3
|
+
|
4
|
+
def query(query, params: nil)
|
5
|
+
path = "#{realm_id}/query?query=#{CGI.escape(query)}"
|
6
|
+
entity = extract_entity_from_query(query, to_sym: true)
|
7
|
+
request(:get, entity: entity, path: path, params: params)
|
8
|
+
end
|
9
|
+
|
10
|
+
def get(entity, type, params: nil)
|
11
|
+
if type.is_a?(Array)
|
12
|
+
query_str = get_query_str(entity, type)
|
13
|
+
if resp = query(query_str, params: params)
|
14
|
+
resp.size == 1 ? resp[0] : resp
|
15
|
+
else
|
16
|
+
false
|
17
|
+
end
|
18
|
+
else
|
19
|
+
path = "#{entity_path(entity)}/#{type}"
|
20
|
+
request(:get, entity: entity, path: path, params: params)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_quote_or_not(str)
|
25
|
+
inside_parens_regex = '\(.*\)'
|
26
|
+
if str.match(/^(#{inside_parens_regex}|true|false|CURRENT_DATE)$/)
|
27
|
+
str
|
28
|
+
else
|
29
|
+
%{'#{esc(str)}'}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def get_query_str(entity, type)
|
36
|
+
if type.size == 2
|
37
|
+
operator = '='
|
38
|
+
value = type[1]
|
39
|
+
else
|
40
|
+
operator = type[1]
|
41
|
+
value = type[2]
|
42
|
+
end
|
43
|
+
"SELECT * FROM #{singular(entity)} WHERE #{type[0]} #{operator} #{to_quote_or_not(value)}"
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
data/lib/qbo_api/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qbo_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
4
|
+
version: 1.6.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christian Pelczarski
|
@@ -269,11 +269,13 @@ files:
|
|
269
269
|
- example/views/oauth2.erb
|
270
270
|
- example/views/oauth2_redirect.erb
|
271
271
|
- lib/qbo_api.rb
|
272
|
+
- lib/qbo_api/all.rb
|
272
273
|
- lib/qbo_api/attachment.rb
|
273
274
|
- lib/qbo_api/builder.rb
|
274
275
|
- lib/qbo_api/configuration.rb
|
275
276
|
- lib/qbo_api/entity.rb
|
276
277
|
- lib/qbo_api/error.rb
|
278
|
+
- lib/qbo_api/finder.rb
|
277
279
|
- lib/qbo_api/raise_http_exception.rb
|
278
280
|
- lib/qbo_api/setter.rb
|
279
281
|
- lib/qbo_api/supporting.rb
|