shotgun_api_ruby 0.1.0.1 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -1
- data/README.md +87 -4
- data/lib/shotgun_api_ruby/entities.rb +25 -1
- data/lib/shotgun_api_ruby/entities/params.rb +45 -0
- data/lib/shotgun_api_ruby/entities/summarize.rb +64 -0
- data/lib/shotgun_api_ruby/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4ba416f8dc0858ce91112f5f283d36878e31e777438b293c07ecfa63bfda0553
|
4
|
+
data.tar.gz: 2a8d1af31bd3936b5290250f6865bd832d76e4f92734bf0175d581be29bb71b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 42f2984ef2a0f98e0e54d9e6c470bed71647d3f8a49d9dff17a8111f8081478425320f44f21ac65b2e41f6c5e7c395c9fbcf382393ff2c9ff4017be48c50c068
|
7
|
+
data.tar.gz: d1bb4d22f4375688fe930b36c31a9a90c0bab8081103924671fe834cb7ee036ca9106cea64faf8ffbb52d1f2da63e3d9c1a39aa433d64ba9363db18c28d46eae
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
+
## [0.1.1] - 2021-06-15
|
10
|
+
### Added
|
11
|
+
- summarize and count support
|
12
|
+
|
9
13
|
## [0.1.0] - 2021-06-14
|
10
14
|
### Added
|
11
15
|
- Complete test coverage (Unit + Integration tests)
|
@@ -42,7 +46,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
42
46
|
- Entities: delete
|
43
47
|
- Entities: revive
|
44
48
|
|
45
|
-
[Unreleased]: https://github.com/shotgunsoftware/shotgun_api_ruby/compare/v0.1.
|
49
|
+
[Unreleased]: https://github.com/shotgunsoftware/shotgun_api_ruby/compare/v0.1.1...HEAD
|
50
|
+
[0.1.1]: https://github.com/shotgunsoftware/shotgun_api_ruby/releases/tag/v0.1.1
|
46
51
|
[0.1.0]: https://github.com/shotgunsoftware/shotgun_api_ruby/releases/tag/v0.1.0
|
47
52
|
[0.0.8.5]: https://github.com/shotgunsoftware/shotgun_api_ruby/releases/tag/v0.0.8.5
|
48
53
|
[0.0.8.4]: https://github.com/shotgunsoftware/shotgun_api_ruby/releases/tag/v0.0.8.4
|
data/README.md
CHANGED
@@ -306,7 +306,7 @@ Example:
|
|
306
306
|
client.assets.find(724, fields: [:code, 'description'], retired: false)
|
307
307
|
```
|
308
308
|
|
309
|
-
|
309
|
+
### Create
|
310
310
|
|
311
311
|
Will create the entity referenced by the id with the following fields.
|
312
312
|
If successful, it will return the newly created entity.
|
@@ -315,7 +315,7 @@ If successful, it will return the newly created entity.
|
|
315
315
|
client.assets.create(code: 'New Asset', project: {type: 'Project', id: 63})
|
316
316
|
```
|
317
317
|
|
318
|
-
|
318
|
+
### Update
|
319
319
|
|
320
320
|
Will update the entity referenced by the id with the following fields.
|
321
321
|
If successful, it will return the modified entity.
|
@@ -324,7 +324,7 @@ If successful, it will return the modified entity.
|
|
324
324
|
client.assets.update(1226, code: 'Updated Asset', sg_status_list: 'fin')
|
325
325
|
```
|
326
326
|
|
327
|
-
|
327
|
+
### Delete
|
328
328
|
|
329
329
|
Will destroys the entity referenced by the id. Will return true if successful.
|
330
330
|
|
@@ -332,7 +332,7 @@ Will destroys the entity referenced by the id. Will return true if successful.
|
|
332
332
|
client.assets.delete(1226)
|
333
333
|
```
|
334
334
|
|
335
|
-
|
335
|
+
### Revive
|
336
336
|
|
337
337
|
Will try to revive the entity referenced by the id. Will return true if successful.
|
338
338
|
|
@@ -340,6 +340,89 @@ Will try to revive the entity referenced by the id. Will return true if successf
|
|
340
340
|
client.assets.revive(1226)
|
341
341
|
```
|
342
342
|
|
343
|
+
### Summarize
|
344
|
+
|
345
|
+
Will summarize data for an entity type.
|
346
|
+
|
347
|
+
Example:
|
348
|
+
```ruby
|
349
|
+
# Simplest example
|
350
|
+
client.assets.summarize(summary_fields: {id: :count})
|
351
|
+
|
352
|
+
# Full complex example
|
353
|
+
client.assets.summarize(
|
354
|
+
filter: { project: { id: 155 }, sg_status_list: :act },
|
355
|
+
logical_operator: 'or',
|
356
|
+
include_archived_projects: true,
|
357
|
+
grouping: {
|
358
|
+
code: {direction: :desc, type: 'exact'}
|
359
|
+
},
|
360
|
+
summary_fields: { id: :count }
|
361
|
+
)
|
362
|
+
|
363
|
+
# Raw shotgun queries
|
364
|
+
client.assets.summarize(
|
365
|
+
grouping: [
|
366
|
+
{
|
367
|
+
"field": "sg_asset_type",
|
368
|
+
"type": "exact",
|
369
|
+
"direction": "asc"
|
370
|
+
}
|
371
|
+
],
|
372
|
+
summary_fields: [
|
373
|
+
{
|
374
|
+
"field": "id",
|
375
|
+
"type": "count"
|
376
|
+
}
|
377
|
+
],
|
378
|
+
)
|
379
|
+
```
|
380
|
+
|
381
|
+
It accepts the same `filter` and `logical_operator` as a `search` will.
|
382
|
+
|
383
|
+
#### Summary fields
|
384
|
+
|
385
|
+
Those can have two forms:
|
386
|
+
|
387
|
+
##### The normal API form
|
388
|
+
|
389
|
+
You need to supply the summary_fields as an array and it will be passed directly to the SG REST API
|
390
|
+
|
391
|
+
#### The convenient form
|
392
|
+
|
393
|
+
Using an array isn't very convenient most of the time. You can use a hash instead and it will be translated into a "SG summary_fields array".
|
394
|
+
|
395
|
+
Each key of the hash is the field name and the corresponding value is the type a summary you want (can be a string or a symbol)
|
396
|
+
|
397
|
+
#### Grouping
|
398
|
+
|
399
|
+
Those can have two forms:
|
400
|
+
|
401
|
+
##### The normal API form
|
402
|
+
|
403
|
+
You need to supply the grouping as an array and it will be passed directly to the SG REST API
|
404
|
+
|
405
|
+
#### The convenient form
|
406
|
+
|
407
|
+
Using an array isn't very convenient most of the time. You can use a hash instead and it will be translated into a "SG grouping array".
|
408
|
+
|
409
|
+
Each key of the hash is the field name and the corresponding value can either be :
|
410
|
+
* A String/Symbol and then will be used a a direction. The type will be 'exact'
|
411
|
+
* A Hash with optional 'type' and 'direction' keys. If a key is not specified it will be 'exact' and 'asc' respectively.
|
412
|
+
|
413
|
+
### Count
|
414
|
+
|
415
|
+
This is a helper for more a readable count summary. This can be passed `filter` and `logical_operator`.
|
416
|
+
|
417
|
+
Example:
|
418
|
+
|
419
|
+
```ruby
|
420
|
+
client.assets.count
|
421
|
+
|
422
|
+
# This will be equivalent as doing:
|
423
|
+
client.assets.summarize(summary_fields: [{type: :record_count, field: :id}])
|
424
|
+
```
|
425
|
+
|
343
426
|
### Schema
|
344
427
|
|
345
428
|
Those calls allow to inspect the schema for a shotgun site.
|
@@ -212,7 +212,7 @@ module ShotgunApiRuby
|
|
212
212
|
params.add_filter(filter, logical_operator)
|
213
213
|
|
214
214
|
# In search: The name is filters and not filter
|
215
|
-
params[:filters] = params[:filter]
|
215
|
+
params[:filters] = params[:filter] if params[:filter]
|
216
216
|
params.delete(:filter)
|
217
217
|
|
218
218
|
resp =
|
@@ -253,5 +253,29 @@ module ShotgunApiRuby
|
|
253
253
|
def fields
|
254
254
|
schema_client.fields
|
255
255
|
end
|
256
|
+
|
257
|
+
def summary_client
|
258
|
+
@summary_client ||= Summarize.new(connection, type, @base_url_prefix)
|
259
|
+
end
|
260
|
+
|
261
|
+
def count(filter: nil, logical_operator: 'and')
|
262
|
+
summary_client.count(filter: filter, logical_operator: logical_operator)
|
263
|
+
end
|
264
|
+
|
265
|
+
def summarize(
|
266
|
+
filter: nil,
|
267
|
+
grouping: nil,
|
268
|
+
summary_fields: nil,
|
269
|
+
logical_operator: 'and',
|
270
|
+
include_archived_projects: nil
|
271
|
+
)
|
272
|
+
summary_client.summarize(
|
273
|
+
filter: filter,
|
274
|
+
grouping: grouping,
|
275
|
+
summary_fields: summary_fields,
|
276
|
+
logical_operator: logical_operator,
|
277
|
+
include_archived_projects: include_archived_projects,
|
278
|
+
)
|
279
|
+
end
|
256
280
|
end
|
257
281
|
end
|
@@ -63,6 +63,51 @@ module ShotgunApiRuby
|
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
|
+
def add_grouping(grouping)
|
67
|
+
return unless grouping
|
68
|
+
|
69
|
+
if grouping.is_a? Array
|
70
|
+
self[:grouping] = grouping
|
71
|
+
return
|
72
|
+
end
|
73
|
+
|
74
|
+
self[:grouping] =
|
75
|
+
grouping
|
76
|
+
.each
|
77
|
+
.with_object([]) do |(key, options), result|
|
78
|
+
if options.is_a? Hash
|
79
|
+
result << {
|
80
|
+
field: key.to_s,
|
81
|
+
type:
|
82
|
+
options[:type]&.to_s || options['type']&.to_s || 'exact',
|
83
|
+
direction:
|
84
|
+
options[:direction]&.to_s || options['direction']&.to_s ||
|
85
|
+
'asc',
|
86
|
+
}
|
87
|
+
else
|
88
|
+
result << {
|
89
|
+
field: key.to_s,
|
90
|
+
type: 'exact',
|
91
|
+
direction: options.to_s,
|
92
|
+
}
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def add_summary_fields(summary_fields)
|
98
|
+
return unless summary_fields
|
99
|
+
|
100
|
+
if summary_fields.is_a? Array
|
101
|
+
self[:summary_fields] = summary_fields
|
102
|
+
return
|
103
|
+
end
|
104
|
+
|
105
|
+
if summary_fields.is_a? Hash
|
106
|
+
self[:summary_fields] =
|
107
|
+
summary_fields.map { |k, v| { field: k.to_s, type: v.to_s } }
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
66
111
|
def self.filters_are_simple?(filters)
|
67
112
|
return false if filters.is_a? Array
|
68
113
|
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module ShotgunApiRuby
|
2
|
+
class Entities
|
3
|
+
class Summarize
|
4
|
+
Summary = Struct.new(:summaries, :groups)
|
5
|
+
|
6
|
+
def initialize(connection, type, base_url_prefix)
|
7
|
+
@connection = connection.dup
|
8
|
+
@type = type
|
9
|
+
@connection.url_prefix = "#{base_url_prefix}/entity/#{type}/_summarize"
|
10
|
+
end
|
11
|
+
attr_reader :type, :connection
|
12
|
+
|
13
|
+
def count(filter: nil, logical_operator: 'and')
|
14
|
+
result =
|
15
|
+
summarize(
|
16
|
+
filter: filter,
|
17
|
+
logical_operator: logical_operator,
|
18
|
+
summary_fields: [{ type: :record_count, field: 'id' }],
|
19
|
+
)
|
20
|
+
result.summaries&.[]('id') || 0
|
21
|
+
end
|
22
|
+
|
23
|
+
def summarize(
|
24
|
+
filter: nil,
|
25
|
+
grouping: nil,
|
26
|
+
summary_fields: nil,
|
27
|
+
logical_operator: 'and',
|
28
|
+
include_archived_projects: nil
|
29
|
+
)
|
30
|
+
params = Params.new
|
31
|
+
|
32
|
+
params.add_filter(filter, logical_operator)
|
33
|
+
|
34
|
+
params[:filters] = params[:filter] if params[:filter]
|
35
|
+
params.delete(:filter)
|
36
|
+
|
37
|
+
params.add_grouping(grouping)
|
38
|
+
params.add_summary_fields(summary_fields)
|
39
|
+
params.add_options(nil, include_archived_projects)
|
40
|
+
|
41
|
+
resp =
|
42
|
+
@connection.post('', params) do |req|
|
43
|
+
req.headers['Content-Type'] =
|
44
|
+
if params[:filters].is_a? Array
|
45
|
+
'application/vnd+shotgun.api3_array+json'
|
46
|
+
else
|
47
|
+
'application/vnd+shotgun.api3_hash+json'
|
48
|
+
end
|
49
|
+
req.body = params.to_h.to_json
|
50
|
+
end
|
51
|
+
resp_body = JSON.parse(resp.body)
|
52
|
+
|
53
|
+
if resp.status >= 300
|
54
|
+
raise "Error while getting summarize for #{type}: #{resp_body['errors']}"
|
55
|
+
end
|
56
|
+
|
57
|
+
Summary.new(
|
58
|
+
resp_body['data']['summaries'],
|
59
|
+
resp_body['data']&.[]('groups'),
|
60
|
+
)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
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.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Denis <Zaratan> Pasin
|
@@ -353,6 +353,7 @@ files:
|
|
353
353
|
- lib/shotgun_api_ruby/entities.rb
|
354
354
|
- lib/shotgun_api_ruby/entities/params.rb
|
355
355
|
- lib/shotgun_api_ruby/entities/schema.rb
|
356
|
+
- lib/shotgun_api_ruby/entities/summarize.rb
|
356
357
|
- lib/shotgun_api_ruby/entity.rb
|
357
358
|
- lib/shotgun_api_ruby/preferences.rb
|
358
359
|
- lib/shotgun_api_ruby/server_info.rb
|