rubst_api 0.1.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.
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubstApi
4
+ class TestResponse
5
+ attr_reader :status, :headers, :body
6
+ def initialize(status, headers, body)
7
+ @status, @headers = status, Headers.new(headers)
8
+ @body = body.respond_to?(:each) ? body.to_a.join : body.to_s
9
+ body.close if body.respond_to?(:close)
10
+ end
11
+ alias status_code status
12
+ def json = JSON.parse(body)
13
+ def text = body
14
+ def success? = status.between?(200, 299)
15
+ end
16
+
17
+ class TestClient
18
+ def initialize(app, base_url: "http://testserver")
19
+ @app, @base_url = app, base_url
20
+ end
21
+
22
+ %i[get post put patch delete options head].each do |method|
23
+ define_method(method) { |path, **options| request(method, path, **options) }
24
+ end
25
+
26
+ def request(method, path, params: nil, json: UNDEFINED, data: nil, headers: {}, cookies: {})
27
+ uri = URI.join(@base_url, path)
28
+ query = URI.decode_www_form(uri.query.to_s)
29
+ query.concat(params.flat_map { |key, value| Array(value).map { |item| [key.to_s, item.to_s] } }) if params
30
+ body = if !json.equal?(UNDEFINED)
31
+ headers = { "Content-Type" => "application/json" }.merge(headers)
32
+ JSON.generate(json)
33
+ elsif data
34
+ headers = { "Content-Type" => "application/x-www-form-urlencoded" }.merge(headers)
35
+ URI.encode_www_form(data)
36
+ else ""
37
+ end
38
+ headers["Cookie"] = cookies.map { |key, value| "#{key}=#{value}" }.join("; ") unless cookies.empty?
39
+ env = {
40
+ "REQUEST_METHOD" => method.to_s.upcase, "PATH_INFO" => uri.path,
41
+ "QUERY_STRING" => URI.encode_www_form(query), "rack.input" => StringIO.new(body),
42
+ "rack.url_scheme" => uri.scheme, "HTTP_HOST" => uri.host,
43
+ "CONTENT_LENGTH" => body.bytesize.to_s
44
+ }
45
+ headers.each do |key, value|
46
+ env[key.to_s.downcase == "content-type" ? "CONTENT_TYPE" : "HTTP_#{key.to_s.upcase.tr("-", "_")}"] = value
47
+ end
48
+ TestResponse.new(*@app.call(env))
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubstApi
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubstApi
4
+ class WebSocket
5
+ attr_reader :env, :path_params, :state
6
+ def initialize(env, path_params: {})
7
+ @env, @path_params, @state = env, path_params, {}
8
+ @socket = env["rack.websocket"]
9
+ end
10
+ def accept(subprotocol: nil, headers: {}) = @socket&.accept(subprotocol:, headers:)
11
+ def receive = @socket&.receive
12
+ def receive_text = receive.to_s
13
+ def receive_json = JSON.parse(receive_text)
14
+ def send_text(data) = @socket&.send(data.to_s)
15
+ def send_json(data) = send_text(JSON.generate(Serializer.dump(data)))
16
+ def close(code: 1000, reason: nil) = @socket&.close(code, reason)
17
+ def query_params = Request.new(env).query_params
18
+ def headers = Request.new(env).headers
19
+ def cookies = Request.new(env).cookies
20
+ end
21
+ end
data/lib/rubst_api.rb ADDED
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "rubst_api/version"
4
+ require_relative "rubst_api/errors"
5
+ require_relative "rubst_api/params"
6
+ require_relative "rubst_api/model"
7
+ require_relative "rubst_api/http"
8
+ require_relative "rubst_api/responses"
9
+ require_relative "rubst_api/dependencies"
10
+ require_relative "rubst_api/security"
11
+ require_relative "rubst_api/routing"
12
+ require_relative "rubst_api/openapi"
13
+ require_relative "rubst_api/middleware"
14
+ require_relative "rubst_api/background_tasks"
15
+ require_relative "rubst_api/websocket"
16
+ require_relative "rubst_api/static_files"
17
+ require_relative "rubst_api/sse"
18
+ require_relative "rubst_api/status"
19
+ require_relative "rubst_api/app"
20
+ require_relative "rubst_api/test_client"
21
+
22
+ module RubstApi
23
+ class << self
24
+ def Query(type = String, **options) = Param.new(:query, type:, **options)
25
+ def Path(type = String, **options) = Param.new(:path, type:, required: true, **options)
26
+ def Header(type = String, **options) = Param.new(:header, type:, **options)
27
+ def Cookie(type = String, **options) = Param.new(:cookie, type:, **options)
28
+ def Body(type = Hash, **options) = Param.new(:body, type:, **options)
29
+ def Form(type = String, **options) = Param.new(:form, type:, **options)
30
+ def File(**options) = Param.new(:file, type: UploadFile, **options)
31
+ def Depends(callable = nil, **options, &block) = Dependency.new(callable || block, **options)
32
+ def Security(callable = nil, scopes: [], **options, &block)
33
+ SecurityDependency.new(callable || block, scopes:, **options)
34
+ end
35
+
36
+ def jsonable_encoder(value, **)
37
+ Serializer.dump(value)
38
+ end
39
+ end
40
+ end
metadata ADDED
@@ -0,0 +1,182 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubst_api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jory Leech
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rack
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '3.0'
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '4.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '3.0'
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '4.0'
32
+ - !ruby/object:Gem::Dependency
33
+ name: rackup
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '2.0'
39
+ - - "<"
40
+ - !ruby/object:Gem::Version
41
+ version: '3.0'
42
+ type: :runtime
43
+ prerelease: false
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '2.0'
49
+ - - "<"
50
+ - !ruby/object:Gem::Version
51
+ version: '3.0'
52
+ - !ruby/object:Gem::Dependency
53
+ name: webrick
54
+ requirement: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '1.8'
59
+ - - "<"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '1.8'
69
+ - - "<"
70
+ - !ruby/object:Gem::Version
71
+ version: '2.0'
72
+ - !ruby/object:Gem::Dependency
73
+ name: minitest
74
+ requirement: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '5.0'
79
+ - - "<"
80
+ - !ruby/object:Gem::Version
81
+ version: '7.0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '5.0'
89
+ - - "<"
90
+ - !ruby/object:Gem::Version
91
+ version: '7.0'
92
+ - !ruby/object:Gem::Dependency
93
+ name: rake
94
+ requirement: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '13.0'
99
+ - - "<"
100
+ - !ruby/object:Gem::Version
101
+ version: '14.0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '13.0'
109
+ - - "<"
110
+ - !ruby/object:Gem::Version
111
+ version: '14.0'
112
+ description: |-
113
+ RubstAPI is a FastAPI-inspired, Rack-compatible framework for building
114
+ typed Ruby REST APIs. It provides request and response validation,
115
+ dependency injection, OpenAPI 3.1 schemas, Swagger UI, ReDoc, security
116
+ helpers, middleware, routing, background tasks, and testing utilities.
117
+ email:
118
+ - joryleech@gmail.com
119
+ executables:
120
+ - rubst_api
121
+ extensions: []
122
+ extra_rdoc_files:
123
+ - CHANGELOG.md
124
+ - LICENSE
125
+ - README.md
126
+ - THIRD_PARTY_NOTICES.md
127
+ files:
128
+ - CHANGELOG.md
129
+ - LICENSE
130
+ - LICENSES/FASTAPI-MIT.txt
131
+ - README.md
132
+ - SECURITY.md
133
+ - THIRD_PARTY_NOTICES.md
134
+ - exe/rubst_api
135
+ - lib/rubst_api.rb
136
+ - lib/rubst_api/app.rb
137
+ - lib/rubst_api/background_tasks.rb
138
+ - lib/rubst_api/dependencies.rb
139
+ - lib/rubst_api/errors.rb
140
+ - lib/rubst_api/http.rb
141
+ - lib/rubst_api/middleware.rb
142
+ - lib/rubst_api/model.rb
143
+ - lib/rubst_api/openapi.rb
144
+ - lib/rubst_api/params.rb
145
+ - lib/rubst_api/responses.rb
146
+ - lib/rubst_api/routing.rb
147
+ - lib/rubst_api/security.rb
148
+ - lib/rubst_api/sse.rb
149
+ - lib/rubst_api/static_files.rb
150
+ - lib/rubst_api/status.rb
151
+ - lib/rubst_api/test_client.rb
152
+ - lib/rubst_api/version.rb
153
+ - lib/rubst_api/websocket.rb
154
+ homepage: https://github.com/joryleech/RubstApi
155
+ licenses:
156
+ - MIT
157
+ metadata:
158
+ allowed_push_host: https://rubygems.org
159
+ bug_tracker_uri: https://github.com/joryleech/RubstApi/issues
160
+ changelog_uri: https://github.com/joryleech/RubstApi/blob/main/CHANGELOG.md
161
+ documentation_uri: https://github.com/joryleech/RubstApi#readme
162
+ homepage_uri: https://github.com/joryleech/RubstApi
163
+ rubygems_mfa_required: 'true'
164
+ source_code_uri: https://github.com/joryleech/RubstApi/tree/main
165
+ rdoc_options: []
166
+ require_paths:
167
+ - lib
168
+ required_ruby_version: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '3.2'
173
+ required_rubygems_version: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ version: 3.3.0
178
+ requirements: []
179
+ rubygems_version: 4.0.16
180
+ specification_version: 4
181
+ summary: Build typed Ruby APIs with validation and automatic OpenAPI docs
182
+ test_files: []