shotgrid_api_ruby 0.1.3.1 → 0.2.0.4

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