rivulet-rb 0.3.0 → 0.3.2
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 +4 -4
- data/lib/rivulet/cli/new.rb +24 -2
- data/lib/rivulet/container.rb +1 -0
- data/lib/rivulet/operations/run_console.rb +2 -0
- data/lib/rivulet/operations/startup.rb +3 -1
- data/lib/rivulet/request.rb +26 -1
- data/lib/rivulet/steps/build_context.rb +3 -11
- data/lib/rivulet/steps/compile_response.rb +1 -1
- data/lib/rivulet/steps/freeze_settings.rb +12 -0
- data/lib/rivulet/steps/load_settings.rb +0 -1
- data/lib/rivulet/version.rb +1 -1
- data/lib/rivulet.rb +1 -0
- metadata +17 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e4b42dc6a74dc928bb126b9cb6802b096b1b59b83b5c6ff0773ca1ed8922199a
|
|
4
|
+
data.tar.gz: f00390412a9018f6ef39ea9293ff62b3920107c26070cd6a7a6c7bfe9e3512e6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e8dc3048c25021f16dd148ce023235ae01abf8655e8b0dfebd0761a9aa2c600164aaeb6143019c3fbfb4233d2efe784d28a574d28f0d1e799c352df6bb413398
|
|
7
|
+
data.tar.gz: 4ad74647d4a0a32b274672998ca6e8413f2bd03c7111f684b151e252d8ffae537feab8362b050babaa4957a50e053e6b5474ed248f3d78dc4a06b875225af812
|
data/lib/rivulet/cli/new.rb
CHANGED
|
@@ -24,6 +24,8 @@ module Rivulet
|
|
|
24
24
|
].freeze
|
|
25
25
|
|
|
26
26
|
def call(name:, with_db: nil, **)
|
|
27
|
+
name = normalize_name(name)
|
|
28
|
+
|
|
27
29
|
DIRS.each { |d| create_dir "#{name}/#{d}" }
|
|
28
30
|
|
|
29
31
|
write name, 'Gemfile', gemfile(with_db)
|
|
@@ -43,10 +45,30 @@ module Rivulet
|
|
|
43
45
|
copy name, 'AGENTS.md', File.expand_path('../../../docs/AGENTS.md', __dir__)
|
|
44
46
|
|
|
45
47
|
puts "\nDone! Next steps:\n cd #{name}\n docker compose up"
|
|
48
|
+
rescue ArgumentError => e
|
|
49
|
+
puts "ERROR: #{e.message}"
|
|
50
|
+
exit false
|
|
46
51
|
end
|
|
47
52
|
|
|
48
53
|
private
|
|
49
54
|
|
|
55
|
+
def normalize_name(name)
|
|
56
|
+
normalized = name.to_s
|
|
57
|
+
# "HTTPServer" -> "HTTP_Server": split an acronym from the word that follows
|
|
58
|
+
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
|
59
|
+
# "myApp" -> "my_App": split a camelCase boundary
|
|
60
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
|
61
|
+
# "my app 2" -> "my_app_2": collapse spaces, dashes, dots, etc. into "_"
|
|
62
|
+
.gsub(/[^0-9a-zA-Z]+/, '_')
|
|
63
|
+
.downcase
|
|
64
|
+
# " My App " -> "my_app": drop leading/trailing "_"
|
|
65
|
+
.gsub(/\A_+|_+\z/, '')
|
|
66
|
+
|
|
67
|
+
raise ArgumentError, "invalid application name #{name}" if normalized.empty?
|
|
68
|
+
|
|
69
|
+
normalized
|
|
70
|
+
end
|
|
71
|
+
|
|
50
72
|
def create_dir(path)
|
|
51
73
|
FileUtils.mkdir_p(path)
|
|
52
74
|
puts " create #{path}/"
|
|
@@ -101,7 +123,7 @@ module Rivulet
|
|
|
101
123
|
|
|
102
124
|
<<~RUBY
|
|
103
125
|
Rivulet.configure do |config|
|
|
104
|
-
config.app.name = name
|
|
126
|
+
config.app.name = :#{name}
|
|
105
127
|
|
|
106
128
|
#{dsn_line}
|
|
107
129
|
|
|
@@ -192,7 +214,7 @@ module Rivulet
|
|
|
192
214
|
volumes:
|
|
193
215
|
- db:/var/lib/postgresql/data
|
|
194
216
|
healthcheck:
|
|
195
|
-
test: ["CMD-SHELL", "pg_isready -U rivulet"]
|
|
217
|
+
test: ["CMD-SHELL", "pg_isready -U rivulet -d #{name}_development"]
|
|
196
218
|
interval: 5s
|
|
197
219
|
timeout: 3s
|
|
198
220
|
retries: 5
|
data/lib/rivulet/container.rb
CHANGED
|
@@ -24,6 +24,7 @@ module Rivulet
|
|
|
24
24
|
register('run_migrations') { Rivulet::Steps::RunMigrations.new }
|
|
25
25
|
register('run_console') { Rivulet::Steps::RunConsole.new }
|
|
26
26
|
register('print_routes') { Rivulet::Steps::PrintRoutes.new }
|
|
27
|
+
register('freeze_settings') { Rivulet::Steps::FreezeSettings.new }
|
|
27
28
|
end
|
|
28
29
|
end
|
|
29
30
|
end
|
|
@@ -8,6 +8,7 @@ module Rivulet
|
|
|
8
8
|
load_db: 'steps.load_db',
|
|
9
9
|
load_routes: 'steps.load_routes',
|
|
10
10
|
load_initializers: 'steps.load_initializers',
|
|
11
|
+
freeze_settings: 'steps.freeze_settings',
|
|
11
12
|
run_console: 'steps.run_console'
|
|
12
13
|
]
|
|
13
14
|
|
|
@@ -18,6 +19,7 @@ module Rivulet
|
|
|
18
19
|
result = step load_app.(result)
|
|
19
20
|
result = step load_routes.(result)
|
|
20
21
|
result = step load_initializers.(result)
|
|
22
|
+
result = step freeze_settings.(result)
|
|
21
23
|
result = step run_console.(result)
|
|
22
24
|
|
|
23
25
|
result
|
|
@@ -7,7 +7,8 @@ module Rivulet
|
|
|
7
7
|
load_app: 'steps.load_app',
|
|
8
8
|
load_db: 'steps.load_db',
|
|
9
9
|
load_routes: 'steps.load_routes',
|
|
10
|
-
load_initializers: 'steps.load_initializers'
|
|
10
|
+
load_initializers: 'steps.load_initializers',
|
|
11
|
+
freeze_settings: 'steps.freeze_settings'
|
|
11
12
|
]
|
|
12
13
|
|
|
13
14
|
def call(input = {})
|
|
@@ -17,6 +18,7 @@ module Rivulet
|
|
|
17
18
|
result = step load_app.(result)
|
|
18
19
|
result = step load_routes.(result)
|
|
19
20
|
result = step load_initializers.(result)
|
|
21
|
+
result = step freeze_settings.(result)
|
|
20
22
|
|
|
21
23
|
result
|
|
22
24
|
end
|
data/lib/rivulet/request.rb
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
module Rivulet
|
|
2
2
|
class Request
|
|
3
|
-
attr_reader :http_method, :path, :content_type, :body, :session, :env
|
|
3
|
+
attr_reader :http_method, :path, :content_type, :query_string, :body, :session, :env
|
|
4
4
|
|
|
5
5
|
def initialize(env)
|
|
6
6
|
@http_method = env['REQUEST_METHOD'].downcase.to_sym
|
|
7
7
|
@path = env['PATH_INFO']
|
|
8
8
|
@content_type = env['CONTENT_TYPE']
|
|
9
|
+
@query_string = env['QUERY_STRING']
|
|
9
10
|
@body = env['rack.input']
|
|
10
11
|
@session = env['rack.session']
|
|
11
12
|
@env = env
|
|
@@ -14,5 +15,29 @@ module Rivulet
|
|
|
14
15
|
def cookies
|
|
15
16
|
Rack::Utils.parse_cookies(env)
|
|
16
17
|
end
|
|
18
|
+
|
|
19
|
+
def query_params
|
|
20
|
+
Rack::Utils
|
|
21
|
+
.parse_nested_query(query_string)
|
|
22
|
+
.then { |params| deep_symbolize_keys(params) }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def body_params
|
|
26
|
+
return {} unless content_type&.include?('application/json')
|
|
27
|
+
raw = body.read
|
|
28
|
+
return {} if raw.nil? || raw.empty?
|
|
29
|
+
Oj.load(raw, symbolize_names: true)
|
|
30
|
+
rescue Oj::ParseError
|
|
31
|
+
{}
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def deep_symbolize_keys(hash)
|
|
37
|
+
hash.each_with_object({}) do |(key, val), result|
|
|
38
|
+
val = deep_symbolize_keys(val) if val.is_a? Hash
|
|
39
|
+
result[key.to_sym] = val
|
|
40
|
+
end
|
|
41
|
+
end
|
|
17
42
|
end
|
|
18
43
|
end
|
|
@@ -31,17 +31,9 @@ module Rivulet
|
|
|
31
31
|
|
|
32
32
|
def build_params(route, request, path_match)
|
|
33
33
|
path_params = extract_params(route, path_match)
|
|
34
|
-
body_params =
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def parse_body(request)
|
|
39
|
-
return {} unless request.content_type&.include?('application/json')
|
|
40
|
-
raw = request.body.read
|
|
41
|
-
return {} if raw.nil? || raw.empty?
|
|
42
|
-
Oj.load(raw, symbolize_names: true)
|
|
43
|
-
rescue Oj::ParseError
|
|
44
|
-
{}
|
|
34
|
+
body_params = request.body_params
|
|
35
|
+
query_params = request.query_params
|
|
36
|
+
query_params.merge(body_params, path_params)
|
|
45
37
|
end
|
|
46
38
|
|
|
47
39
|
def find_route(routes, request)
|
data/lib/rivulet/version.rb
CHANGED
data/lib/rivulet.rb
CHANGED
|
@@ -34,6 +34,7 @@ require_relative 'rivulet/steps/build_context'
|
|
|
34
34
|
require_relative 'rivulet/steps/validate_response'
|
|
35
35
|
require_relative 'rivulet/steps/compile_response'
|
|
36
36
|
require_relative 'rivulet/steps/dispatch'
|
|
37
|
+
require_relative 'rivulet/steps/freeze_settings'
|
|
37
38
|
require_relative 'rivulet/steps/load_app'
|
|
38
39
|
require_relative 'rivulet/steps/load_db'
|
|
39
40
|
require_relative 'rivulet/steps/load_routes'
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rivulet-rb
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Vladimir Dombrovskiy <vold@fastmail.com>
|
|
@@ -149,6 +149,20 @@ dependencies:
|
|
|
149
149
|
- - ">="
|
|
150
150
|
- !ruby/object:Gem::Version
|
|
151
151
|
version: '0'
|
|
152
|
+
- !ruby/object:Gem::Dependency
|
|
153
|
+
name: irb
|
|
154
|
+
requirement: !ruby/object:Gem::Requirement
|
|
155
|
+
requirements:
|
|
156
|
+
- - ">="
|
|
157
|
+
- !ruby/object:Gem::Version
|
|
158
|
+
version: '0'
|
|
159
|
+
type: :runtime
|
|
160
|
+
prerelease: false
|
|
161
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
162
|
+
requirements:
|
|
163
|
+
- - ">="
|
|
164
|
+
- !ruby/object:Gem::Version
|
|
165
|
+
version: '0'
|
|
152
166
|
- !ruby/object:Gem::Dependency
|
|
153
167
|
name: oj
|
|
154
168
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -318,6 +332,7 @@ files:
|
|
|
318
332
|
- lib/rivulet/steps/build_context.rb
|
|
319
333
|
- lib/rivulet/steps/compile_response.rb
|
|
320
334
|
- lib/rivulet/steps/dispatch.rb
|
|
335
|
+
- lib/rivulet/steps/freeze_settings.rb
|
|
321
336
|
- lib/rivulet/steps/load_app.rb
|
|
322
337
|
- lib/rivulet/steps/load_db.rb
|
|
323
338
|
- lib/rivulet/steps/load_initializers.rb
|
|
@@ -350,7 +365,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
350
365
|
- !ruby/object:Gem::Version
|
|
351
366
|
version: '0'
|
|
352
367
|
requirements: []
|
|
353
|
-
rubygems_version: 4.0.
|
|
368
|
+
rubygems_version: 4.0.23
|
|
354
369
|
specification_version: 4
|
|
355
370
|
summary: A small Rack web framework built on dry-rb, falcon and forced layering architecture
|
|
356
371
|
test_files: []
|