betterdocs 0.8.0 → 0.9.1

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: 7324105b58e4926bdbcec0e372efda88e523c1c31fb4f0181e9d4cebc94b135c
4
- data.tar.gz: 6926a2ea9814cae5e763113badf138104f2fd9ae250c57e9cc8a16fb6eb18d43
3
+ metadata.gz: 0ade3c403e3b64e631aa874f8a041faa0060b271d7140f3e3b8651774ea68531
4
+ data.tar.gz: 8d0bd97c440253344047b7ee3a8ae27ba6c6d6f81e77b63399e25a69a5dbbee3
5
5
  SHA512:
6
- metadata.gz: ccaab04fbb9dfc351d79b9b722d1430c1a8afc5007f3f8bfd68d2d7d1c06ab4d26cf843e745750d1eb805b3d83122fb6b48597a8c1a3bc127fee5bc95e43443e
7
- data.tar.gz: 67968de292f5c9e0d17b0d2669d72ca75f1e6d709ea219de4f36beab3b99e14452dfa626ff4cb0fe6222419ba99e19f3be4f4765242dbd8d9f0622839d150cf9
6
+ metadata.gz: c0b80edb3b5fab827daa3630a53facaa5114604bd9e1ee7ed1618c28e7cbb8c7ba29068a148932a0510dc66295902ce0105fc14bfb6d861a0f559398cc4f121f
7
+ data.tar.gz: 20ec168d448cfec1c6bbed09ed30ef22fd8beeb9ec8c2a281f6da31594e900c755e80c285fd5cfb5669945d6ecf22c34814047c2a3ac4a1c0008128ee3c84da5
@@ -3,7 +3,7 @@ name: Betterdocs pipeline
3
3
  agent:
4
4
  machine:
5
5
  type: e1-standard-2
6
- os_image: ubuntu1804
6
+ os_image: ubuntu2004
7
7
 
8
8
  blocks:
9
9
  - name: "Unit Tests"
data/.tool-versions CHANGED
@@ -1 +1,2 @@
1
- ruby 3.0.1
1
+ ruby 3.0.4
2
+ bundler 2.3.8
data/README.md CHANGED
@@ -22,88 +22,92 @@ This api generator requires that you follow the [representer pattern](http://nic
22
22
 
23
23
  ## Controller
24
24
 
25
- class ThingsController < ApplicationController
26
- # :nocov: Documentation
27
- doc :action do
28
- section :things_list
29
- title 'A List of things ⇄ [Details](things_details.md)'
30
- description to <<-end
31
- This action shows a list of things. **Markdown** can be used.
32
- end
33
-
34
- param :order do
35
- description to <<-end
36
- Optional parameter to order the list.
37
- end
38
- required no
39
- value 'created_at:ASC'
40
- end
41
-
42
- response do
43
- generate_fake_result_with_representer
44
- end
45
- end
46
- # :nocov:
47
- def index
48
- render json: real_result_with_representer
49
- end
25
+ ```ruby
26
+ class ThingsController < ApplicationController
27
+ # :nocov: Documentation
28
+ doc :action do
29
+ section :things_list
30
+ title 'A List of things ⇄ [Details](things_details.md)'
31
+ description to <<-end
32
+ This action shows a list of things. **Markdown** can be used.
33
+ end
50
34
 
51
- # :nocov: Documentation
52
- doc :action do
53
- section :things_details
54
- title 'Things Details ⇄ [List](things_list.md)'
55
- description to <<-end
56
- The details of a thing. You must give an id for the thing
57
- end
58
-
59
- param :thing_id do
60
- description 'The id of the thing you want to see. Required.'
61
- required yes # this is the default
62
- value 38
63
- end
64
-
65
- response do
66
- generate_fake_details_response_with_representer
67
- end
68
- end
69
- # :nocov:
70
- def show
71
- render json: real_result_with_representer
35
+ param :order do
36
+ description to <<-end
37
+ Optional parameter to order the list.
72
38
  end
39
+ required no
40
+ value 'created_at:ASC'
41
+ end
42
+
43
+ response do
44
+ generate_fake_result_with_representer
45
+ end
46
+ end
47
+ # :nocov:
48
+ def index
49
+ render json: real_result_with_representer
50
+ end
51
+
52
+ # :nocov: Documentation
53
+ doc :action do
54
+ section :things_details
55
+ title 'Things Details ⇄ [List](things_list.md)'
56
+ description to <<-end
57
+ The details of a thing. You must give an id for the thing
58
+ end
59
+
60
+ param :thing_id do
61
+ description 'The id of the thing you want to see. Required.'
62
+ required yes # this is the default
63
+ value 38
64
+ end
65
+
66
+ response do
67
+ generate_fake_details_response_with_representer
73
68
  end
69
+ end
70
+ # :nocov:
71
+ def show
72
+ render json: real_result_with_representer
73
+ end
74
+ end
75
+ ```
74
76
 
75
77
  ## Representer
76
78
 
77
79
  Betterdocs comes with its own representer class. It is not documented
78
80
  yet but works kind of like [ROAR](https://github.com/apotonick/roar).
79
81
 
80
- module ThingsRepresenter
81
-
82
- extend ActiveSupport::Concern
83
- include Betterdocs::Representer
82
+ ```ruby
83
+ module ThingsRepresenter
84
84
 
85
- property :microfleem_count, if: -> { has_microfleems? }, as: :number_of_fleems do
86
- description 'If we have microfleems, return the count'
87
- types Integer
88
- example '5000'
89
- end
85
+ extend ActiveSupport::Concern
86
+ include Betterdocs::Representer
90
87
 
91
- property :title, as: :name do
92
- description to <<-end
93
- Represent the internal field "title" as the name of the thing
94
- end
95
- types String
96
- example 'my_name'
97
- end
88
+ property :microfleem_count, if: -> { has_microfleems? }, as: :number_of_fleems do
89
+ description 'If we have microfleems, return the count'
90
+ types Integer
91
+ example '5000'
92
+ end
98
93
 
99
- link :self do
100
- description to <<-end
101
- Link to this resource itself
102
- (<a href="opinion_details.md">things details</a>)
103
- end
104
- url { thing_url(id) }
105
- end
94
+ property :title, as: :name do
95
+ description to <<-end
96
+ Represent the internal field "title" as the name of the thing
97
+ end
98
+ types String
99
+ example 'my_name'
100
+ end
101
+
102
+ link :self do
103
+ description to <<-end
104
+ Link to this resource itself
105
+ (<a href="opinion_details.md">things details</a>)
106
106
  end
107
+ url { thing_url(id) }
108
+ end
109
+ end
110
+ ```
107
111
 
108
112
  AUTHORS
109
113
  -------
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.0
1
+ 0.9.1
data/betterdocs.gemspec CHANGED
@@ -1,21 +1,21 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: betterdocs 0.8.0 ruby lib
2
+ # stub: betterdocs 0.9.1 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "betterdocs".freeze
6
- s.version = "0.8.0"
6
+ s.version = "0.9.1"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["betterplace Developers".freeze]
11
- s.date = "2021-07-07"
11
+ s.date = "2022-07-14"
12
12
  s.description = "This library provides tools to generate API documention for a web site's REST-ful JSON API.".freeze
13
13
  s.email = "developers@betterplace.org".freeze
14
14
  s.extra_rdoc_files = ["README.md".freeze, "lib/betterdocs.rb".freeze, "lib/betterdocs/controller_collector.rb".freeze, "lib/betterdocs/dsl.rb".freeze, "lib/betterdocs/dsl/common.rb".freeze, "lib/betterdocs/dsl/controller.rb".freeze, "lib/betterdocs/dsl/controller/action.rb".freeze, "lib/betterdocs/dsl/controller/action/param.rb".freeze, "lib/betterdocs/dsl/controller/action/response.rb".freeze, "lib/betterdocs/dsl/controller/controller.rb".freeze, "lib/betterdocs/dsl/controller/controller_base.rb".freeze, "lib/betterdocs/dsl/json_params.rb".freeze, "lib/betterdocs/dsl/json_params/param.rb".freeze, "lib/betterdocs/dsl/json_type_mapper.rb".freeze, "lib/betterdocs/dsl/naming.rb".freeze, "lib/betterdocs/dsl/representer.rb".freeze, "lib/betterdocs/dsl/result.rb".freeze, "lib/betterdocs/dsl/result/collection_property.rb".freeze, "lib/betterdocs/dsl/result/link.rb".freeze, "lib/betterdocs/dsl/result/property.rb".freeze, "lib/betterdocs/generator/config_shortcuts.rb".freeze, "lib/betterdocs/generator/markdown.rb".freeze, "lib/betterdocs/generator/swagger.rb".freeze, "lib/betterdocs/global.rb".freeze, "lib/betterdocs/json_params_representer.rb".freeze, "lib/betterdocs/json_params_representer_collector.rb".freeze, "lib/betterdocs/json_time_with_zone.rb".freeze, "lib/betterdocs/mix_into_controller.rb".freeze, "lib/betterdocs/railtie.rb".freeze, "lib/betterdocs/rake_tasks.rb".freeze, "lib/betterdocs/representer.rb".freeze, "lib/betterdocs/result_representer.rb".freeze, "lib/betterdocs/result_representer_collector.rb".freeze, "lib/betterdocs/sanitizer.rb".freeze, "lib/betterdocs/section.rb".freeze, "lib/betterdocs/version.rb".freeze]
15
15
  s.files = [".codeclimate.yml".freeze, ".gitignore".freeze, ".rspec".freeze, ".semaphore/semaphore.yml".freeze, ".tool-versions".freeze, ".vscode/settings.json".freeze, "COPYING".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "betterdocs.gemspec".freeze, "lib/betterdocs.rb".freeze, "lib/betterdocs/controller_collector.rb".freeze, "lib/betterdocs/dsl.rb".freeze, "lib/betterdocs/dsl/common.rb".freeze, "lib/betterdocs/dsl/controller.rb".freeze, "lib/betterdocs/dsl/controller/action.rb".freeze, "lib/betterdocs/dsl/controller/action/param.rb".freeze, "lib/betterdocs/dsl/controller/action/response.rb".freeze, "lib/betterdocs/dsl/controller/controller.rb".freeze, "lib/betterdocs/dsl/controller/controller_base.rb".freeze, "lib/betterdocs/dsl/json_params.rb".freeze, "lib/betterdocs/dsl/json_params/param.rb".freeze, "lib/betterdocs/dsl/json_type_mapper.rb".freeze, "lib/betterdocs/dsl/naming.rb".freeze, "lib/betterdocs/dsl/representer.rb".freeze, "lib/betterdocs/dsl/result.rb".freeze, "lib/betterdocs/dsl/result/collection_property.rb".freeze, "lib/betterdocs/dsl/result/link.rb".freeze, "lib/betterdocs/dsl/result/property.rb".freeze, "lib/betterdocs/generator/config_shortcuts.rb".freeze, "lib/betterdocs/generator/markdown.rb".freeze, "lib/betterdocs/generator/markdown/templates/README.md.erb".freeze, "lib/betterdocs/generator/markdown/templates/section.md.erb".freeze, "lib/betterdocs/generator/swagger.rb".freeze, "lib/betterdocs/generator/swagger_static/index.html".freeze, "lib/betterdocs/global.rb".freeze, "lib/betterdocs/json_params_representer.rb".freeze, "lib/betterdocs/json_params_representer_collector.rb".freeze, "lib/betterdocs/json_time_with_zone.rb".freeze, "lib/betterdocs/mix_into_controller.rb".freeze, "lib/betterdocs/railtie.rb".freeze, "lib/betterdocs/rake_tasks.rb".freeze, "lib/betterdocs/representer.rb".freeze, "lib/betterdocs/result_representer.rb".freeze, "lib/betterdocs/result_representer_collector.rb".freeze, "lib/betterdocs/sanitizer.rb".freeze, "lib/betterdocs/section.rb".freeze, "lib/betterdocs/tasks/doc.rake".freeze, "lib/betterdocs/version.rb".freeze, "spec/assets/app/assets/images/logos/logo.png".freeze, "spec/assets/app/controllers/api/foos_controller.rb".freeze, "spec/assets/app/views/api_v4/documentation/assets/CHANGELOG.md".freeze, "spec/assets/config/betterdocs.yml".freeze, "spec/betterdocs/dsl/controller/action/param_spec.rb".freeze, "spec/betterdocs/dsl/controller/action/response_spec.rb".freeze, "spec/betterdocs/dsl/json_type_mapper_spec.rb".freeze, "spec/betterdocs/dsl/result/collection_property_spec.rb".freeze, "spec/betterdocs/dsl/result/link_spec.rb".freeze, "spec/betterdocs/dsl/result/property_spec.rb".freeze, "spec/betterdocs/generator/markdown_spec.rb".freeze, "spec/betterdocs/global_spec.rb".freeze, "spec/betterdocs/json_params_representer_spec.rb".freeze, "spec/betterdocs/result_representer_spec.rb".freeze, "spec/betterdocs/sanitizer_spec.rb".freeze, "spec/controller_dsl_spec.rb".freeze, "spec/result_representer_dsl_spec.rb".freeze, "spec/spec_helper.rb".freeze]
16
16
  s.homepage = "http://github.com/betterplace/betterdocs".freeze
17
17
  s.rdoc_options = ["--title".freeze, "Betterdocs".freeze, "--main".freeze, "README.md".freeze]
18
- s.rubygems_version = "3.2.15".freeze
18
+ s.rubygems_version = "3.3.14".freeze
19
19
  s.summary = "Betterplace API documentation library".freeze
20
20
  s.test_files = ["spec/assets/app/controllers/api/foos_controller.rb".freeze, "spec/betterdocs/dsl/controller/action/param_spec.rb".freeze, "spec/betterdocs/dsl/controller/action/response_spec.rb".freeze, "spec/betterdocs/dsl/json_type_mapper_spec.rb".freeze, "spec/betterdocs/dsl/result/collection_property_spec.rb".freeze, "spec/betterdocs/dsl/result/link_spec.rb".freeze, "spec/betterdocs/dsl/result/property_spec.rb".freeze, "spec/betterdocs/generator/markdown_spec.rb".freeze, "spec/betterdocs/global_spec.rb".freeze, "spec/betterdocs/json_params_representer_spec.rb".freeze, "spec/betterdocs/result_representer_spec.rb".freeze, "spec/betterdocs/sanitizer_spec.rb".freeze, "spec/controller_dsl_spec.rb".freeze, "spec/result_representer_dsl_spec.rb".freeze, "spec/spec_helper.rb".freeze]
21
21
 
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
24
24
  end
25
25
 
26
26
  if s.respond_to? :add_runtime_dependency then
27
- s.add_development_dependency(%q<gem_hadar>.freeze, ["~> 1.11.0"])
27
+ s.add_development_dependency(%q<gem_hadar>.freeze, ["~> 1.12.0"])
28
28
  s.add_development_dependency(%q<rake>.freeze, [">= 0"])
29
29
  s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
30
30
  s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
@@ -35,7 +35,7 @@ Gem::Specification.new do |s|
35
35
  s.add_runtime_dependency(%q<infobar>.freeze, [">= 0"])
36
36
  s.add_runtime_dependency(%q<mize>.freeze, [">= 0"])
37
37
  else
38
- s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.11.0"])
38
+ s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.12.0"])
39
39
  s.add_dependency(%q<rake>.freeze, [">= 0"])
40
40
  s.add_dependency(%q<simplecov>.freeze, [">= 0"])
41
41
  s.add_dependency(%q<rspec>.freeze, [">= 0"])
@@ -18,6 +18,8 @@ class Betterdocs::Dsl::Result::Property < Betterdocs::Dsl::Representer
18
18
 
19
19
  dsl_accessor :types
20
20
 
21
+ dsl_accessor :optional
22
+
21
23
  dsl_accessor :sanitize do Betterdocs::Global.default_sanitize end
22
24
 
23
25
  def initialize(representer, name, options, &block)
@@ -10,7 +10,7 @@ module Betterdocs
10
10
  end
11
11
 
12
12
  def sections
13
- Dir[config.api_controllers.to_s].each(&method(:load))
13
+ config.api_controllers.each(&method(:load))
14
14
  config.sections
15
15
  end
16
16
 
@@ -39,7 +39,7 @@ module Betterdocs
39
39
  Betterdocs.rails.configuration.action_controller.asset_host = Betterdocs::Global.asset_host
40
40
  options = {
41
41
  host: Betterdocs::Global.api_host,
42
- protocol: Betterdocs::Global.api_protocol,
42
+ protocol: Betterdocs::Global.api_protocol
43
43
  }
44
44
  infobar.puts color(40, "Setting default_url_options to #{options.inspect}.")
45
45
  Betterdocs.rails.application.routes.default_url_options = options
@@ -58,7 +58,7 @@ module Betterdocs
58
58
  sections.values.each do |section|
59
59
  infobar.progress(
60
60
  message: " Section #{section.name.to_s.inspect} %c/%t in %te ETA %e @%E ",
61
- force: true,
61
+ force: true
62
62
  )
63
63
  @only =~ section.name or next if @only
64
64
 
@@ -74,7 +74,7 @@ module Betterdocs
74
74
  config.each_swagger_asset do |src, dst|
75
75
  infobar.progress(
76
76
  message: " Asset #{File.basename(src).inspect} %c/%t in %te ETA %e @%E ",
77
- force: true,
77
+ force: true
78
78
  )
79
79
  mkdir_p File.dirname(dst)
80
80
  cp Betterdocs.rails.root.join(src), dst
@@ -125,9 +125,9 @@ module Betterdocs
125
125
  offset: { type: 'integer' },
126
126
  total_pages: { type: 'integer' },
127
127
  current_page: { type: 'integer' },
128
- per_page: { type: 'integer' },
128
+ per_page: { type: 'integer' }
129
129
  },
130
- required: %w[total_entries offset current_page per_page total_pages data],
130
+ required: %w[total_entries offset current_page per_page total_pages data]
131
131
  }
132
132
  end
133
133
 
@@ -159,9 +159,9 @@ module Betterdocs
159
159
  backtrace: { type: 'array', items: { type: 'string' } },
160
160
  message: { type: 'string' },
161
161
  errors: { type: 'object' },
162
- links: { type: 'array', items: { type: 'string' } },
162
+ links: { type: 'array', items: { type: 'string' } }
163
163
  },
164
- required: %w[name status status_code reason backtrace message links],
164
+ required: %w[name status status_code reason backtrace message links]
165
165
  }
166
166
  end
167
167
 
@@ -198,7 +198,7 @@ module Betterdocs
198
198
  def get_request_definition(params)
199
199
  schema = { type: 'object', properties: {}, required: [] }
200
200
  params.each do |param|
201
- schema[:properties][param.name] = get_schema(param.types, nil, param.description)
201
+ schema[:properties][param.name] = get_schema(param.types, nil, param.description, nil)
202
202
  schema[:required].push(param.name) if param.required == true || param.required == 'yes'
203
203
  end
204
204
  schema
@@ -237,10 +237,10 @@ module Betterdocs
237
237
  description.include?('DEPRECATED')
238
238
  end
239
239
 
240
- def get_schema(types, sub_cls, description)
240
+ def get_schema(types, sub_cls, description, optional)
241
241
  type, nullable = get_type(types)
242
242
  deprecated = get_deprecated_from_description(description)
243
- res = { description: description, type: type, nullable: nullable, deprecated: deprecated }
243
+ res = { description: description, type: type, nullable: nullable, deprecated: deprecated, optional: optional }
244
244
  case type
245
245
  when 'array'
246
246
  items = { type: 'string' }
@@ -269,9 +269,10 @@ module Betterdocs
269
269
  properties: {
270
270
  rel: { type: 'string', enum: [] },
271
271
  href: { type: 'string' },
272
+ templated: { type: 'boolean' }
272
273
  },
273
- required: %w[rel href],
274
- },
274
+ required: %w[rel href]
275
+ }
275
276
  }
276
277
  enum = definition[:properties][:links][:items][:properties][:rel][:enum]
277
278
  enum.push(value) unless enum.include?(value)
@@ -291,7 +292,8 @@ module Betterdocs
291
292
  sub_cls = get_dto_name(subs[p.nesting_name])
292
293
  cls = sub_cls || resp_cls
293
294
  definition = initialise_definition(definitions, cls)
294
- definition[:properties][p.public_name] = get_schema(p.types, get_dto_name(p.sub_representer?), p.description)
295
+ definition[:properties][p.public_name] =
296
+ get_schema(p.types, get_dto_name(p.sub_representer?), p.description, p.optional)
295
297
  end
296
298
  (response.full?(:links) || []).each do |l|
297
299
  sub_cls = get_dto_name(subs[l.nesting_name])
@@ -302,13 +304,16 @@ module Betterdocs
302
304
 
303
305
  def get_schema_ref(name)
304
306
  {
305
- "$ref": "#/components/schemas/#{name}",
307
+ "$ref": "#/components/schemas/#{name}"
306
308
  }
307
309
  end
308
310
 
309
311
  def add_required_to_definitions(definitions)
310
312
  definitions.each do |def_key, d|
311
- req = d[:properties].select { |_k, v| v.key?(:nullable) }.keys
313
+ req = d[:properties].select { |_k, v| v.key?(:nullable) && !v[:optional] }.keys
314
+ d[:properties].each do |p|
315
+ p.delete(:optional)
316
+ end
312
317
  definitions[def_key][:required] = req unless req.empty?
313
318
  end
314
319
  end
@@ -1,6 +1,6 @@
1
1
  module Betterdocs
2
2
  # Betterdocs version
3
- VERSION = '0.8.0'
3
+ VERSION = '0.9.1'
4
4
  VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc:
5
5
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
6
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: betterdocs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - betterplace Developers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-07 00:00:00.000000000 Z
11
+ date: 2022-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gem_hadar
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.11.0
19
+ version: 1.12.0
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.11.0
26
+ version: 1.12.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -297,7 +297,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
297
297
  - !ruby/object:Gem::Version
298
298
  version: '0'
299
299
  requirements: []
300
- rubygems_version: 3.2.15
300
+ rubygems_version: 3.3.14
301
301
  signing_key:
302
302
  specification_version: 4
303
303
  summary: Betterplace API documentation library