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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 622289122f59a270997655c87af3287273f2f16f820f7713dd95092a32cb102b
4
- data.tar.gz: 99896962459012b47744e0e8466a1b691bf5bc04f5337ef44ab3039b12938296
3
+ metadata.gz: e4b42dc6a74dc928bb126b9cb6802b096b1b59b83b5c6ff0773ca1ed8922199a
4
+ data.tar.gz: f00390412a9018f6ef39ea9293ff62b3920107c26070cd6a7a6c7bfe9e3512e6
5
5
  SHA512:
6
- metadata.gz: '081156052069871b24b394ef91db773c57a9c3c1225fb52b76499f944e7d834edb0319f87211e0c53bc5d57d24e43c6d744df0455f3206a850c427c72ef0db87'
7
- data.tar.gz: 25b0d8cdb73570dd48c16d5e15d8bfb371f2721e47ffff66b12d9f87c9057957629c4fc2b005c85295fd7e1c4fa2d460b0522aea2b80da67aef5ddb8c6253038
6
+ metadata.gz: e8dc3048c25021f16dd148ce023235ae01abf8655e8b0dfebd0761a9aa2c600164aaeb6143019c3fbfb4233d2efe784d28a574d28f0d1e799c352df6bb413398
7
+ data.tar.gz: 4ad74647d4a0a32b274672998ca6e8413f2bd03c7111f684b151e252d8ffae537feab8362b050babaa4957a50e053e6b5474ed248f3d78dc4a06b875225af812
@@ -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
@@ -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
@@ -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 = parse_body(request)
35
- body_params.merge(path_params)
36
- end
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)
@@ -10,7 +10,7 @@ module Rivulet
10
10
  body, headers =
11
11
  case format
12
12
  when :json
13
- payload = Oj.dump(response.body, mode: :json)
13
+ payload = Oj.dump(response.body, mode: :strict)
14
14
 
15
15
  [
16
16
  Protocol::HTTP::Body::Buffered.wrap(payload),
@@ -0,0 +1,12 @@
1
+ module Rivulet
2
+ module Steps
3
+ class FreezeSettings < Rivulet::Step
4
+ def call(input)
5
+ app = input[:resource]
6
+ app.config.finalize!
7
+
8
+ Success(input)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -9,7 +9,6 @@ module Rivulet
9
9
  load app_file
10
10
 
11
11
  app.config.logger = app.config.logger.engine || default_logger(app)
12
- app.config.finalize!
13
12
 
14
13
  Success(input)
15
14
  end
@@ -1,3 +1,3 @@
1
1
  module Rivulet
2
- VERSION = '0.3.0'
2
+ VERSION = '0.3.2'
3
3
  end
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.0
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.19
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: []