shotgrid_api_ruby 0.1.3 → 0.2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (156) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  4. data/.github/workflows/test_and_publish.yml +2 -0
  5. data/.github/workflows/test_only.yml +2 -0
  6. data/.gitignore +3 -0
  7. data/.overcommit.yml +9 -0
  8. data/.rubocop.yml +2 -0
  9. data/CHANGELOG.md +27 -1
  10. data/CODE_OF_CONDUCT.md +128 -0
  11. data/Gemfile +18 -0
  12. data/Guardfile +2 -2
  13. data/bin/generate_and_add_documentation +1 -0
  14. data/bin/generate_sorbet_coverage +3 -0
  15. data/bin/prettirun +1 -1
  16. data/bin/sorbet_check +1 -0
  17. data/bin/tapioca +29 -0
  18. data/docs/ShotgridApiRuby/Auth/Validator.html +319 -0
  19. data/docs/ShotgridApiRuby/Auth.html +1079 -0
  20. data/docs/ShotgridApiRuby/Client.html +933 -0
  21. data/docs/ShotgridApiRuby/Entities/Params/TooComplexFiltersError.html +124 -0
  22. data/docs/ShotgridApiRuby/Entities/Params.html +1377 -0
  23. data/docs/ShotgridApiRuby/Entities/Schema.html +646 -0
  24. data/docs/ShotgridApiRuby/Entities/Summarize/Summary.html +401 -0
  25. data/docs/ShotgridApiRuby/Entities/Summarize.html +775 -0
  26. data/docs/ShotgridApiRuby/Entities.html +2461 -0
  27. data/docs/ShotgridApiRuby/Entity.html +935 -0
  28. data/docs/ShotgridApiRuby/Preferences.html +417 -0
  29. data/docs/ShotgridApiRuby/ServerInfo.html +415 -0
  30. data/docs/ShotgridApiRuby/ShotgridCallError.html +328 -0
  31. data/docs/ShotgridApiRuby/Types.html +136 -0
  32. data/docs/ShotgridApiRuby.html +307 -0
  33. data/docs/_index.html +253 -0
  34. data/docs/class_list.html +51 -0
  35. data/docs/css/common.css +1 -0
  36. data/docs/css/full_list.css +58 -0
  37. data/docs/css/style.css +497 -0
  38. data/docs/file.README.html +578 -0
  39. data/docs/file_list.html +56 -0
  40. data/docs/frames.html +17 -0
  41. data/docs/index.html +578 -0
  42. data/docs/js/app.js +314 -0
  43. data/docs/js/full_list.js +216 -0
  44. data/docs/js/jquery.js +4 -0
  45. data/docs/method_list.html +643 -0
  46. data/docs/top-level-namespace.html +110 -0
  47. data/lib/shotgrid_api_ruby/auth.rb +89 -33
  48. data/lib/shotgrid_api_ruby/client.rb +50 -7
  49. data/lib/shotgrid_api_ruby/entities/params.rb +304 -65
  50. data/lib/shotgrid_api_ruby/entities/schema.rb +18 -3
  51. data/lib/shotgrid_api_ruby/entities/summarize.rb +39 -7
  52. data/lib/shotgrid_api_ruby/entities.rb +118 -29
  53. data/lib/shotgrid_api_ruby/entity.rb +29 -12
  54. data/lib/shotgrid_api_ruby/preferences.rb +7 -1
  55. data/lib/shotgrid_api_ruby/server_info.rb +7 -1
  56. data/lib/shotgrid_api_ruby/shotgrid_call_error.rb +5 -1
  57. data/lib/shotgrid_api_ruby/types/auth_type.rb +23 -0
  58. data/lib/shotgrid_api_ruby/version.rb +2 -1
  59. data/lib/shotgrid_api_ruby.rb +20 -2
  60. data/shotgrid_api_ruby.gemspec +3 -11
  61. data/sorbet/config +6 -0
  62. data/sorbet/rbi/faraday.rbi +20 -0
  63. data/sorbet/rbi/gems/activesupport@6.1.4.1.rbi +3770 -0
  64. data/sorbet/rbi/gems/ast@2.4.2.rbi +54 -0
  65. data/sorbet/rbi/gems/backport@1.2.0.rbi +8 -0
  66. data/sorbet/rbi/gems/benchmark@0.1.1.rbi +65 -0
  67. data/sorbet/rbi/gems/bundler-audit@0.8.0.rbi +8 -0
  68. data/sorbet/rbi/gems/byebug@11.1.3.rbi +1569 -0
  69. data/sorbet/rbi/gems/childprocess@4.1.0.rbi +8 -0
  70. data/sorbet/rbi/gems/coderay@1.1.3.rbi +1005 -0
  71. data/sorbet/rbi/gems/colorize@0.8.1.rbi +39 -0
  72. data/sorbet/rbi/gems/commander@4.6.0.rbi +8 -0
  73. data/sorbet/rbi/gems/concurrent-ruby@1.1.9.rbi +2403 -0
  74. data/sorbet/rbi/gems/diff-lcs@1.4.4.rbi +8 -0
  75. data/sorbet/rbi/gems/docile@1.4.0.rbi +54 -0
  76. data/sorbet/rbi/gems/dotenv@2.7.6.rbi +88 -0
  77. data/sorbet/rbi/gems/e2mmap@0.1.0.rbi +8 -0
  78. data/sorbet/rbi/gems/faker@2.19.0.rbi +2513 -0
  79. data/sorbet/rbi/gems/faraday-em_http@1.0.0.rbi +101 -0
  80. data/sorbet/rbi/gems/faraday-em_synchrony@1.0.0.rbi +78 -0
  81. data/sorbet/rbi/gems/faraday-excon@1.1.0.rbi +77 -0
  82. data/sorbet/rbi/gems/faraday-httpclient@1.0.1.rbi +73 -0
  83. data/sorbet/rbi/gems/faraday-net_http@1.0.1.rbi +82 -0
  84. data/sorbet/rbi/gems/faraday-net_http_persistent@1.2.0.rbi +72 -0
  85. data/sorbet/rbi/gems/faraday-patron@1.0.0.rbi +74 -0
  86. data/sorbet/rbi/gems/faraday-rack@1.0.0.rbi +73 -0
  87. data/sorbet/rbi/gems/faraday@1.7.0.rbi +783 -0
  88. data/sorbet/rbi/gems/ffi@1.15.3.rbi +8 -0
  89. data/sorbet/rbi/gems/formatador@0.3.0.rbi +8 -0
  90. data/sorbet/rbi/gems/guard-compat@1.2.1.rbi +8 -0
  91. data/sorbet/rbi/gems/guard-rspec@4.7.3.rbi +8 -0
  92. data/sorbet/rbi/gems/guard@2.18.0.rbi +8 -0
  93. data/sorbet/rbi/gems/haml@5.2.2.rbi +8 -0
  94. data/sorbet/rbi/gems/highline@2.0.3.rbi +8 -0
  95. data/sorbet/rbi/gems/i18n@1.8.10.rbi +584 -0
  96. data/sorbet/rbi/gems/iniparse@1.5.0.rbi +8 -0
  97. data/sorbet/rbi/gems/jaro_winkler@1.5.4.rbi +8 -0
  98. data/sorbet/rbi/gems/kramdown-parser-gfm@1.1.0.rbi +8 -0
  99. data/sorbet/rbi/gems/kramdown@2.3.1.rbi +8 -0
  100. data/sorbet/rbi/gems/listen@3.7.0.rbi +476 -0
  101. data/sorbet/rbi/gems/lumberjack@1.2.8.rbi +8 -0
  102. data/sorbet/rbi/gems/method_source@1.0.0.rbi +72 -0
  103. data/sorbet/rbi/gems/minitest@5.14.4.rbi +344 -0
  104. data/sorbet/rbi/gems/multipart-post@2.1.1.rbi +69 -0
  105. data/sorbet/rbi/gems/nenv@0.3.0.rbi +8 -0
  106. data/sorbet/rbi/gems/nokogiri@1.12.3.rbi +8 -0
  107. data/sorbet/rbi/gems/notiffany@0.1.3.rbi +8 -0
  108. data/sorbet/rbi/gems/overcommit@0.58.0.rbi +8 -0
  109. data/sorbet/rbi/gems/parallel@1.20.1.rbi +8 -0
  110. data/sorbet/rbi/gems/parlour@6.0.1.rbi +1610 -0
  111. data/sorbet/rbi/gems/parser@3.0.2.0.rbi +1731 -0
  112. data/sorbet/rbi/gems/prettier@1.6.1.rbi +8 -0
  113. data/sorbet/rbi/gems/pry-byebug@3.9.0.rbi +461 -0
  114. data/sorbet/rbi/gems/pry@0.13.1.rbi +2553 -0
  115. data/sorbet/rbi/gems/racc@1.5.2.rbi +47 -0
  116. data/sorbet/rbi/gems/rainbow@3.0.0.rbi +153 -0
  117. data/sorbet/rbi/gems/rake@13.0.6.rbi +807 -0
  118. data/sorbet/rbi/gems/rb-fsevent@0.11.0.rbi +8 -0
  119. data/sorbet/rbi/gems/rb-inotify@0.10.1.rbi +8 -0
  120. data/sorbet/rbi/gems/regexp_parser@2.1.1.rbi +8 -0
  121. data/sorbet/rbi/gems/reverse_markdown@2.0.0.rbi +8 -0
  122. data/sorbet/rbi/gems/rexml@3.2.5.rbi +672 -0
  123. data/sorbet/rbi/gems/rspec-core@3.10.1.rbi +2500 -0
  124. data/sorbet/rbi/gems/rspec-expectations@3.10.1.rbi +1574 -0
  125. data/sorbet/rbi/gems/rspec-mocks@3.10.2.rbi +1462 -0
  126. data/sorbet/rbi/gems/rspec-support@3.10.2.rbi +510 -0
  127. data/sorbet/rbi/gems/rspec@3.10.0.rbi +39 -0
  128. data/sorbet/rbi/gems/rspec_in_context@1.1.0.3.rbi +196 -0
  129. data/sorbet/rbi/gems/rubocop-ast@1.11.0.rbi +8 -0
  130. data/sorbet/rbi/gems/rubocop-faker@1.1.0.rbi +8 -0
  131. data/sorbet/rbi/gems/rubocop-performance@1.11.5.rbi +8 -0
  132. data/sorbet/rbi/gems/rubocop-sorbet@0.6.2.rbi +8 -0
  133. data/sorbet/rbi/gems/rubocop@1.20.0.rbi +8 -0
  134. data/sorbet/rbi/gems/ruby-progressbar@1.11.0.rbi +8 -0
  135. data/sorbet/rbi/gems/ruby2_keywords@0.0.5.rbi +8 -0
  136. data/sorbet/rbi/gems/shellany@0.0.1.rbi +8 -0
  137. data/sorbet/rbi/gems/simplecov-html@0.12.3.rbi +89 -0
  138. data/sorbet/rbi/gems/simplecov@0.21.2.rbi +577 -0
  139. data/sorbet/rbi/gems/simplecov_json_formatter@0.1.3.rbi +8 -0
  140. data/sorbet/rbi/gems/solargraph@0.43.0.rbi +8 -0
  141. data/sorbet/rbi/gems/spoom@1.1.2.rbi +1204 -0
  142. data/sorbet/rbi/gems/tapioca@0.4.25.rbi +1239 -0
  143. data/sorbet/rbi/gems/temple@0.8.2.rbi +8 -0
  144. data/sorbet/rbi/gems/thor@1.1.0.rbi +838 -0
  145. data/sorbet/rbi/gems/tilt@2.0.10.rbi +8 -0
  146. data/sorbet/rbi/gems/timecop@0.9.4.rbi +82 -0
  147. data/sorbet/rbi/gems/tzinfo@2.0.4.rbi +857 -0
  148. data/sorbet/rbi/gems/unicode-display_width@2.0.0.rbi +8 -0
  149. data/sorbet/rbi/gems/unparser@0.6.0.rbi +8 -0
  150. data/sorbet/rbi/gems/vcr@6.0.0.rbi +782 -0
  151. data/sorbet/rbi/gems/yard-sorbet@0.5.3.rbi +8 -0
  152. data/sorbet/rbi/gems/yard@0.9.26.rbi +8 -0
  153. data/sorbet/rbi/gems/zeitwerk@2.4.2.rbi +173 -0
  154. data/sorbet/tapioca/config +0 -0
  155. data/sorbet/tapioca/require.rb +5 -0
  156. metadata +148 -128
@@ -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 < Hash
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
- self[:sort] =
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
- self[:page] = { size: page_size || 20, number: page || 1 }
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
- self[:fields] =
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
- self[:options] = {
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
- self[:filter] =
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(filters)
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
- self[:grouping] = grouping
245
+ @parsed_params[:grouping] = grouping
73
246
  return
74
247
  end
75
248
 
76
- self[:grouping] =
77
- grouping
78
- .each
79
- .with_object([]) do |(key, options), result|
80
- if options.is_a? Hash
81
- result << {
82
- field: key.to_s,
83
- type:
84
- options[:type]&.to_s || options['type']&.to_s || 'exact',
85
- direction:
86
- options[:direction]&.to_s || options['direction']&.to_s ||
87
- 'asc',
88
- }
89
- else
90
- result << {
91
- field: key.to_s,
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
- self[:summary_fields] = summary_fields
291
+ @parsed_params[:summary_fields] = summary_fields
104
292
  return
105
293
  end
106
294
 
107
295
  if summary_fields.is_a? Hash
108
- self[:summary_fields] =
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.is_a?(Hash) &&
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 if !filters.is_a?(Hash)
149
-
150
- filters
151
- .each
152
- .with_object([]) do |item, result|
153
- field, value = item
154
- case value
155
- when String, Symbol, Integer, Float
156
- result << [field.to_s, 'is', value]
157
- when Hash
158
- value.each do |subfield, subvalue|
159
- sanitized_subfield =
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
- raise TooComplexFiltersError,
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
- attr_reader :type, :connection
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
- Summary = Struct.new(:summaries, :groups)
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 = "#{base_url_prefix}/entity/#{type}/_summarize"
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