bullet_train-api 1.3.12 → 1.3.14

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1d3f4bc85eee46e974027a4e3062c8642d3cbfd61de61fd4e5d914610342afa8
4
- data.tar.gz: 363ebf0b3de0337a5f547acfb31a1ac379e1857ad519a87ad6627ac3a6dbe685
3
+ metadata.gz: 1afcea46978b7420ab6561c17b1d55c03cc01a85be1ca29b3bd384e371a10e5c
4
+ data.tar.gz: 26f2e5abb15ef1359f5a846232ba0c953aa31a60100466a5c4594d27eb9d0e44
5
5
  SHA512:
6
- metadata.gz: 3d512b05c4161761e82d32e631798de6da994083844ff4790af692befff26360687f8448041465a2d8ef145e4a83893e7fc6363ded748fa418fbc6e43f4c5b82
7
- data.tar.gz: 3d3ca7931fc4b782e767c9a17e080ebc1c42c4410ada2ff2cb1030ecb4122934fd04deddb8fc8aea8d0dadb02a2042a44f9d98e9767ca9428d69a53da94f1ae8
6
+ metadata.gz: 2728e7625569f7a11eea0b36840d9bbc5b95a727f5fc369d7a575b092a2ece1048fd93993a798868b94a755ceec55f12504fc8eee2bb3bb24be0acad1d2c752d
7
+ data.tar.gz: cb185815afbab983770c746ccddd676956d1d8f502f795504a54d20e48c1d810a0073e1208648488d2bade4807e9323a6c1e9e37dbb38da2c1d806f0d35dc156
@@ -40,24 +40,10 @@ module Api
40
40
  # There are some placeholders specific to this method that we still need to transform.
41
41
  model_symbol = model.name.underscore.tr("/", "_").to_sym
42
42
 
43
- if (get_example = FactoryBot.get_example(model_symbol, version: @version))
44
- output.gsub!("🚅 get_example", get_example)
45
- end
46
-
47
- if (post_parameters = FactoryBot.post_parameters(model_symbol, version: @version))
48
- output.gsub!("🚅 post_parameters", post_parameters)
49
- end
50
-
51
- if (post_examples = FactoryBot.post_examples(model_symbol, version: @version))
52
- output.gsub!("🚅 post_examples", post_examples)
53
- end
54
-
55
- if (put_parameters = FactoryBot.put_parameters(model_symbol, version: @version))
56
- output.gsub!("🚅 put_parameters", put_parameters)
57
- end
58
-
59
- if (put_example = FactoryBot.put_example(model_symbol, version: @version))
60
- output.gsub!("🚅 put_example", put_example)
43
+ FactoryBot::ExampleBot::REST_METHODS.each do |method|
44
+ if (code = FactoryBot.send(method, model_symbol, version: @version))
45
+ output.gsub!("🚅 #{method}", code)
46
+ end
61
47
  end
62
48
 
63
49
  indent(output, 1)
@@ -74,7 +60,7 @@ module Api
74
60
  }.merge(locals))
75
61
 
76
62
  schema_json = jbuilder.json(
77
- model.new,
63
+ FactoryBot.example(model.model_name.param_key.to_sym) || model.new,
78
64
  title: I18n.t("#{model.name.underscore.pluralize}.label"),
79
65
  # TODO Improve this. We don't have a generic description for models we can use here.
80
66
  description: I18n.t("#{model.name.underscore.pluralize}.label"),
@@ -106,7 +92,8 @@ module Api
106
92
 
107
93
  parameters_output = JSON.parse(schema_json)
108
94
  parameters_output["required"].select! { |key| strong_parameter_keys.include?(key.to_sym) }
109
- parameters_output["properties"].select! { |key, value| strong_parameter_keys.include?(key.to_sym) }
95
+ parameters_output["properties"].select! { |key| strong_parameter_keys.include?(key.to_sym) }
96
+ parameters_output["example"]&.select! { |key, value| strong_parameter_keys.include?(key.to_sym) && value.present? }
110
97
 
111
98
  (
112
99
  indent(attributes_output.to_yaml.gsub("---", "#{model.name.gsub("::", "")}Attributes:"), 3) +
@@ -12,7 +12,7 @@
12
12
  in: path
13
13
  required: true
14
14
  schema:
15
- type: string
15
+ type: integer
16
16
  - $ref: "#/components/parameters/after"
17
17
  responses:
18
18
  "404":
@@ -31,7 +31,7 @@
31
31
  items:
32
32
  $ref: "#/components/schemas/ScaffoldingCompletelyConcreteTangibleThingAttributes"
33
33
  example:
34
- 🚅 get_example
34
+ 🚅 get_examples
35
35
  <% end %>
36
36
  <% unless except.include?(:create) %>
37
37
  post:
@@ -44,7 +44,7 @@
44
44
  in: path
45
45
  required: true
46
46
  schema:
47
- type: string
47
+ type: integer
48
48
  requestBody:
49
49
  description: "Information about a new Tangible Thing"
50
50
  required: true
@@ -68,7 +68,7 @@
68
68
  schema:
69
69
  $ref: "#/components/schemas/ScaffoldingCompletelyConcreteTangibleThingAttributes"
70
70
  example:
71
- 🚅 post_examples
71
+ 🚅 post_example
72
72
  <% end %>
73
73
  <% end %>
74
74
  <% unless except.include?(:show) && except.include?(:update) && except.include?(:destroy) %>
@@ -39,7 +39,9 @@ module FactoryBot
39
39
  objects
40
40
  end
41
41
 
42
- %i[get_examples get_example post_examples post_parameters put_example put_parameters patch_example patch_parameters].each do |method|
42
+ REST_METHODS = %i[get_examples get_example post_example post_parameters put_example put_parameters patch_example patch_parameters]
43
+
44
+ REST_METHODS.each do |method|
43
45
  define_method(method) do |model, **options|
44
46
  _path_examples(method.to_s, model, **options)
45
47
  end
@@ -53,6 +55,8 @@ module FactoryBot
53
55
  end
54
56
 
55
57
  def reset_tables!
58
+ # This is only availble for postgres
59
+ return unless ActiveRecord::Base.connection.respond_to?(:reset_pk_sequence!)
56
60
  @tables_to_reset.each do |name|
57
61
  ActiveRecord::Base.connection.reset_pk_sequence!(name) if ActiveRecord::Base.connection.table_exists?(name)
58
62
  end
@@ -67,8 +71,17 @@ module FactoryBot
67
71
  clone.send("#{name}=", associations)
68
72
  @tables_to_reset << name
69
73
  elsif %i[belongs_to has_one].include?(reflection.macro)
70
- clone.send("#{name}=", instance.send(name).clone)
71
- @tables_to_reset << name.pluralize
74
+ # Calling e.g. address.team= throws an error,
75
+ # if address has_one team through person
76
+ # and person has_one team through company
77
+ # and company belongs_to team
78
+ # so the resulting error will be caught here and a warning logged.
79
+ begin
80
+ clone.send("#{name}=", instance.send(name).clone)
81
+ @tables_to_reset << name.pluralize
82
+ rescue ActiveRecord::HasOneThroughNestedAssociationsAreReadonly
83
+ Rails.logger.warn("ExampleBot.deep_clone ignored setting #{name} of #{instance}")
84
+ end
72
85
  end
73
86
  end
74
87
 
@@ -86,7 +99,7 @@ module FactoryBot
86
99
  else
87
100
  template, class_name, var_name, values = _set_values("get_example", model)
88
101
 
89
- unless %w[example examples].include?(method.split("_").last)
102
+ if method.end_with?("parameters")
90
103
  if has_strong_parameters?("::Api::#{version.upcase}::#{class_name.pluralize}Controller".constantize)
91
104
  strong_params_module = "::Api::#{version.upcase}::#{class_name.pluralize}Controller::StrongParameters".constantize
92
105
  strong_parameter_keys = BulletTrain::Api::StrongParametersReporter.new(class_name.constantize, strong_params_module).report
@@ -99,6 +112,9 @@ module FactoryBot
99
112
  parameters_output = JSON.parse(output)
100
113
  parameters_output&.select! { |key| strong_parameter_keys.include?(key.to_sym) }
101
114
 
115
+ # Wrapping the example as parameters should be wrapped with the model name:
116
+ parameters_output = {model.to_s => parameters_output}
117
+
102
118
  return indent(parameters_output.to_yaml.delete_prefix("---\n"), 6).html_safe
103
119
  end
104
120
  return nil
@@ -1,5 +1,5 @@
1
1
  module BulletTrain
2
2
  module Api
3
- VERSION = "1.3.12"
3
+ VERSION = "1.3.14"
4
4
  end
5
5
  end
@@ -14,6 +14,7 @@ require "scaffolding"
14
14
  require "scaffolding/block_manipulator"
15
15
  require "scaffolding/transformer"
16
16
  require "jbuilder/schema"
17
+ require "jbuilder/values_transformer"
17
18
 
18
19
  module BulletTrain
19
20
  module Api
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "jbuilder"
4
+
5
+ module ValuesTransformer
6
+ def _set_value(key, value)
7
+ value = value.body if value.is_a?(ActionText::RichText)
8
+
9
+ super(key, value)
10
+ end
11
+ end
12
+
13
+ ::Jbuilder.prepend ValuesTransformer
@@ -128,5 +128,21 @@ namespace :bullet_train do
128
128
  puts "Failed to download the OpenAPI Document. Status code: #{response.status}"
129
129
  end
130
130
  end
131
+
132
+ desc "Export the OpenAPI schema for the application"
133
+ task export_openapi_schema: :environment do
134
+ @version = BulletTrain::Api.current_version
135
+ File.open("openapi-#{Time.now.strftime("%Y%m%d-%H%M%S")}.yaml", "w+") do |f|
136
+ f.binmode
137
+ f.write(
138
+ ApplicationController.renderer.render(
139
+ template: "api/#{@version}/open_api/index",
140
+ layout: false,
141
+ format: :text,
142
+ assigns: {version: @version}
143
+ )
144
+ )
145
+ end
146
+ end
131
147
  end
132
148
  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.3.12
4
+ version: 1.3.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Culver
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-23 00:00:00.000000000 Z
11
+ date: 2023-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: standard
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - ">="
102
102
  - !ruby/object:Gem::Version
103
- version: 2.0.0
103
+ version: 2.2.0
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
- version: 2.0.0
110
+ version: 2.2.0
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: factory_bot
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -212,6 +212,7 @@ files:
212
212
  - lib/bullet_train/api/version.rb
213
213
  - lib/bullet_train/platform.rb
214
214
  - lib/bullet_train/platform/connection_workflow.rb
215
+ - lib/jbuilder/values_transformer.rb
215
216
  - lib/tasks/bullet_train/api_tasks.rake
216
217
  - lib/tokens_controller.rb
217
218
  homepage: https://github.com/bullet-train-co/bullet_train-core/tree/main/bullet_train-api