shotgun_api_ruby 0.0.2 → 0.0.3

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: 010e99c46e52c21872edf3bb9c2a431a5382dc3129f087b2d362dac09bc9e644
4
- data.tar.gz: fe83680e545108fb0e2687880801fc3b72316d6388d9af84e5015aa21abc9fdf
3
+ metadata.gz: 81e63f04a043edf0f4e28d98959cde8ca3b28d758b899f13f2a6f0888d7e2c79
4
+ data.tar.gz: bc6c97071892f5f236d95e1f47d59ccff5e53c2b4cb0c370951f9823d243c9d3
5
5
  SHA512:
6
- metadata.gz: 8c1f113a1fb94eed3b99bbfec633986f3e10208ae832b7756f825b2c3fce2163a255ab6747be704b8d2002dc980794028350c7d5176e34a30690be5d0f6596ef
7
- data.tar.gz: 4cd377272e301f26ed52179bf6240ecdf74437d43c2461681053e67ee1f34899793ceef16adf029f2d4baad8490e4ef8ace9fcac8f379a4359fd29232bc7c560
6
+ metadata.gz: 20fe88744936a2fce96771ca1abdb1310536d94547ecb276a6a28b052bb11794338dc49dde98e6a2846f9eba8a86cdbbd677b628ca2b9697d67679858827b1d9
7
+ data.tar.gz: 1fc22594f7144215eeed1b5895e3891ba5dab62ce9ccfa8b93181fa7268bf22f92420121bad44822d1fc9d67cc06361182bab0828cd0506f7f205c3933d4b98d
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- shotgun_api_ruby (0.0.2)
4
+ shotgun_api_ruby (0.0.3)
5
5
  activesupport
6
6
  faraday (~> 0.17)
7
7
  zeitwerk (~> 2.2)
data/README.md CHANGED
@@ -160,6 +160,18 @@ The all call will return all possible entities.
160
160
  client.assets.all
161
161
  ```
162
162
 
163
+ ##### search
164
+
165
+ Does the same thing as `all`
166
+
167
+ ##### first
168
+
169
+ Will return only the first entity found (same thing as setting the page_size to 1)
170
+
171
+ ```
172
+ client.assets.first
173
+ ```
174
+
163
175
  ##### fields
164
176
 
165
177
  This attribute describe the wanted fields in the returned entity
@@ -191,8 +203,6 @@ client.assets.all(fields: [:code, :description], sort: {code: :asc, description:
191
203
 
192
204
  ##### filter
193
205
 
194
- **Complex filters are not implemented yet**
195
-
196
206
  For simple filters, the filter field is waiting for a hash.
197
207
 
198
208
  Each value is:
@@ -206,6 +216,10 @@ Example:
206
216
  client.assets.all(fields: [:code, :description], filter: {code: ['Buck', :Darcy], description: 'I LOVE SG'})
207
217
  ```
208
218
 
219
+ For complex filters, see the documentation [here](https://developer.shotgunsoftware.com/rest-api/#searching)
220
+
221
+ The complexity of calling a different route and passing different headers/body/params will be taken care of automatically.
222
+
209
223
  ##### page
210
224
 
211
225
  You can ask for any page size or page number.
@@ -10,6 +10,23 @@ module ShotgunApiRuby
10
10
 
11
11
  attr_reader :connection, :type
12
12
 
13
+ def first(
14
+ fields: nil,
15
+ sort: nil,
16
+ filter: nil,
17
+ retired: nil,
18
+ include_archived_projects: nil
19
+ )
20
+ all(
21
+ fields: fields,
22
+ sort: sort,
23
+ filter: filter,
24
+ retired: retired,
25
+ include_archived_projects: include_archived_projects,
26
+ page_size: 1
27
+ )
28
+ end
29
+
13
30
  def all(
14
31
  fields: nil,
15
32
  sort: nil,
@@ -19,7 +36,17 @@ module ShotgunApiRuby
19
36
  retired: nil,
20
37
  include_archived_projects: nil
21
38
  )
22
- raise "Complex filters aren't supported yet" if filter && !filters_are_simple?(filter)
39
+ if filter && !filters_are_simple?(filter)
40
+ return search(
41
+ fields: fields,
42
+ sort: sort,
43
+ filter: filter,
44
+ page: page,
45
+ page_size: page_size,
46
+ retired: retired,
47
+ include_archived_projects: include_archived_projects
48
+ )
49
+ end
23
50
 
24
51
  params = Params.new
25
52
 
@@ -47,60 +74,67 @@ module ShotgunApiRuby
47
74
  end
48
75
  end
49
76
 
50
- private
51
-
52
- def filters_are_simple?(filters)
53
- filters.values.all? do |filter_val|
54
- (filter_val.is_a?(String) || filter_val.is_a?(Symbol)) ||
55
- (filter_val.is_a?(Array) && filter_val.all?{ |val| val.is_a?(String) || val.is_a?(Symbol) })
77
+ def search(
78
+ fields: nil,
79
+ sort: nil,
80
+ filter: nil,
81
+ page: nil,
82
+ page_size: nil,
83
+ retired: nil,
84
+ include_archived_projects: nil
85
+ )
86
+ if filter.nil? || filters_are_simple?(filter)
87
+ return all(
88
+ fields: fields,
89
+ sort: sort,
90
+ filter: filter,
91
+ page: page,
92
+ page_size: page_size,
93
+ retired: retired,
94
+ include_archived_projects: include_archived_projects
95
+ )
56
96
  end
57
- end
97
+ params = Params.new
58
98
 
59
- class Params < Hash
60
- def add_sort(sort)
61
- return unless sort
99
+ params.add_fields(fields)
100
+ params.add_sort(sort)
101
+ params.add_page(page, page_size)
102
+ params.add_options(retired, include_archived_projects)
62
103
 
63
- self[:sort] =
64
- if sort.is_a?(Hash)
65
- sort.map{ |field, direction| "#{direction.to_s.start_with?('desc') ? '-' : ''}#{field}" }.join(',')
104
+ resp =
105
+ @connection.post('_search', params) do |req|
106
+ if filter.is_a? Array
107
+ req.headers["Content-Type"] = 'application/vnd+shotgun.api3_array+json'
66
108
  else
67
- [sort].flatten.join(',')
109
+ req.headers['Content-Type'] = 'application/vnd+shotgun.api3_hash+json'
68
110
  end
69
- end
70
-
71
- def add_page(page, page_size)
72
- return unless page || page_size
73
-
74
- page = page.to_i if page
75
- page_size = page_size.to_i if page_size
111
+ req.body = params.to_h.merge(filters: filter).to_json
112
+ end
113
+ resp_body = JSON.parse(resp.body)
76
114
 
77
- page = 1 if page && page < 1
78
- self[:page] = { size: page_size || 20, number: page || 1 }
115
+ if resp.status >= 300
116
+ raise "Error while getting #{type}: #{resp_body['errors']}"
79
117
  end
80
118
 
81
- def add_fields(fields)
82
- self[:fields] = [fields].flatten.join(',') if fields
119
+ resp_body["data"].map do |entity|
120
+ Entity.new(
121
+ entity['type'],
122
+ OpenStruct.new(entity['attributes']),
123
+ entity['relationships'],
124
+ entity['id'],
125
+ entity['links']
126
+ )
83
127
  end
128
+ end
84
129
 
85
- def add_options(return_only, include_archived_projects)
86
- return if return_only.nil? && include_archived_projects.nil?
87
-
88
- self[:options] = {
89
- return_only: return_only ? 'retired' : 'active',
90
- include_archived_projects: !!include_archived_projects,
91
- }
92
- end
130
+ private
93
131
 
94
- def add_filter(filters)
95
- return unless filters
132
+ def filters_are_simple?(filters)
133
+ return false if filters.is_a? Array
96
134
 
97
- # filter
98
- self['filter'] = filters.map do |field, value|
99
- [
100
- field.to_s,
101
- value.is_a?(Array) ? value.map(&:to_s).join(',') : value.to_s,
102
- ]
103
- end.to_h
135
+ filters.values.all? do |filter_val|
136
+ (filter_val.is_a?(String) || filter_val.is_a?(Symbol)) ||
137
+ (filter_val.is_a?(Array) && filter_val.all?{ |val| val.is_a?(String) || val.is_a?(Symbol) })
104
138
  end
105
139
  end
106
140
  end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShotgunApiRuby
4
+ class Entities
5
+ class Params < Hash
6
+ def add_sort(sort)
7
+ return unless sort
8
+
9
+ self[:sort] =
10
+ if sort.is_a?(Hash)
11
+ sort.map{ |field, direction| "#{direction.to_s.start_with?('desc') ? '-' : ''}#{field}" }.join(',')
12
+ else
13
+ [sort].flatten.join(',')
14
+ end
15
+ end
16
+
17
+ def add_page(page, page_size)
18
+ return unless page || page_size
19
+
20
+ page = page.to_i if page
21
+ page_size = page_size.to_i if page_size
22
+
23
+ page = 1 if page && page < 1
24
+ self[:page] = { size: page_size || 20, number: page || 1 }
25
+ end
26
+
27
+ def add_fields(fields)
28
+ self[:fields] = [fields].flatten.join(',') if fields
29
+ end
30
+
31
+ def add_options(return_only, include_archived_projects)
32
+ return if return_only.nil? && include_archived_projects.nil?
33
+
34
+ self[:options] = {
35
+ return_only: return_only ? 'retired' : 'active',
36
+ include_archived_projects: !!include_archived_projects,
37
+ }
38
+ end
39
+
40
+ def add_filter(filters)
41
+ return unless filters
42
+
43
+ # filter
44
+ self['filter'] = filters.map do |field, value|
45
+ [
46
+ field.to_s,
47
+ value.is_a?(Array) ? value.map(&:to_s).join(',') : value.to_s,
48
+ ]
49
+ end.to_h
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ShotgunApiRuby
4
- VERSION = "0.0.2"
4
+ VERSION = "0.0.3"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shotgun_api_ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis <Zaratan> Pasin
@@ -190,6 +190,7 @@ files:
190
190
  - lib/shotgun_api_ruby/auth.rb
191
191
  - lib/shotgun_api_ruby/client.rb
192
192
  - lib/shotgun_api_ruby/entities.rb
193
+ - lib/shotgun_api_ruby/entities/params.rb
193
194
  - lib/shotgun_api_ruby/entity.rb
194
195
  - lib/shotgun_api_ruby/preferences.rb
195
196
  - lib/shotgun_api_ruby/server_info.rb