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