bullet_train-api 1.6.26 → 1.6.28

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 80f53bd14ce32fe54b5dde95fa14aa33fadbc9849f786a72b4ab714ad06a4c59
4
- data.tar.gz: 40c98339cd1c7823b81d730101cc136e4cc2886857671ce3754732bb376bc566
3
+ metadata.gz: 3da820ecd4427cce764eab98c2b258a9677022ea138e990020176c1c16a5879f
4
+ data.tar.gz: 52fd62ced5483d47f5d4e31978a2788cfea8a46917e5d945eeffb0ebe203c18c
5
5
  SHA512:
6
- metadata.gz: 4d7aa0e7721fabfcd492edcbaf4ea00455038ddd55d2bb4117404e90129a447c2f14cc137760d11d7bfb78103bc242bed5d2ac161babc8a94772a9e3045e7c62
7
- data.tar.gz: a3c4a43aff5bdaf0b6d07f7c7575394b47113dbe14dac87564d47da0f2cda2d16a07b0a13369820d618005f649d048c76420f988734351d14523ea81c1104327
6
+ metadata.gz: cb260cba10aaf616fa8b4ba8b7d3ab4f358dc384af7c860ff2d53389de318bfc46f9acdedde06d4cb8d4759b92b9dcff815d2c0f63bc8619e8020a062fa22c2f
7
+ data.tar.gz: c69f7552837e1706946a698ab6aa8ca470aa0b7f2a549d4ff2fe44e740ec58fa851e622979e684b080bb4f42517d75dc4972d9944e20354824e1737a10d337bc
@@ -38,8 +38,8 @@ module Api
38
38
  end
39
39
 
40
40
  if custom_output
41
- merge = deep_merge(YAML.load(output), YAML.load(custom_output)).to_yaml.html_safe
42
- # YAML.load escapes emojis https://github.com/ruby/psych/issues/371
41
+ merge = deep_merge(YAML.safe_load(output), YAML.safe_load(custom_output)).to_yaml.html_safe
42
+ # YAML.safe_load escapes emojis https://github.com/ruby/psych/issues/371
43
43
  # Next line returns emojis back and removes yaml garbage
44
44
  output = merge.gsub("---", "").gsub(/\\u[\da-f]{8}/i) { |m| [m[-8..].to_i(16)].pack("U") }
45
45
  end
@@ -47,7 +47,9 @@ module Api
47
47
  indent(output, 1)
48
48
  end
49
49
 
50
- def automatic_components_for(model, locals: {})
50
+ def automatic_components_for(model, **options)
51
+ locals = options.delete(:locals) || {}
52
+
51
53
  path = "app/views/api/#{@version}"
52
54
  paths = [path, "app/views"] + gem_paths.product(%W[/#{path} /app/views]).map(&:join)
53
55
 
@@ -76,6 +78,9 @@ module Api
76
78
 
77
79
  attributes_output = JSON.parse(schema_json)
78
80
 
81
+ # Allow customization of Attributes
82
+ customize_component!(attributes_output, options[:attributes]) if options[:attributes]
83
+
79
84
  # Add "Attributes" part to $ref's
80
85
  update_ref_values!(attributes_output)
81
86
 
@@ -106,6 +111,9 @@ module Api
106
111
  parameters_output["properties"].select! { |key| strong_parameter_keys.include?(key.to_sym) }
107
112
  parameters_output["example"]&.select! { |key, value| strong_parameter_keys.include?(key.to_sym) && value.present? }
108
113
 
114
+ # Allow customization of Parameters
115
+ customize_component!(parameters_output, options[:parameters]) if options[:parameters]
116
+
109
117
  (
110
118
  indent(attributes_output.to_yaml.gsub("---", "#{model.name.gsub("::", "")}Attributes:"), 3) +
111
119
  indent(" " + parameters_output.to_yaml.gsub("---", "#{model.name.gsub("::", "")}Parameters:"), 3)
@@ -164,5 +172,41 @@ module Api
164
172
  end
165
173
  end
166
174
  end
175
+
176
+ def customize_component!(original, custom)
177
+ custom = custom.deep_stringify_keys.deep_transform_values { |v| v.is_a?(Symbol) ? v.to_s : v }
178
+
179
+ if custom.key?("add")
180
+ custom["add"].each do |property, details|
181
+ if details["required"]
182
+ original["required"] << property
183
+ details.delete("required")
184
+ end
185
+ original["properties"][property] = details
186
+ if details["example"]
187
+ original["example"][property] = details["example"]
188
+ details.delete("example")
189
+ end
190
+ end
191
+ end
192
+
193
+ if custom.key?("remove")
194
+ Array(custom["remove"]).each do |property|
195
+ original["required"].delete(property)
196
+ original["properties"].delete(property)
197
+ original["example"].delete(property)
198
+ end
199
+ end
200
+
201
+ if custom.key?("only")
202
+ original["properties"].keys.each do |property|
203
+ unless Array(custom["only"]).include?(property)
204
+ original["properties"].delete(property)
205
+ original["required"].delete(property)
206
+ original["example"].delete(property)
207
+ end
208
+ end
209
+ end
210
+ end
167
211
  end
168
212
  end
@@ -20,38 +20,56 @@ en:
20
20
  destroy: Are you sure you want to remove %{access_token_name}? This will break any active integrations using this token and can't be undone.
21
21
  fields: &fields
22
22
  id:
23
- heading: Access Token ID
23
+ heading: &id Access Token ID
24
+ api_title: *id
25
+ api_description: *id
24
26
  application_id:
25
- heading: Application ID
27
+ heading: &application_id Application ID
28
+ api_title: *application_id
29
+ api_description: *application_id
26
30
  token:
27
31
  _: &token Token
28
32
  label: *token
29
33
  heading: *token
34
+ api_title: *token
35
+ api_description: *token
30
36
  expires_in:
31
37
  _: &expires_in Expires In
32
38
  label: *expires_in
33
39
  heading: *expires_in
40
+ api_title: *expires_in
41
+ api_description: *expires_in
34
42
  scopes:
35
43
  _: &scopes Scopes
36
44
  label: *scopes
37
45
  heading: *scopes
46
+ api_title: *scopes
47
+ api_description: *scopes
38
48
  last_used_at:
39
49
  _: &last_used_at Last Used At
40
50
  label: *last_used_at
41
51
  heading: *last_used_at
52
+ api_title: *last_used_at
53
+ api_description: *last_used_at
42
54
  description:
43
55
  _: &description Description
44
56
  label: *description
45
57
  heading: *description
58
+ api_title: *description
59
+ api_description: *description
46
60
  # 🚅 super scaffolding will insert new fields above this line.
47
61
  created_at:
48
62
  _: &created_at Created
49
63
  label: *created_at
50
64
  heading: *created_at
65
+ api_title: *created_at
66
+ api_description: *created_at
51
67
  updated_at:
52
68
  _: &updated_at Updated
53
69
  label: *updated_at
54
70
  heading: *updated_at
71
+ api_title: *updated_at
72
+ api_description: *updated_at
55
73
  api:
56
74
  collection_actions: "Collection Actions for Access Tokens"
57
75
  index: "List Access Tokens"
@@ -24,32 +24,46 @@ en:
24
24
  name:
25
25
  _: &name Name
26
26
  label: *name
27
- heading: Application Name
27
+ heading: &application_name Application Name
28
+ api_title: *application_name
29
+ api_description: *application_name
28
30
 
29
31
  redirect_uri:
30
32
  _: &redirect_uri Redirect URI
31
33
  label: *redirect_uri
32
34
  heading: *redirect_uri
35
+ api_title: *redirect_uri
36
+ api_description: *redirect_uri
33
37
  help: This is only required if you're building an OAuth2-powered integration for other users.
34
38
 
35
39
  uid:
36
- heading: Client UID
40
+ heading: &uid Client UID
41
+ api_title: *uid
42
+ api_description: *uid
37
43
 
38
44
  secret:
39
- heading: Client Secret
45
+ heading: &secret Client Secret
46
+ api_title: *secret
47
+ api_description: *secret
40
48
 
41
49
  label_string:
42
- heading: Application Name
50
+ heading: *application_name
51
+ api_title: *application_name
52
+ api_description: *application_name
43
53
 
44
54
  # 🚅 super scaffolding will insert new fields above this line.
45
55
  created_at:
46
56
  _: &created_at Added
47
57
  label: *created_at
48
58
  heading: *created_at
59
+ api_title: *created_at
60
+ api_description: *created_at
49
61
  updated_at:
50
62
  _: &updated_at Updated
51
63
  label: *updated_at
52
64
  heading: *updated_at
65
+ api_title: *updated_at
66
+ api_description: *updated_at
53
67
  index:
54
68
  section: "%{teams_possessive} Platform Applications"
55
69
  contexts:
@@ -1,5 +1,5 @@
1
1
  module BulletTrain
2
2
  module Api
3
- VERSION = "1.6.26"
3
+ VERSION = "1.6.28"
4
4
  end
5
5
  end
@@ -146,5 +146,103 @@ namespace :bullet_train do
146
146
  )
147
147
  end
148
148
  end
149
+
150
+ desc "Create `api_title` and `api_description` translations"
151
+ task create_translations: :environment do
152
+ # Define the root of the locales directory
153
+ locales_root = Rails.root.join("config", "locales").to_s
154
+
155
+ # Define the backup directory
156
+ backup_dir = Rails.root.join("tmp", "locales_backup")
157
+ FileUtils.mkdir_p(backup_dir) unless Dir.exist?(backup_dir)
158
+
159
+ original_files = Dir.glob("#{locales_root}/**/*.yml")
160
+ differing_files_count = 0
161
+
162
+ original_files.each do |file|
163
+ puts "Processing #{file}..."
164
+
165
+ lines = File.readlines(file)
166
+ new_content = []
167
+ inside_fields = false
168
+ current_field = nil
169
+ fields_indentation = 4
170
+ api_title_exists = false
171
+ api_description_exists = false
172
+
173
+ # Read the entire file as a string
174
+ lines.each_with_index do |line, index|
175
+ # fields are always under locale:model:
176
+ if line.start_with?("#{" " * fields_indentation}fields:")
177
+ inside_fields = true
178
+ new_content << line
179
+ next
180
+ end
181
+
182
+ if inside_fields
183
+ current_indentation = line.index(/\S/) || 0
184
+ if current_indentation <= fields_indentation
185
+ # We've exited the fields block
186
+ inside_fields = false
187
+ current_field = nil
188
+ elsif current_indentation == fields_indentation + 2
189
+ # We're on a line with a field name
190
+ current_field = line.strip.split(":").first
191
+
192
+ api_title_exists = false
193
+ api_description_exists = false
194
+
195
+ n = 1
196
+ until index + n >= lines.length || (lines[index + n].index(/\S/) || 0) <= fields_indentation
197
+ if lines[index + n].strip.start_with?("api_title:")
198
+ api_title_exists = true
199
+ elsif lines[index + n].strip.start_with?("api_description:")
200
+ api_description_exists = true
201
+ end
202
+ n += 1
203
+ end
204
+
205
+ elsif current_field && line.strip.start_with?("heading:")
206
+ heading_value = line.split(":").last&.strip
207
+ indent = " " * current_indentation
208
+
209
+ if heading_value&.start_with?("&", "*")
210
+ new_content << line
211
+ else
212
+ heading_value = "&#{current_field} #{heading_value}"
213
+ new_content << "#{indent}heading: #{heading_value}\n"
214
+ end
215
+
216
+ field_key = heading_value[1..]&.split(" ")&.first
217
+ new_content << "#{indent}api_title: *#{field_key}\n" unless api_title_exists
218
+ new_content << "#{indent}api_description: *#{field_key}\n" unless api_description_exists
219
+
220
+ next
221
+ end
222
+ end
223
+
224
+ new_content << line
225
+ end
226
+
227
+ # Only write to file if there are changes
228
+ unless lines.join == new_content.join
229
+ differing_files_count += 1
230
+
231
+ # Compute the relative path manually
232
+ relative_path = file.sub(/^#{Regexp.escape(locales_root)}\/?/, "")
233
+
234
+ backup_path = File.join(backup_dir, relative_path)
235
+ FileUtils.mkdir_p(File.dirname(backup_path))
236
+ FileUtils.cp(file, backup_path)
237
+ puts "↳ Updating, backup created: #{backup_path}"
238
+
239
+ # Write the updated data back to the file
240
+ File.write(file, new_content.join)
241
+ end
242
+ end
243
+
244
+ puts "---"
245
+ puts "Total files updated: #{differing_files_count}/#{original_files.size}"
246
+ end
149
247
  end
150
248
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bullet_train-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.26
4
+ version: 1.6.28
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Culver
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-18 00:00:00.000000000 Z
11
+ date: 2024-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: standard
@@ -246,7 +246,9 @@ licenses:
246
246
  metadata:
247
247
  homepage_uri: https://github.com/bullet-train-co/bullet_train-core/tree/main/bullet_train-api
248
248
  source_code_uri: https://github.com/bullet-train-co/bullet_train-core/tree/main/bullet_train-api
249
- post_install_message:
249
+ post_install_message: "\n Bullet Train is switching to separate translations for
250
+ API documentation.\n To automatically update existing translations, run once:\n\n
251
+ \ bundle exec rake bullet_train:api:create_translations\n\n "
250
252
  rdoc_options: []
251
253
  require_paths:
252
254
  - lib
@@ -261,7 +263,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
261
263
  - !ruby/object:Gem::Version
262
264
  version: '0'
263
265
  requirements: []
264
- rubygems_version: 3.4.10
266
+ rubygems_version: 3.5.3
265
267
  signing_key:
266
268
  specification_version: 4
267
269
  summary: Bullet Train API