shotgrid_api_ruby 0.1.3.3 → 0.2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/test_and_publish.yml +2 -0
- data/.github/workflows/test_only.yml +2 -0
- data/.gitignore +3 -0
- data/.overcommit.yml +9 -0
- data/.rubocop.yml +2 -0
- data/CHANGELOG.md +11 -1
- data/Gemfile +18 -0
- data/Guardfile +2 -2
- data/bin/generate_and_add_documentation +1 -0
- data/bin/generate_sorbet_coverage +3 -0
- data/bin/prettirun +1 -1
- data/bin/sorbet_check +1 -0
- data/bin/tapioca +29 -0
- data/docs/ShotgridApiRuby/Auth/Validator.html +319 -0
- data/docs/ShotgridApiRuby/Auth.html +1079 -0
- data/docs/ShotgridApiRuby/Client.html +933 -0
- data/docs/ShotgridApiRuby/Entities/Params/TooComplexFiltersError.html +124 -0
- data/docs/ShotgridApiRuby/Entities/Params.html +1377 -0
- data/docs/ShotgridApiRuby/Entities/Schema.html +646 -0
- data/docs/ShotgridApiRuby/Entities/Summarize/Summary.html +401 -0
- data/docs/ShotgridApiRuby/Entities/Summarize.html +775 -0
- data/docs/ShotgridApiRuby/Entities.html +2461 -0
- data/docs/ShotgridApiRuby/Entity.html +935 -0
- data/docs/ShotgridApiRuby/Preferences.html +417 -0
- data/docs/ShotgridApiRuby/ServerInfo.html +415 -0
- data/docs/ShotgridApiRuby/ShotgridCallError.html +328 -0
- data/docs/ShotgridApiRuby/Types.html +136 -0
- data/docs/ShotgridApiRuby.html +307 -0
- data/docs/_index.html +253 -0
- data/docs/class_list.html +51 -0
- data/docs/css/common.css +1 -0
- data/docs/css/full_list.css +58 -0
- data/docs/css/style.css +497 -0
- data/docs/file.README.html +578 -0
- data/docs/file_list.html +56 -0
- data/docs/frames.html +17 -0
- data/docs/index.html +578 -0
- data/docs/js/app.js +314 -0
- data/docs/js/full_list.js +216 -0
- data/docs/js/jquery.js +4 -0
- data/docs/method_list.html +643 -0
- data/docs/top-level-namespace.html +110 -0
- data/lib/shotgrid_api_ruby/auth.rb +89 -33
- data/lib/shotgrid_api_ruby/client.rb +50 -7
- data/lib/shotgrid_api_ruby/entities/params.rb +304 -65
- data/lib/shotgrid_api_ruby/entities/schema.rb +18 -3
- data/lib/shotgrid_api_ruby/entities/summarize.rb +39 -7
- data/lib/shotgrid_api_ruby/entities.rb +118 -29
- data/lib/shotgrid_api_ruby/entity.rb +29 -12
- data/lib/shotgrid_api_ruby/preferences.rb +7 -1
- data/lib/shotgrid_api_ruby/server_info.rb +7 -1
- data/lib/shotgrid_api_ruby/shotgrid_call_error.rb +5 -1
- data/lib/shotgrid_api_ruby/types/auth_type.rb +23 -0
- data/lib/shotgrid_api_ruby/version.rb +2 -1
- data/lib/shotgrid_api_ruby.rb +20 -2
- data/shotgrid_api_ruby.gemspec +2 -10
- data/sorbet/config +6 -0
- data/sorbet/rbi/faraday.rbi +20 -0
- data/sorbet/rbi/gems/activesupport@6.1.4.1.rbi +3770 -0
- data/sorbet/rbi/gems/ast@2.4.2.rbi +54 -0
- data/sorbet/rbi/gems/backport@1.2.0.rbi +8 -0
- data/sorbet/rbi/gems/benchmark@0.1.1.rbi +65 -0
- data/sorbet/rbi/gems/bundler-audit@0.8.0.rbi +8 -0
- data/sorbet/rbi/gems/byebug@11.1.3.rbi +1569 -0
- data/sorbet/rbi/gems/childprocess@4.1.0.rbi +8 -0
- data/sorbet/rbi/gems/coderay@1.1.3.rbi +1005 -0
- data/sorbet/rbi/gems/colorize@0.8.1.rbi +39 -0
- data/sorbet/rbi/gems/commander@4.6.0.rbi +8 -0
- data/sorbet/rbi/gems/concurrent-ruby@1.1.9.rbi +2403 -0
- data/sorbet/rbi/gems/diff-lcs@1.4.4.rbi +8 -0
- data/sorbet/rbi/gems/docile@1.4.0.rbi +54 -0
- data/sorbet/rbi/gems/dotenv@2.7.6.rbi +88 -0
- data/sorbet/rbi/gems/e2mmap@0.1.0.rbi +8 -0
- data/sorbet/rbi/gems/faker@2.19.0.rbi +2513 -0
- data/sorbet/rbi/gems/faraday-em_http@1.0.0.rbi +101 -0
- data/sorbet/rbi/gems/faraday-em_synchrony@1.0.0.rbi +78 -0
- data/sorbet/rbi/gems/faraday-excon@1.1.0.rbi +77 -0
- data/sorbet/rbi/gems/faraday-httpclient@1.0.1.rbi +73 -0
- data/sorbet/rbi/gems/faraday-net_http@1.0.1.rbi +82 -0
- data/sorbet/rbi/gems/faraday-net_http_persistent@1.2.0.rbi +72 -0
- data/sorbet/rbi/gems/faraday-patron@1.0.0.rbi +74 -0
- data/sorbet/rbi/gems/faraday-rack@1.0.0.rbi +73 -0
- data/sorbet/rbi/gems/faraday@1.7.0.rbi +783 -0
- data/sorbet/rbi/gems/ffi@1.15.3.rbi +8 -0
- data/sorbet/rbi/gems/formatador@0.3.0.rbi +8 -0
- data/sorbet/rbi/gems/guard-compat@1.2.1.rbi +8 -0
- data/sorbet/rbi/gems/guard-rspec@4.7.3.rbi +8 -0
- data/sorbet/rbi/gems/guard@2.18.0.rbi +8 -0
- data/sorbet/rbi/gems/haml@5.2.2.rbi +8 -0
- data/sorbet/rbi/gems/highline@2.0.3.rbi +8 -0
- data/sorbet/rbi/gems/i18n@1.8.10.rbi +584 -0
- data/sorbet/rbi/gems/iniparse@1.5.0.rbi +8 -0
- data/sorbet/rbi/gems/jaro_winkler@1.5.4.rbi +8 -0
- data/sorbet/rbi/gems/kramdown-parser-gfm@1.1.0.rbi +8 -0
- data/sorbet/rbi/gems/kramdown@2.3.1.rbi +8 -0
- data/sorbet/rbi/gems/listen@3.7.0.rbi +476 -0
- data/sorbet/rbi/gems/lumberjack@1.2.8.rbi +8 -0
- data/sorbet/rbi/gems/method_source@1.0.0.rbi +72 -0
- data/sorbet/rbi/gems/minitest@5.14.4.rbi +344 -0
- data/sorbet/rbi/gems/multipart-post@2.1.1.rbi +69 -0
- data/sorbet/rbi/gems/nenv@0.3.0.rbi +8 -0
- data/sorbet/rbi/gems/nokogiri@1.12.3.rbi +8 -0
- data/sorbet/rbi/gems/notiffany@0.1.3.rbi +8 -0
- data/sorbet/rbi/gems/overcommit@0.58.0.rbi +8 -0
- data/sorbet/rbi/gems/parallel@1.20.1.rbi +8 -0
- data/sorbet/rbi/gems/parlour@6.0.1.rbi +1610 -0
- data/sorbet/rbi/gems/parser@3.0.2.0.rbi +1731 -0
- data/sorbet/rbi/gems/prettier@1.6.1.rbi +8 -0
- data/sorbet/rbi/gems/pry-byebug@3.9.0.rbi +461 -0
- data/sorbet/rbi/gems/pry@0.13.1.rbi +2553 -0
- data/sorbet/rbi/gems/racc@1.5.2.rbi +47 -0
- data/sorbet/rbi/gems/rainbow@3.0.0.rbi +153 -0
- data/sorbet/rbi/gems/rake@13.0.6.rbi +807 -0
- data/sorbet/rbi/gems/rb-fsevent@0.11.0.rbi +8 -0
- data/sorbet/rbi/gems/rb-inotify@0.10.1.rbi +8 -0
- data/sorbet/rbi/gems/regexp_parser@2.1.1.rbi +8 -0
- data/sorbet/rbi/gems/reverse_markdown@2.0.0.rbi +8 -0
- data/sorbet/rbi/gems/rexml@3.2.5.rbi +672 -0
- data/sorbet/rbi/gems/rspec-core@3.10.1.rbi +2500 -0
- data/sorbet/rbi/gems/rspec-expectations@3.10.1.rbi +1574 -0
- data/sorbet/rbi/gems/rspec-mocks@3.10.2.rbi +1462 -0
- data/sorbet/rbi/gems/rspec-support@3.10.2.rbi +510 -0
- data/sorbet/rbi/gems/rspec@3.10.0.rbi +39 -0
- data/sorbet/rbi/gems/rspec_in_context@1.1.0.3.rbi +196 -0
- data/sorbet/rbi/gems/rubocop-ast@1.11.0.rbi +8 -0
- data/sorbet/rbi/gems/rubocop-faker@1.1.0.rbi +8 -0
- data/sorbet/rbi/gems/rubocop-performance@1.11.5.rbi +8 -0
- data/sorbet/rbi/gems/rubocop-sorbet@0.6.2.rbi +8 -0
- data/sorbet/rbi/gems/rubocop@1.20.0.rbi +8 -0
- data/sorbet/rbi/gems/ruby-progressbar@1.11.0.rbi +8 -0
- data/sorbet/rbi/gems/ruby2_keywords@0.0.5.rbi +8 -0
- data/sorbet/rbi/gems/shellany@0.0.1.rbi +8 -0
- data/sorbet/rbi/gems/simplecov-html@0.12.3.rbi +89 -0
- data/sorbet/rbi/gems/simplecov@0.21.2.rbi +577 -0
- data/sorbet/rbi/gems/simplecov_json_formatter@0.1.3.rbi +8 -0
- data/sorbet/rbi/gems/solargraph@0.43.0.rbi +8 -0
- data/sorbet/rbi/gems/spoom@1.1.2.rbi +1204 -0
- data/sorbet/rbi/gems/tapioca@0.4.25.rbi +1239 -0
- data/sorbet/rbi/gems/temple@0.8.2.rbi +8 -0
- data/sorbet/rbi/gems/thor@1.1.0.rbi +838 -0
- data/sorbet/rbi/gems/tilt@2.0.10.rbi +8 -0
- data/sorbet/rbi/gems/timecop@0.9.4.rbi +82 -0
- data/sorbet/rbi/gems/tzinfo@2.0.4.rbi +857 -0
- data/sorbet/rbi/gems/unicode-display_width@2.0.0.rbi +8 -0
- data/sorbet/rbi/gems/unparser@0.6.0.rbi +8 -0
- data/sorbet/rbi/gems/vcr@6.0.0.rbi +782 -0
- data/sorbet/rbi/gems/yard-sorbet@0.5.3.rbi +8 -0
- data/sorbet/rbi/gems/yard@0.9.26.rbi +8 -0
- data/sorbet/rbi/gems/zeitwerk@2.4.2.rbi +173 -0
- data/sorbet/tapioca/config +0 -0
- data/sorbet/tapioca/require.rb +5 -0
- metadata +144 -127
@@ -1,15 +1,38 @@
|
|
1
|
+
# typed: strict
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module ShotgridApiRuby
|
4
5
|
class Entities
|
5
|
-
class Params
|
6
|
+
class Params
|
7
|
+
extend T::Sig
|
8
|
+
extend Forwardable
|
9
|
+
|
6
10
|
class TooComplexFiltersError < StandardError
|
7
11
|
end
|
8
12
|
|
13
|
+
sig { void }
|
14
|
+
def initialize
|
15
|
+
@parsed_params = T.let({}, T::Hash[T.any(String, Symbol), T.untyped])
|
16
|
+
end
|
17
|
+
|
18
|
+
def_delegators :@parsed_params, :[], :[]=, :delete, :to_h, :each
|
19
|
+
|
20
|
+
SORT_TYPE =
|
21
|
+
T.type_alias do
|
22
|
+
T.nilable(
|
23
|
+
T.any(
|
24
|
+
T::Hash[T.any(String, Symbol), T.any(String, Symbol)],
|
25
|
+
T::Array[T.any(String, Symbol)],
|
26
|
+
String,
|
27
|
+
Symbol,
|
28
|
+
),
|
29
|
+
)
|
30
|
+
end
|
31
|
+
sig { params(sort: SORT_TYPE).returns(T.nilable(String)) }
|
9
32
|
def add_sort(sort)
|
10
33
|
return unless sort
|
11
34
|
|
12
|
-
|
35
|
+
@parsed_params[:sort] =
|
13
36
|
if sort.is_a?(Hash)
|
14
37
|
sort
|
15
38
|
.map do |field, direction|
|
@@ -21,6 +44,13 @@ module ShotgridApiRuby
|
|
21
44
|
end
|
22
45
|
end
|
23
46
|
|
47
|
+
PAGE_TYPE = T.type_alias { T.nilable(T.any(String, Integer)) }
|
48
|
+
PAGE_SIZE_TYPE = T.type_alias { T.nilable(T.any(String, Integer)) }
|
49
|
+
|
50
|
+
sig do
|
51
|
+
params(page: PAGE_TYPE, page_size: PAGE_SIZE_TYPE)
|
52
|
+
.returns(T.nilable(T::Hash[T.untyped, T.untyped]))
|
53
|
+
end
|
24
54
|
def add_page(page, page_size)
|
25
55
|
return unless page || page_size
|
26
56
|
|
@@ -28,95 +58,252 @@ module ShotgridApiRuby
|
|
28
58
|
page_size = page_size.to_i if page_size
|
29
59
|
|
30
60
|
page = 1 if page && page < 1
|
31
|
-
|
61
|
+
@parsed_params[:page] = { size: page_size || 20, number: page || 1 }
|
32
62
|
end
|
33
63
|
|
64
|
+
FIELDS_TYPE =
|
65
|
+
T.type_alias do
|
66
|
+
T.nilable(T.any(String, Symbol, T::Array[T.any(String, Symbol)]))
|
67
|
+
end
|
68
|
+
sig { params(fields: FIELDS_TYPE).returns(String) }
|
34
69
|
def add_fields(fields)
|
35
|
-
|
70
|
+
@parsed_params[:fields] =
|
36
71
|
fields && !fields.empty? ? [fields].flatten.join(',') : '*'
|
37
72
|
end
|
38
73
|
|
74
|
+
sig do
|
75
|
+
params(
|
76
|
+
return_only: T.nilable(T::Boolean),
|
77
|
+
include_archived_projects: T.nilable(T::Boolean),
|
78
|
+
)
|
79
|
+
.returns(
|
80
|
+
T.nilable(
|
81
|
+
{ return_only: String, include_archived_projects: T::Boolean },
|
82
|
+
),
|
83
|
+
)
|
84
|
+
end
|
39
85
|
def add_options(return_only, include_archived_projects)
|
40
86
|
return if return_only.nil? && include_archived_projects.nil?
|
41
87
|
|
42
|
-
|
88
|
+
@parsed_params[:options] = {
|
43
89
|
return_only: return_only ? 'retired' : 'active',
|
44
90
|
include_archived_projects: !!include_archived_projects,
|
45
91
|
}
|
46
92
|
end
|
47
93
|
|
94
|
+
LOGICAL_OPERATOR_TYPE = T.type_alias { T.any(String, Symbol) }
|
95
|
+
FILTERS_FIELD_TYPE =
|
96
|
+
T.type_alias do
|
97
|
+
T.nilable(
|
98
|
+
T.any(
|
99
|
+
T::Array[T.untyped],
|
100
|
+
T::Hash[
|
101
|
+
T.any(String, Symbol),
|
102
|
+
T.any(
|
103
|
+
String,
|
104
|
+
Symbol,
|
105
|
+
Integer,
|
106
|
+
Float,
|
107
|
+
T::Array[T.any(String, Symbol, Integer, Float)],
|
108
|
+
T::Hash[
|
109
|
+
T.any(String, Symbol),
|
110
|
+
T.any(
|
111
|
+
String,
|
112
|
+
Symbol,
|
113
|
+
Integer,
|
114
|
+
Float,
|
115
|
+
T::Array[T.any(String, Symbol, Integer, Float)],
|
116
|
+
T.untyped,
|
117
|
+
)
|
118
|
+
],
|
119
|
+
T.untyped,
|
120
|
+
)
|
121
|
+
],
|
122
|
+
T::Hash[
|
123
|
+
T.any(String, Symbol),
|
124
|
+
T.any(
|
125
|
+
String,
|
126
|
+
Symbol,
|
127
|
+
Integer,
|
128
|
+
Float,
|
129
|
+
T::Array[T.any(String, Symbol, Integer, Float)],
|
130
|
+
)
|
131
|
+
],
|
132
|
+
),
|
133
|
+
)
|
134
|
+
end
|
135
|
+
sig do
|
136
|
+
params(
|
137
|
+
filters: FILTERS_FIELD_TYPE,
|
138
|
+
logical_operator: LOGICAL_OPERATOR_TYPE,
|
139
|
+
)
|
140
|
+
.returns(
|
141
|
+
T.nilable(
|
142
|
+
T.any(
|
143
|
+
T::Hash[String, String],
|
144
|
+
{
|
145
|
+
conditions:
|
146
|
+
T.any(
|
147
|
+
T::Array[T.any(String, Symbol, Integer, Float)],
|
148
|
+
T::Array[T.untyped],
|
149
|
+
),
|
150
|
+
logical_operator: String,
|
151
|
+
},
|
152
|
+
),
|
153
|
+
),
|
154
|
+
)
|
155
|
+
end
|
48
156
|
def add_filter(filters, logical_operator = 'and')
|
49
157
|
return unless filters
|
50
158
|
|
51
|
-
|
159
|
+
# cast are here because Sorbet is confused by the madness filters can be
|
160
|
+
@parsed_params[:filter] =
|
52
161
|
if (self.class.filters_are_simple?(filters))
|
53
|
-
translate_simple_filters_to_sg(
|
162
|
+
translate_simple_filters_to_sg(
|
163
|
+
T.cast(
|
164
|
+
filters,
|
165
|
+
T::Hash[
|
166
|
+
T.any(String, Symbol),
|
167
|
+
T.any(
|
168
|
+
String,
|
169
|
+
Symbol,
|
170
|
+
Integer,
|
171
|
+
Float,
|
172
|
+
T::Array[T.any(String, Symbol, Integer, Float)],
|
173
|
+
)
|
174
|
+
],
|
175
|
+
),
|
176
|
+
)
|
54
177
|
elsif filters.is_a? Hash
|
178
|
+
filters =
|
179
|
+
T.cast(
|
180
|
+
T.unsafe(filters),
|
181
|
+
T::Hash[
|
182
|
+
T.any(String, Symbol),
|
183
|
+
T.any(
|
184
|
+
String,
|
185
|
+
Symbol,
|
186
|
+
Integer,
|
187
|
+
Float,
|
188
|
+
T::Array[T.any(String, Symbol, Integer, Float)],
|
189
|
+
T::Hash[
|
190
|
+
T.any(String, Symbol),
|
191
|
+
T.any(
|
192
|
+
String,
|
193
|
+
Symbol,
|
194
|
+
Integer,
|
195
|
+
Float,
|
196
|
+
T::Array[T.any(String, Symbol, Integer, Float)],
|
197
|
+
T.untyped,
|
198
|
+
)
|
199
|
+
],
|
200
|
+
T.untyped,
|
201
|
+
)
|
202
|
+
],
|
203
|
+
)
|
55
204
|
{
|
56
205
|
conditions:
|
57
206
|
filters[:conditions] || filters['conditions'] ||
|
58
207
|
translate_complex_filters_to_sg(filters),
|
59
208
|
logical_operator:
|
60
209
|
filters[:logical_operator] || filters['logical_operator'] ||
|
61
|
-
logical_operator,
|
210
|
+
logical_operator.to_s,
|
62
211
|
}
|
63
212
|
else
|
64
|
-
{ conditions: filters, logical_operator: logical_operator }
|
213
|
+
{ conditions: filters, logical_operator: logical_operator.to_s }
|
65
214
|
end
|
66
215
|
end
|
67
216
|
|
217
|
+
GROUPING_FIELD_TYPE =
|
218
|
+
T.type_alias do
|
219
|
+
T.nilable(
|
220
|
+
T.any(
|
221
|
+
T::Array[T::Array[T.any(String, Symbol)]],
|
222
|
+
T::Hash[
|
223
|
+
String,
|
224
|
+
T.any(
|
225
|
+
String,
|
226
|
+
Symbol,
|
227
|
+
{ type: String },
|
228
|
+
{ 'type' => String },
|
229
|
+
{ direction: String },
|
230
|
+
{ 'direction' => String },
|
231
|
+
{ type: String, direction: String },
|
232
|
+
{ :type => String, 'direction' => String },
|
233
|
+
{ 'type' => String, :direction => String },
|
234
|
+
{ 'type' => String, 'direction' => String },
|
235
|
+
)
|
236
|
+
],
|
237
|
+
),
|
238
|
+
)
|
239
|
+
end
|
240
|
+
sig { params(grouping: GROUPING_FIELD_TYPE).returns(T.untyped) }
|
68
241
|
def add_grouping(grouping)
|
69
242
|
return unless grouping
|
70
243
|
|
71
244
|
if grouping.is_a? Array
|
72
|
-
|
245
|
+
@parsed_params[:grouping] = grouping
|
73
246
|
return
|
74
247
|
end
|
75
248
|
|
76
|
-
|
77
|
-
grouping
|
78
|
-
.
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
type: 'exact',
|
93
|
-
direction: options.to_s,
|
94
|
-
}
|
95
|
-
end
|
249
|
+
@parsed_params[:grouping] =
|
250
|
+
grouping.each_with_object([]) do |(key, options), result|
|
251
|
+
if options.is_a? Hash
|
252
|
+
result << {
|
253
|
+
field: key.to_s,
|
254
|
+
type: options[:type]&.to_s || options['type']&.to_s || 'exact',
|
255
|
+
direction:
|
256
|
+
options[:direction]&.to_s || options['direction']&.to_s ||
|
257
|
+
'asc',
|
258
|
+
}
|
259
|
+
else
|
260
|
+
result << {
|
261
|
+
field: key.to_s,
|
262
|
+
type: 'exact',
|
263
|
+
direction: options.to_s,
|
264
|
+
}
|
96
265
|
end
|
266
|
+
end
|
97
267
|
end
|
98
268
|
|
269
|
+
SUMMARY_FILEDS_TYPE =
|
270
|
+
T.type_alias do
|
271
|
+
T.nilable(
|
272
|
+
T.any(
|
273
|
+
T::Array[
|
274
|
+
T::Hash[
|
275
|
+
T.any(String, Symbol),
|
276
|
+
T::Hash[T.any(String, Symbol), T.any(String, Symbol)]
|
277
|
+
]
|
278
|
+
],
|
279
|
+
T::Hash[T.any(String, Symbol), T.any(String, Symbol)],
|
280
|
+
),
|
281
|
+
)
|
282
|
+
end
|
283
|
+
sig do
|
284
|
+
params(summary_fields: SUMMARY_FILEDS_TYPE)
|
285
|
+
.returns(T.nilable(T::Array[T::Hash[T.untyped, T.untyped]]))
|
286
|
+
end
|
99
287
|
def add_summary_fields(summary_fields)
|
100
288
|
return unless summary_fields
|
101
289
|
|
102
290
|
if summary_fields.is_a? Array
|
103
|
-
|
291
|
+
@parsed_params[:summary_fields] = summary_fields
|
104
292
|
return
|
105
293
|
end
|
106
294
|
|
107
295
|
if summary_fields.is_a? Hash
|
108
|
-
|
296
|
+
@parsed_params[:summary_fields] =
|
109
297
|
summary_fields.map { |k, v| { field: k.to_s, type: v.to_s } }
|
110
298
|
end
|
111
299
|
end
|
112
300
|
|
301
|
+
sig { params(filters: FILTERS_FIELD_TYPE).returns(T::Boolean) }
|
113
302
|
def self.filters_are_simple?(filters)
|
303
|
+
return false unless filters
|
114
304
|
return false if filters.is_a? Array
|
115
305
|
|
116
|
-
if filters
|
117
|
-
(filters[:conditions] || filters['conditions'])
|
118
|
-
return false
|
119
|
-
end
|
306
|
+
return false if filters[:conditions] || filters['conditions']
|
120
307
|
|
121
308
|
filters.values.all? do |filter_val|
|
122
309
|
(
|
@@ -134,6 +321,22 @@ module ShotgridApiRuby
|
|
134
321
|
|
135
322
|
private
|
136
323
|
|
324
|
+
sig do
|
325
|
+
params(
|
326
|
+
filters:
|
327
|
+
T::Hash[
|
328
|
+
T.any(String, Symbol),
|
329
|
+
T.any(
|
330
|
+
String,
|
331
|
+
Symbol,
|
332
|
+
Integer,
|
333
|
+
Float,
|
334
|
+
T::Array[T.any(String, Symbol, Integer, Float)],
|
335
|
+
)
|
336
|
+
],
|
337
|
+
)
|
338
|
+
.returns(T::Hash[String, String])
|
339
|
+
end
|
137
340
|
def translate_simple_filters_to_sg(filters)
|
138
341
|
filters.map do |field, value|
|
139
342
|
[
|
@@ -143,42 +346,78 @@ module ShotgridApiRuby
|
|
143
346
|
end.to_h
|
144
347
|
end
|
145
348
|
|
349
|
+
sig do
|
350
|
+
params(
|
351
|
+
filters:
|
352
|
+
T.any(
|
353
|
+
T::Array[T.untyped],
|
354
|
+
T::Hash[
|
355
|
+
T.any(String, Symbol),
|
356
|
+
T.any(
|
357
|
+
String,
|
358
|
+
Symbol,
|
359
|
+
Integer,
|
360
|
+
Float,
|
361
|
+
T::Array[T.any(String, Symbol, Integer, Float)],
|
362
|
+
T::Hash[
|
363
|
+
T.any(String, Symbol),
|
364
|
+
T.any(
|
365
|
+
String,
|
366
|
+
Symbol,
|
367
|
+
Integer,
|
368
|
+
Float,
|
369
|
+
T::Array[T.any(String, Symbol, Integer, Float)],
|
370
|
+
T.untyped,
|
371
|
+
)
|
372
|
+
],
|
373
|
+
T.untyped,
|
374
|
+
)
|
375
|
+
],
|
376
|
+
),
|
377
|
+
)
|
378
|
+
.returns(
|
379
|
+
T::Array[
|
380
|
+
T.any(
|
381
|
+
T::Array[T.any(String, Symbol, Integer, Float)],
|
382
|
+
T::Array[T.untyped],
|
383
|
+
)
|
384
|
+
],
|
385
|
+
)
|
386
|
+
end
|
146
387
|
def translate_complex_filters_to_sg(filters)
|
147
388
|
# We don't know how to translate anything but hashes
|
148
|
-
return filters
|
149
|
-
|
150
|
-
filters
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
if !subfield.to_s.include?('.')
|
161
|
-
"#{field.capitalize}.#{subfield}"
|
162
|
-
else
|
163
|
-
subfield
|
164
|
-
end
|
165
|
-
case subvalue
|
166
|
-
when String, Symbol, Integer, Float
|
167
|
-
result << ["#{field}.#{sanitized_subfield}", 'is', subvalue]
|
168
|
-
when Array
|
169
|
-
result << ["#{field}.#{sanitized_subfield}", 'in', subvalue]
|
389
|
+
return filters unless filters.is_a?(Hash)
|
390
|
+
|
391
|
+
filters.each_with_object([]) do |item, result|
|
392
|
+
field, value = item
|
393
|
+
case value
|
394
|
+
when String, Symbol, Integer, Float
|
395
|
+
result << [field.to_s, 'is', value]
|
396
|
+
when Hash
|
397
|
+
value.each do |subfield, subvalue|
|
398
|
+
sanitized_subfield =
|
399
|
+
if !subfield.to_s.include?('.')
|
400
|
+
"#{field.capitalize}.#{subfield}"
|
170
401
|
else
|
171
|
-
|
172
|
-
'This case is too complex to auto-translate. Please use shotgrid query syntax.'
|
402
|
+
subfield
|
173
403
|
end
|
404
|
+
case subvalue
|
405
|
+
when String, Symbol, Integer, Float
|
406
|
+
result << ["#{field}.#{sanitized_subfield}", 'is', subvalue]
|
407
|
+
when Array
|
408
|
+
result << ["#{field}.#{sanitized_subfield}", 'in', subvalue]
|
409
|
+
else
|
410
|
+
raise TooComplexFiltersError,
|
411
|
+
'This case is too complex to auto-translate. Please use shotgrid query syntax.'
|
174
412
|
end
|
175
|
-
when Array
|
176
|
-
result << [field.to_s, 'in', value]
|
177
|
-
else
|
178
|
-
raise TooComplexFiltersError,
|
179
|
-
'This case is too complex to auto-translate. Please use shotgrid query syntax.'
|
180
413
|
end
|
414
|
+
when Array
|
415
|
+
result << [field.to_s, 'in', value]
|
416
|
+
else
|
417
|
+
raise TooComplexFiltersError,
|
418
|
+
'This case is too complex to auto-translate. Please use shotgrid query syntax.'
|
181
419
|
end
|
420
|
+
end
|
182
421
|
end
|
183
422
|
end
|
184
423
|
end
|
@@ -1,15 +1,29 @@
|
|
1
|
+
# typed: strict
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module ShotgridApiRuby
|
4
5
|
class Entities
|
5
6
|
class Schema
|
7
|
+
extend T::Sig
|
8
|
+
|
9
|
+
sig do
|
10
|
+
params(
|
11
|
+
connection: Faraday::Connection,
|
12
|
+
type: T.any(String, Symbol),
|
13
|
+
base_url_prefix: URI,
|
14
|
+
).void
|
15
|
+
end
|
6
16
|
def initialize(connection, type, base_url_prefix)
|
7
|
-
@connection = connection.dup
|
8
|
-
@type = type
|
17
|
+
@connection = T.let(connection.dup, Faraday::Connection)
|
18
|
+
@type = T.let(type, T.any(String, Symbol))
|
9
19
|
@connection.url_prefix = "#{base_url_prefix}/schema/#{type}"
|
10
20
|
end
|
11
|
-
|
21
|
+
sig { returns(T.any(String, Symbol)) }
|
22
|
+
attr_reader :type
|
23
|
+
sig { returns(Faraday::Connection) }
|
24
|
+
attr_reader :connection
|
12
25
|
|
26
|
+
sig { returns(OpenStruct) }
|
13
27
|
def read
|
14
28
|
resp = @connection.get('')
|
15
29
|
|
@@ -25,6 +39,7 @@ module ShotgridApiRuby
|
|
25
39
|
OpenStruct.new(resp_body['data'].transform_values { |v| v['value'] })
|
26
40
|
end
|
27
41
|
|
42
|
+
sig { returns(OpenStruct) }
|
28
43
|
def fields
|
29
44
|
resp = @connection.get('fields')
|
30
45
|
resp_body = JSON.parse(resp.body)
|
@@ -1,15 +1,37 @@
|
|
1
|
+
# typed: strict
|
1
2
|
module ShotgridApiRuby
|
2
3
|
class Entities
|
3
4
|
class Summarize
|
4
|
-
|
5
|
+
extend T::Sig
|
5
6
|
|
7
|
+
class Summary < T::Struct
|
8
|
+
const :summaries, T.nilable(T::Hash[T.untyped, T.untyped])
|
9
|
+
const :groups, T.nilable(T::Array[T.untyped])
|
10
|
+
end
|
11
|
+
|
12
|
+
sig do
|
13
|
+
params(
|
14
|
+
connection: Faraday::Connection,
|
15
|
+
type: T.any(String, Symbol),
|
16
|
+
base_url_prefix: URI,
|
17
|
+
).void
|
18
|
+
end
|
6
19
|
def initialize(connection, type, base_url_prefix)
|
7
|
-
@connection = connection.dup
|
8
|
-
@type = type
|
9
|
-
@connection.url_prefix =
|
20
|
+
@connection = T.let(connection.dup, Faraday::Connection)
|
21
|
+
@type = T.let(type, T.any(String, Symbol))
|
22
|
+
@connection.url_prefix =
|
23
|
+
T.let("#{base_url_prefix}/entity/#{type}/_summarize", String)
|
10
24
|
end
|
11
|
-
attr_reader :type, :connection
|
12
25
|
|
26
|
+
sig { returns(T.any(String, Symbol)) }
|
27
|
+
attr_reader :type
|
28
|
+
sig { returns(Faraday::Connection) }
|
29
|
+
attr_reader :connection
|
30
|
+
|
31
|
+
sig do
|
32
|
+
params(filter: T.nilable(T.untyped), logical_operator: T.untyped)
|
33
|
+
.returns(T.untyped)
|
34
|
+
end
|
13
35
|
def count(filter: nil, logical_operator: 'and')
|
14
36
|
result =
|
15
37
|
summarize(
|
@@ -20,6 +42,16 @@ module ShotgridApiRuby
|
|
20
42
|
result.summaries&.[]('id') || 0
|
21
43
|
end
|
22
44
|
|
45
|
+
sig do
|
46
|
+
params(
|
47
|
+
filter: Params::FILTERS_FIELD_TYPE,
|
48
|
+
grouping: Params::GROUPING_FIELD_TYPE,
|
49
|
+
summary_fields: Params::SUMMARY_FILEDS_TYPE,
|
50
|
+
logical_operator: Params::LOGICAL_OPERATOR_TYPE,
|
51
|
+
include_archived_projects: T.nilable(T::Boolean),
|
52
|
+
)
|
53
|
+
.returns(Summary)
|
54
|
+
end
|
23
55
|
def summarize(
|
24
56
|
filter: nil,
|
25
57
|
grouping: nil,
|
@@ -59,8 +91,8 @@ module ShotgridApiRuby
|
|
59
91
|
end
|
60
92
|
|
61
93
|
Summary.new(
|
62
|
-
resp_body['data']['summaries'],
|
63
|
-
resp_body['data']&.[]('groups'),
|
94
|
+
summaries: resp_body['data']['summaries'],
|
95
|
+
groups: resp_body['data']&.[]('groups'),
|
64
96
|
)
|
65
97
|
end
|
66
98
|
end
|