taro 0.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +22 -0
  4. data/CHANGELOG.md +10 -0
  5. data/README.md +257 -1
  6. data/Rakefile +11 -0
  7. data/lib/taro/config.rb +22 -0
  8. data/lib/taro/errors.rb +12 -0
  9. data/lib/taro/export/base.rb +29 -0
  10. data/lib/taro/export/open_api_v3.rb +190 -0
  11. data/lib/taro/export.rb +3 -0
  12. data/lib/taro/rails/active_declarations.rb +19 -0
  13. data/lib/taro/rails/declaration.rb +118 -0
  14. data/lib/taro/rails/declaration_buffer.rb +24 -0
  15. data/lib/taro/rails/dsl.rb +18 -0
  16. data/lib/taro/rails/generators/install_generator.rb +19 -0
  17. data/lib/taro/rails/generators/templates/enum_type.erb +4 -0
  18. data/lib/taro/rails/generators/templates/error_type.erb +10 -0
  19. data/lib/taro/rails/generators/templates/errors_type.erb +25 -0
  20. data/lib/taro/rails/generators/templates/input_type.erb +4 -0
  21. data/lib/taro/rails/generators/templates/no_content_type.erb +4 -0
  22. data/lib/taro/rails/generators/templates/object_type.erb +4 -0
  23. data/lib/taro/rails/generators/templates/scalar_type.erb +4 -0
  24. data/lib/taro/rails/generators.rb +3 -0
  25. data/lib/taro/rails/normalized_route.rb +29 -0
  26. data/lib/taro/rails/param_parsing.rb +19 -0
  27. data/lib/taro/rails/railtie.rb +15 -0
  28. data/lib/taro/rails/response_validation.rb +13 -0
  29. data/lib/taro/rails/response_validator.rb +109 -0
  30. data/lib/taro/rails/route_finder.rb +35 -0
  31. data/lib/taro/rails/tasks/export.rake +15 -0
  32. data/lib/taro/rails.rb +17 -0
  33. data/lib/taro/types/base_type.rb +17 -0
  34. data/lib/taro/types/coercion.rb +73 -0
  35. data/lib/taro/types/enum_type.rb +43 -0
  36. data/lib/taro/types/field.rb +78 -0
  37. data/lib/taro/types/field_validation.rb +27 -0
  38. data/lib/taro/types/input_type.rb +13 -0
  39. data/lib/taro/types/list_type.rb +30 -0
  40. data/lib/taro/types/object_type.rb +19 -0
  41. data/lib/taro/types/object_types/free_form_type.rb +13 -0
  42. data/lib/taro/types/object_types/no_content_type.rb +16 -0
  43. data/lib/taro/types/object_types/page_info_type.rb +6 -0
  44. data/lib/taro/types/object_types/page_type.rb +45 -0
  45. data/lib/taro/types/scalar/boolean_type.rb +19 -0
  46. data/lib/taro/types/scalar/float_type.rb +15 -0
  47. data/lib/taro/types/scalar/integer_type.rb +11 -0
  48. data/lib/taro/types/scalar/iso8601_date_type.rb +23 -0
  49. data/lib/taro/types/scalar/iso8601_datetime_type.rb +25 -0
  50. data/lib/taro/types/scalar/string_type.rb +15 -0
  51. data/lib/taro/types/scalar/timestamp_type.rb +23 -0
  52. data/lib/taro/types/scalar/uuid_v4_type.rb +22 -0
  53. data/lib/taro/types/scalar_type.rb +7 -0
  54. data/lib/taro/types/shared/additional_properties.rb +12 -0
  55. data/lib/taro/types/shared/custom_field_resolvers.rb +33 -0
  56. data/lib/taro/types/shared/derivable_types.rb +9 -0
  57. data/lib/taro/types/shared/description.rb +9 -0
  58. data/lib/taro/types/shared/errors.rb +13 -0
  59. data/lib/taro/types/shared/fields.rb +57 -0
  60. data/lib/taro/types/shared/item_type.rb +16 -0
  61. data/lib/taro/types/shared/object_coercion.rb +16 -0
  62. data/lib/taro/types/shared/openapi_name.rb +30 -0
  63. data/lib/taro/types/shared/openapi_type.rb +27 -0
  64. data/lib/taro/types/shared/rendering.rb +22 -0
  65. data/lib/taro/types/shared.rb +3 -0
  66. data/lib/taro/types.rb +3 -0
  67. data/lib/taro/version.rb +2 -3
  68. data/lib/taro.rb +1 -6
  69. data/tasks/benchmark.rake +40 -0
  70. data/tasks/benchmark_1kb.json +23 -0
  71. metadata +91 -7
@@ -0,0 +1,22 @@
1
+ # The `::render` method is intended for use in controllers.
2
+ # Special types (e.g. PageType) may accept kwargs for `#coerce_response`.
3
+ module Taro::Types::Shared::Rendering
4
+ def render(object, opts = {})
5
+ result = new(object).coerce_response(**opts)
6
+ self.last_render = [self, result.__id__]
7
+ result
8
+ end
9
+
10
+ def last_render=(info)
11
+ ActiveSupport::IsolatedExecutionState[:taro_last_render] = info
12
+ end
13
+
14
+ def last_render
15
+ ActiveSupport::IsolatedExecutionState[:taro_last_render]
16
+ end
17
+
18
+ # get the last used type for assertions in tests/specs
19
+ def used_in_response
20
+ last_render.to_a.first
21
+ end
22
+ end
@@ -0,0 +1,3 @@
1
+ module Taro::Types::Shared
2
+ Dir[File.join(__dir__, "shared", "*.rb")].each { |f| require f }
3
+ end
data/lib/taro/types.rb ADDED
@@ -0,0 +1,3 @@
1
+ module Taro::Types
2
+ Dir[File.join(__dir__, "types", "*.rb")].each { |f| require f }
3
+ end
data/lib/taro/version.rb CHANGED
@@ -1,5 +1,4 @@
1
- # frozen_string_literal: true
2
-
1
+ # :nocov:
3
2
  module Taro
4
- VERSION = "0.0.0"
3
+ VERSION = "1.1.0"
5
4
  end
data/lib/taro.rb CHANGED
@@ -1,8 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "taro/version"
4
-
5
1
  module Taro
6
- class Error < StandardError; end
7
- # Your code goes here...
2
+ Dir[File.join(__dir__, "taro", "*.rb")].each { |f| require f }
8
3
  end
@@ -0,0 +1,40 @@
1
+ task :benchmark do
2
+ require 'benchmark/ips'
3
+ require 'json'
4
+ require_relative '../lib/taro'
5
+
6
+ data = JSON.load_file("#{__dir__}/benchmark_1kb.json", symbolize_names: true)
7
+
8
+ item_type = Class.new(Taro::Types::ObjectType) do
9
+ field :name, type: 'String', null: false
10
+ field :language, type: 'String', null: false
11
+ field :id, type: 'String', null: false
12
+ field :bio, type: 'String', null: false
13
+ field :version, type: 'Float', null: false
14
+ end
15
+
16
+ type = Taro::Types::ListType.for(item_type)
17
+
18
+ # 143.889k (± 2.7%) i/s - 723.816k in 5.034247s
19
+ Benchmark.ips do |x|
20
+ x.report('parse 1 KB of params') { type.new(data).coerce_input }
21
+ end
22
+
23
+ # 103.382k (± 6.5%) i/s - 522.550k in 5.087725s
24
+ Benchmark.ips do |x|
25
+ x.report('validate a 1 KB response') { type.new(data).coerce_response }
26
+ end
27
+
28
+ big_data = data * 1000
29
+ big_data.each { |el| el.merge('version' => rand) }
30
+
31
+ # 101.359 (± 5.9%) i/s - 513.000 in 5.078335s
32
+ Benchmark.ips do |x|
33
+ x.report('parse 1 MB of params') { type.new(big_data).coerce_input }
34
+ end
35
+
36
+ # 84.412 (± 2.4%) i/s - 427.000 in 5.061117s
37
+ Benchmark.ips do |x|
38
+ x.report('validate a 1 MB response') { type.new(big_data).coerce_response }
39
+ end
40
+ end
@@ -0,0 +1,23 @@
1
+ [
2
+ {
3
+ "name": "Adeel Solangi",
4
+ "language": "Sindhi",
5
+ "id": "V59OF92YF627HFY0",
6
+ "bio": "Donec lobortis eleifend condimentum. Cras dictum dolor lacinia lectus vehicula rutrum. Maecenas quis nisi nunc. Nam tristique feugiat est vitae mollis. Maecenas quis nisi nunc.",
7
+ "version": 6.1
8
+ },
9
+ {
10
+ "name": "Afzal Ghaffar",
11
+ "language": "Sindhi",
12
+ "id": "ENTOCR13RSCLZ6KU",
13
+ "bio": "Aliquam sollicitudin ante ligula, eget malesuada nibh efficitur et. Pellentesque massa sem, scelerisque sit amet odio id, cursus tempor urna. Etiam congue dignissim volutpat. Vestibulum pharetra libero et velit gravida euismod.",
14
+ "version": 1.88
15
+ },
16
+ {
17
+ "name": "Aamir Solangi",
18
+ "language": "Sindhi",
19
+ "id": "IAKPO3R4761JDRVG",
20
+ "bio": "Vestibulum pharetra libero et velit gravida euismod. Quisque mauris ligula, efficitur porttitor sodales ac, lacinia non ex. Fusce eu ultrices elit, vel posuere neque.",
21
+ "version": 7.27
22
+ }
23
+ ]
metadata CHANGED
@@ -1,31 +1,115 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: taro
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Janosch Müller
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-11-04 00:00:00.000000000 Z
12
- dependencies: []
13
- description: placeholder gem
11
+ date: 2024-11-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ description: This library provides an object-based type system for RESTful Ruby APIs,
28
+ with built-in parameter parsing, response rendering, and OpenAPI schema export.
14
29
  email:
15
30
  - janosch84@gmail.com
16
31
  executables: []
17
32
  extensions: []
18
33
  extra_rdoc_files: []
19
34
  files:
35
+ - ".rspec"
36
+ - ".rubocop.yml"
37
+ - CHANGELOG.md
20
38
  - LICENSE.txt
21
39
  - README.md
22
40
  - Rakefile
23
41
  - lib/taro.rb
42
+ - lib/taro/config.rb
43
+ - lib/taro/errors.rb
44
+ - lib/taro/export.rb
45
+ - lib/taro/export/base.rb
46
+ - lib/taro/export/open_api_v3.rb
47
+ - lib/taro/rails.rb
48
+ - lib/taro/rails/active_declarations.rb
49
+ - lib/taro/rails/declaration.rb
50
+ - lib/taro/rails/declaration_buffer.rb
51
+ - lib/taro/rails/dsl.rb
52
+ - lib/taro/rails/generators.rb
53
+ - lib/taro/rails/generators/install_generator.rb
54
+ - lib/taro/rails/generators/templates/enum_type.erb
55
+ - lib/taro/rails/generators/templates/error_type.erb
56
+ - lib/taro/rails/generators/templates/errors_type.erb
57
+ - lib/taro/rails/generators/templates/input_type.erb
58
+ - lib/taro/rails/generators/templates/no_content_type.erb
59
+ - lib/taro/rails/generators/templates/object_type.erb
60
+ - lib/taro/rails/generators/templates/scalar_type.erb
61
+ - lib/taro/rails/normalized_route.rb
62
+ - lib/taro/rails/param_parsing.rb
63
+ - lib/taro/rails/railtie.rb
64
+ - lib/taro/rails/response_validation.rb
65
+ - lib/taro/rails/response_validator.rb
66
+ - lib/taro/rails/route_finder.rb
67
+ - lib/taro/rails/tasks/export.rake
68
+ - lib/taro/types.rb
69
+ - lib/taro/types/base_type.rb
70
+ - lib/taro/types/coercion.rb
71
+ - lib/taro/types/enum_type.rb
72
+ - lib/taro/types/field.rb
73
+ - lib/taro/types/field_validation.rb
74
+ - lib/taro/types/input_type.rb
75
+ - lib/taro/types/list_type.rb
76
+ - lib/taro/types/object_type.rb
77
+ - lib/taro/types/object_types/free_form_type.rb
78
+ - lib/taro/types/object_types/no_content_type.rb
79
+ - lib/taro/types/object_types/page_info_type.rb
80
+ - lib/taro/types/object_types/page_type.rb
81
+ - lib/taro/types/scalar/boolean_type.rb
82
+ - lib/taro/types/scalar/float_type.rb
83
+ - lib/taro/types/scalar/integer_type.rb
84
+ - lib/taro/types/scalar/iso8601_date_type.rb
85
+ - lib/taro/types/scalar/iso8601_datetime_type.rb
86
+ - lib/taro/types/scalar/string_type.rb
87
+ - lib/taro/types/scalar/timestamp_type.rb
88
+ - lib/taro/types/scalar/uuid_v4_type.rb
89
+ - lib/taro/types/scalar_type.rb
90
+ - lib/taro/types/shared.rb
91
+ - lib/taro/types/shared/additional_properties.rb
92
+ - lib/taro/types/shared/custom_field_resolvers.rb
93
+ - lib/taro/types/shared/derivable_types.rb
94
+ - lib/taro/types/shared/description.rb
95
+ - lib/taro/types/shared/errors.rb
96
+ - lib/taro/types/shared/fields.rb
97
+ - lib/taro/types/shared/item_type.rb
98
+ - lib/taro/types/shared/object_coercion.rb
99
+ - lib/taro/types/shared/openapi_name.rb
100
+ - lib/taro/types/shared/openapi_type.rb
101
+ - lib/taro/types/shared/rendering.rb
24
102
  - lib/taro/version.rb
25
- homepage:
103
+ - tasks/benchmark.rake
104
+ - tasks/benchmark_1kb.json
105
+ homepage: https://github.com/taro-rb/taro
26
106
  licenses:
27
107
  - MIT
28
- metadata: {}
108
+ metadata:
109
+ rubygems_mfa_required: 'true'
110
+ homepage_uri: https://github.com/taro-rb/taro
111
+ source_code_uri: https://github.com/taro-rb/taro
112
+ changelog_uri: https://github.com/taro-rb/taro/CHANGELOG.md
29
113
  post_install_message:
30
114
  rdoc_options: []
31
115
  require_paths:
@@ -44,5 +128,5 @@ requirements: []
44
128
  rubygems_version: 3.5.16
45
129
  signing_key:
46
130
  specification_version: 4
47
- summary: placeholder gem
131
+ summary: Typed Api using Ruby Objects.
48
132
  test_files: []