sober_swag 0.17.0 → 0.21.0

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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +15 -0
  3. data/.github/workflows/benchmark.yml +39 -0
  4. data/.github/workflows/lint.yml +2 -4
  5. data/.github/workflows/ruby.yml +1 -1
  6. data/.gitignore +3 -0
  7. data/.rubocop.yml +5 -1
  8. data/.yardopts +7 -0
  9. data/CHANGELOG.md +21 -0
  10. data/Gemfile +12 -0
  11. data/README.md +1 -1
  12. data/bench/benchmark.rb +34 -0
  13. data/bench/benchmarks/basic_field_serializer.rb +21 -0
  14. data/bench/benchmarks/view_selection.rb +47 -0
  15. data/docs/serializers.md +4 -1
  16. data/example/Gemfile +2 -2
  17. data/example/Gemfile.lock +46 -44
  18. data/example/config/environments/production.rb +1 -1
  19. data/lib/sober_swag/compiler/path.rb +42 -3
  20. data/lib/sober_swag/compiler/paths.rb +20 -0
  21. data/lib/sober_swag/compiler/primitive.rb +20 -1
  22. data/lib/sober_swag/compiler/type.rb +105 -22
  23. data/lib/sober_swag/compiler.rb +29 -3
  24. data/lib/sober_swag/controller/route.rb +103 -20
  25. data/lib/sober_swag/controller.rb +39 -12
  26. data/lib/sober_swag/input_object.rb +124 -7
  27. data/lib/sober_swag/nodes/array.rb +19 -0
  28. data/lib/sober_swag/nodes/attribute.rb +45 -4
  29. data/lib/sober_swag/nodes/base.rb +27 -7
  30. data/lib/sober_swag/nodes/binary.rb +30 -13
  31. data/lib/sober_swag/nodes/enum.rb +16 -1
  32. data/lib/sober_swag/nodes/list.rb +20 -0
  33. data/lib/sober_swag/nodes/nullable_primitive.rb +3 -0
  34. data/lib/sober_swag/nodes/object.rb +4 -1
  35. data/lib/sober_swag/nodes/one_of.rb +11 -3
  36. data/lib/sober_swag/nodes/primitive.rb +34 -2
  37. data/lib/sober_swag/nodes/sum.rb +8 -0
  38. data/lib/sober_swag/output_object/definition.rb +57 -1
  39. data/lib/sober_swag/output_object/field.rb +31 -11
  40. data/lib/sober_swag/output_object/field_syntax.rb +19 -3
  41. data/lib/sober_swag/output_object/view.rb +46 -1
  42. data/lib/sober_swag/output_object.rb +40 -19
  43. data/lib/sober_swag/parser.rb +7 -1
  44. data/lib/sober_swag/serializer/array.rb +27 -3
  45. data/lib/sober_swag/serializer/base.rb +75 -25
  46. data/lib/sober_swag/serializer/conditional.rb +33 -1
  47. data/lib/sober_swag/serializer/field_list.rb +23 -5
  48. data/lib/sober_swag/serializer/hash.rb +53 -0
  49. data/lib/sober_swag/serializer/mapped.rb +10 -1
  50. data/lib/sober_swag/serializer/optional.rb +18 -1
  51. data/lib/sober_swag/serializer/primitive.rb +3 -0
  52. data/lib/sober_swag/serializer.rb +1 -0
  53. data/lib/sober_swag/server.rb +27 -11
  54. data/lib/sober_swag/type/named.rb +14 -0
  55. data/lib/sober_swag/types/comma_array.rb +4 -0
  56. data/lib/sober_swag/version.rb +1 -1
  57. data/lib/sober_swag.rb +6 -1
  58. metadata +9 -2
@@ -4,6 +4,9 @@ module SoberSwag
4
4
  # A class that does *no* serialization: you give it a type,
5
5
  # and it will pass any serialized input on verbatim.
6
6
  class Primitive < Base
7
+ ##
8
+ # Construct a primitive serializer with a description of the type it serializes to.
9
+ # @param type [Class] a swagger-able type
7
10
  def initialize(type)
8
11
  @type = type
9
12
  end
@@ -10,6 +10,7 @@ module SoberSwag
10
10
  autoload(:Mapped, 'sober_swag/serializer/mapped')
11
11
  autoload(:Optional, 'sober_swag/serializer/optional')
12
12
  autoload(:FieldList, 'sober_swag/serializer/field_list')
13
+ autoload(:Hash, 'sober_swag/serializer/hash')
13
14
  autoload(:Meta, 'sober_swag/serializer/meta')
14
15
 
15
16
  class << self
@@ -21,42 +21,58 @@ module SoberSwag
21
21
  # Start up.
22
22
  #
23
23
  # @param controller_proc [Proc] a proc that, when called, gives a list of {SoberSwag::Controller}s to document
24
- # @param cache [Bool | Proc] if we should cache our defintions (default false)
24
+ # @param cache [Bool | Proc] if we should cache our definitions (default false)
25
+ # @param redoc_version [String] what version of the redoc library to use to display UI (default 'next', the latest version).
25
26
  def initialize(
26
27
  controller_proc: RAILS_CONTROLLER_PROC,
27
- cache: false
28
+ cache: false,
29
+ redoc_version: 'next'
28
30
  )
29
31
  @controller_proc = controller_proc
30
32
  @cache = cache
33
+ @html = EFFECT_HTML.gsub(/REDOC_VERSION/, redoc_version)
31
34
  end
32
35
 
33
36
  EFFECT_HTML = <<~HTML.freeze
34
37
  <!DOCTYPE html>
35
38
  <html>
36
39
  <head>
37
- <title>Swagger-UI</title>
38
- <script src="https://unpkg.com/swagger-ui-dist@3/swagger-ui-bundle.js"></script>
39
- <link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@3.23.4/swagger-ui.css"></link>
40
+ <title>ReDoc</title>
41
+ <!-- needed for adaptive design -->
42
+ <meta charset="utf-8"/>
43
+ <meta name="viewport" content="width=device-width, initial-scale=1">
44
+ <link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet">
45
+
46
+ <!--
47
+ ReDoc doesn't change outer page styles
48
+ -->
49
+ <style>
50
+ body {
51
+ margin: 0;
52
+ padding: 0;
53
+ }
54
+ </style>
40
55
  </head>
41
56
  <body>
42
- <div id="swagger">
43
- </div>
44
- <script>
45
- SwaggerUIBundle({url: 'SCRIPT_NAME', dom_id: '#swagger'})
46
- </script>
57
+ <redoc spec-url='SCRIPT_NAME'></redoc>
58
+ <script src="https://cdn.jsdelivr.net/npm/redoc@REDOC_VERSION/bundles/redoc.standalone.js"> </script>
47
59
  </body>
48
60
  </html>
49
61
  HTML
50
62
 
63
+ ##
64
+ # Standard Rack call method.
51
65
  def call(env)
52
66
  req = Rack::Request.new(env)
53
67
  if req.path_info&.match?(/json/si) || req.get_header('Accept')&.match?(/json/si)
54
68
  [200, { 'Content-Type' => 'application/json' }, [generate_json_string]]
55
69
  else
56
- [200, { 'Content-Type' => 'text/html' }, [EFFECT_HTML.gsub(/SCRIPT_NAME/, env['SCRIPT_NAME'] + '.json')]]
70
+ [200, { 'Content-Type' => 'text/html' }, [@html.gsub(/SCRIPT_NAME/, "#{env['SCRIPT_NAME']}.json")]]
57
71
  end
58
72
  end
59
73
 
74
+ private
75
+
60
76
  def generate_json_string
61
77
  if cache?
62
78
  @json_string ||= JSON.dump(generate_swagger)
@@ -9,24 +9,38 @@ module SoberSwag
9
9
  # Modules that include {SoberSwag::Type::Named}
10
10
  # will automatically extend this module.
11
11
  module ClassMethods
12
+ ##
13
+ # Is this type a "wrapper" for another type?
12
14
  def alias?
13
15
  false
14
16
  end
15
17
 
18
+ ##
19
+ # The type this type is a wrapper for
16
20
  def alias_of
17
21
  nil
18
22
  end
19
23
 
24
+ ##
25
+ # The "root" type along the alias chain
20
26
  def root_alias
21
27
  alias_of || self
22
28
  end
23
29
 
30
+ ##
31
+ # @overload description()
32
+ # @return [String] a human-readable description of this type
33
+ # @overload description(arg)
34
+ # @param arg [String] a human-readable description of this type
35
+ # @return [String] `arg`
24
36
  def description(arg = nil)
25
37
  @description = arg if arg
26
38
  @description
27
39
  end
28
40
  end
29
41
 
42
+ ##
43
+ # When included, extends {SoberSwag::Type::Named::ClassMethods}
30
44
  def self.included(mod)
31
45
  mod.extend(ClassMethods)
32
46
  end
@@ -3,6 +3,10 @@ module SoberSwag
3
3
  ##
4
4
  # An array that will be parsed from comma-separated values in a string, if given a string.
5
5
  module CommaArray
6
+ ##
7
+ # Get a parser that will parse comma-separated values of another type.
8
+ # @param other [Class] a swagger-able type to parse into
9
+ # @return [SoberSwag::Types::CommaArray]
6
10
  def self.of(other)
7
11
  SoberSwag::Types::Array.of(other).constructor { |val|
8
12
  if val.is_a?(::String)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SoberSwag
4
- VERSION = '0.17.0'
4
+ VERSION = '0.21.0'
5
5
  end
data/lib/sober_swag.rb CHANGED
@@ -9,8 +9,10 @@ require 'sober_swag/version'
9
9
  require 'active_support/inflector'
10
10
 
11
11
  ##
12
- # Root namespace
12
+ # Root namespace for the SoberSwag Module.
13
13
  module SoberSwag
14
+ ##
15
+ # Root Error Class for SoberSwag errors.
14
16
  class Error < StandardError; end
15
17
 
16
18
  autoload :Parser, 'sober_swag/parser'
@@ -26,7 +28,10 @@ module SoberSwag
26
28
  ##
27
29
  # Define a struct of something.
28
30
  # Useful to prevent weirdness from autoloading.
31
+ #
29
32
  # @param parent [Class] the base class for the struct (default of {SoberSwag::Struct})
33
+ # @yieldself [SoberSwag::InputObject]
34
+ # @return [Class] the input object class generated
30
35
  def self.input_object(parent = nil, &block)
31
36
  Class.new(parent || SoberSwag::InputObject, &block)
32
37
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sober_swag
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.0
4
+ version: 0.21.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anthony Super
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-11-30 00:00:00.000000000 Z
11
+ date: 2021-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -172,6 +172,8 @@ extensions: []
172
172
  extra_rdoc_files: []
173
173
  files:
174
174
  - ".github/config/rubocop_linter_action.yml"
175
+ - ".github/dependabot.yml"
176
+ - ".github/workflows/benchmark.yml"
175
177
  - ".github/workflows/lint.yml"
176
178
  - ".github/workflows/ruby.yml"
177
179
  - ".gitignore"
@@ -179,11 +181,15 @@ files:
179
181
  - ".rubocop.yml"
180
182
  - ".ruby-version"
181
183
  - ".travis.yml"
184
+ - ".yardopts"
182
185
  - CHANGELOG.md
183
186
  - Gemfile
184
187
  - LICENSE.txt
185
188
  - README.md
186
189
  - Rakefile
190
+ - bench/benchmark.rb
191
+ - bench/benchmarks/basic_field_serializer.rb
192
+ - bench/benchmarks/view_selection.rb
187
193
  - bin/console
188
194
  - bin/rspec
189
195
  - bin/setup
@@ -282,6 +288,7 @@ files:
282
288
  - lib/sober_swag/serializer/base.rb
283
289
  - lib/sober_swag/serializer/conditional.rb
284
290
  - lib/sober_swag/serializer/field_list.rb
291
+ - lib/sober_swag/serializer/hash.rb
285
292
  - lib/sober_swag/serializer/mapped.rb
286
293
  - lib/sober_swag/serializer/meta.rb
287
294
  - lib/sober_swag/serializer/optional.rb