syntropy 0.43.0 → 0.44.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/TODO.md +60 -0
- data/examples/blog/app/posts/[id]/edit.rb +1 -1
- data/examples/blog/app/posts/[id]/index.rb +3 -3
- data/examples/gitshabbos/Dockerfile +25 -0
- data/examples/gitshabbos/Gemfile +3 -0
- data/examples/gitshabbos/README.md +40 -0
- data/examples/gitshabbos/app/[repo]/commits.rb +23 -0
- data/examples/gitshabbos/app/[repo]/index.rb +32 -0
- data/examples/gitshabbos/app/[repo]/raw+.rb +11 -0
- data/examples/gitshabbos/app/[repo]/tree+.rb +37 -0
- data/examples/gitshabbos/app/_layout/default.rb +14 -0
- data/examples/gitshabbos/app/_layout/repo.rb +27 -0
- data/examples/gitshabbos/app/_layout/style.css +466 -0
- data/examples/gitshabbos/app/_lib/git_repository.rb +95 -0
- data/examples/gitshabbos/app/_repos.rb +10 -0
- data/examples/gitshabbos/app/git/[repo]/git-receive-pack.rb +0 -0
- data/examples/gitshabbos/app/git/[repo]/git-upload-pack.rb +21 -0
- data/examples/gitshabbos/app/git/[repo]/info/refs.rb +19 -0
- data/examples/gitshabbos/app/git/[repo]/objects/index+.rb +37 -0
- data/examples/gitshabbos/app/git/index+.rb +37 -0
- data/examples/gitshabbos/app/index.rb +18 -0
- data/examples/gitshabbos/config/Caddyfile +5 -0
- data/examples/gitshabbos/config/development.rb +11 -0
- data/examples/gitshabbos/config/production.rb +5 -0
- data/examples/gitshabbos/config/test.rb +5 -0
- data/examples/gitshabbos/docker-compose.yml +71 -0
- data/examples/gitshabbos/test/test_app.rb +14 -0
- data/examples/mcp-oauth/app/oauth/consent.rb +1 -1
- data/examples/mcp-oauth/app/signin.rb +1 -1
- data/lib/syntropy/app.rb +4 -4
- data/lib/syntropy/applets/builtin/default_error_handler.rb +1 -1
- data/lib/syntropy/controller_extensions.rb +1 -1
- data/lib/syntropy/errors.rb +2 -0
- data/lib/syntropy/http/server_connection.rb +1 -1
- data/lib/syntropy/json_api.rb +1 -1
- data/lib/syntropy/markdown.rb +1 -1
- data/lib/syntropy/request/request_info.rb +11 -2
- data/lib/syntropy/request/response.rb +46 -4
- data/lib/syntropy/request/validation.rb +2 -1
- data/lib/syntropy/routing_tree.rb +16 -7
- data/lib/syntropy/version.rb +1 -1
- data/test/fixtures/app/mod/bar/index+.rb +5 -1
- data/test/fixtures/app/params/[foo].rb +1 -1
- data/test/test_app.rb +29 -0
- data/test/test_response.rb +115 -0
- data/test/test_routing_tree.rb +80 -25
- data/test/test_server.rb +3 -3
- metadata +25 -1
data/test/test_routing_tree.rb
CHANGED
|
@@ -28,8 +28,8 @@ class RoutingTreeTest < Minitest::Test
|
|
|
28
28
|
'_error.rb': '',
|
|
29
29
|
'_hook.rb': '',
|
|
30
30
|
'about.md': '',
|
|
31
|
-
'index.rb': '',
|
|
32
31
|
'api+.rb': '',
|
|
32
|
+
'index.rb': '',
|
|
33
33
|
'assets': {
|
|
34
34
|
'img': {
|
|
35
35
|
'foo.jpg': ''
|
|
@@ -219,7 +219,7 @@ class RoutingTreeTest < Minitest::Test
|
|
|
219
219
|
|
|
220
220
|
params = {}
|
|
221
221
|
route = router.('/docs/df/papercraft/issues/14', params)
|
|
222
|
-
assert_equal ({
|
|
222
|
+
assert_equal ({ org: 'df', repo: 'papercraft', id: '14'}), params
|
|
223
223
|
refute_nil route
|
|
224
224
|
assert_equal '/docs/[org]/[repo]/issues/[id]', route[:path]
|
|
225
225
|
|
|
@@ -255,28 +255,28 @@ class RoutingTreeTest < Minitest::Test
|
|
|
255
255
|
|
|
256
256
|
route = router.('/docs/foo', params = {})
|
|
257
257
|
assert_equal File.join(@rt.app_root, '[org]/index.rb'), route[:target][:fn]
|
|
258
|
-
assert_equal 'foo', params[
|
|
258
|
+
assert_equal 'foo', params[:org]
|
|
259
259
|
|
|
260
260
|
route = router.('/docs/foo/bar', params = {})
|
|
261
261
|
assert_equal File.join(@rt.app_root, '[org]/[repo]/index.rb'), route[:target][:fn]
|
|
262
|
-
assert_equal 'foo', params[
|
|
263
|
-
assert_equal 'bar', params[
|
|
262
|
+
assert_equal 'foo', params[:org]
|
|
263
|
+
assert_equal 'bar', params[:repo]
|
|
264
264
|
|
|
265
265
|
route = router.('/docs/bar/baz/commits', params = {})
|
|
266
266
|
assert_equal File.join(@rt.app_root, '[org]/[repo]/commits/index.rb'), route[:target][:fn]
|
|
267
|
-
assert_equal 'bar', params[
|
|
268
|
-
assert_equal 'baz', params[
|
|
267
|
+
assert_equal 'bar', params[:org]
|
|
268
|
+
assert_equal 'baz', params[:repo]
|
|
269
269
|
|
|
270
270
|
route = router.('/docs/foo/bar/issues', params = {})
|
|
271
271
|
assert_equal File.join(@rt.app_root, '[org]/[repo]/issues/index.rb'), route[:target][:fn]
|
|
272
|
-
assert_equal 'foo', params[
|
|
273
|
-
assert_equal 'bar', params[
|
|
272
|
+
assert_equal 'foo', params[:org]
|
|
273
|
+
assert_equal 'bar', params[:repo]
|
|
274
274
|
|
|
275
275
|
route = router.('/docs/bar/baz/issues/14', params = {})
|
|
276
276
|
assert_equal File.join(@rt.app_root, '[org]/[repo]/issues/[id]/index.rb'), route[:target][:fn]
|
|
277
|
-
assert_equal 'bar', params[
|
|
278
|
-
assert_equal 'baz', params[
|
|
279
|
-
assert_equal '14', params[
|
|
277
|
+
assert_equal 'bar', params[:org]
|
|
278
|
+
assert_equal 'baz', params[:repo]
|
|
279
|
+
assert_equal '14', params[:id]
|
|
280
280
|
|
|
281
281
|
route = router.('/docs/foo/bar/issues/14/blah', {})
|
|
282
282
|
assert_nil route
|
|
@@ -298,7 +298,7 @@ class RoutingTreeTest < Minitest::Test
|
|
|
298
298
|
|
|
299
299
|
route = router.('/docs/posts/foo', params = {})
|
|
300
300
|
assert_equal File.join(@rt.app_root, 'posts/[id].rb'), route[:target][:fn]
|
|
301
|
-
assert_equal 'foo', params[
|
|
301
|
+
assert_equal 'foo', params[:id]
|
|
302
302
|
end
|
|
303
303
|
|
|
304
304
|
def test_routing_root_mounted
|
|
@@ -311,7 +311,7 @@ class RoutingTreeTest < Minitest::Test
|
|
|
311
311
|
params = {}
|
|
312
312
|
route = router.('/df/papercraft/issues/14', params)
|
|
313
313
|
refute_nil route
|
|
314
|
-
assert_equal ({
|
|
314
|
+
assert_equal ({ org: 'df', repo: 'papercraft', id: '14'}), params
|
|
315
315
|
assert_equal '/[org]/[repo]/issues/[id]', route[:path]
|
|
316
316
|
|
|
317
317
|
route = router.('/assets', {})
|
|
@@ -337,28 +337,28 @@ class RoutingTreeTest < Minitest::Test
|
|
|
337
337
|
|
|
338
338
|
route = router.('/foo', params = {})
|
|
339
339
|
assert_equal File.join(@rt.app_root, '[org]/index.rb'), route[:target][:fn]
|
|
340
|
-
assert_equal 'foo', params[
|
|
340
|
+
assert_equal 'foo', params[:org]
|
|
341
341
|
|
|
342
342
|
route = router.('/foo/bar', params = {})
|
|
343
343
|
assert_equal File.join(@rt.app_root, '[org]/[repo]/index.rb'), route[:target][:fn]
|
|
344
|
-
assert_equal 'foo', params[
|
|
345
|
-
assert_equal 'bar', params[
|
|
344
|
+
assert_equal 'foo', params[:org]
|
|
345
|
+
assert_equal 'bar', params[:repo]
|
|
346
346
|
|
|
347
347
|
route = router.('/bar/baz/commits', params = {})
|
|
348
348
|
assert_equal File.join(@rt.app_root, '[org]/[repo]/commits/index.rb'), route[:target][:fn]
|
|
349
|
-
assert_equal 'bar', params[
|
|
350
|
-
assert_equal 'baz', params[
|
|
349
|
+
assert_equal 'bar', params[:org]
|
|
350
|
+
assert_equal 'baz', params[:repo]
|
|
351
351
|
|
|
352
352
|
route = router.('/foo/bar/issues', params = {})
|
|
353
353
|
assert_equal File.join(@rt.app_root, '[org]/[repo]/issues/index.rb'), route[:target][:fn]
|
|
354
|
-
assert_equal 'foo', params[
|
|
355
|
-
assert_equal 'bar', params[
|
|
354
|
+
assert_equal 'foo', params[:org]
|
|
355
|
+
assert_equal 'bar', params[:repo]
|
|
356
356
|
|
|
357
357
|
route = router.('/bar/baz/issues/14', params = {})
|
|
358
358
|
assert_equal File.join(@rt.app_root, '[org]/[repo]/issues/[id]/index.rb'), route[:target][:fn]
|
|
359
|
-
assert_equal 'bar', params[
|
|
360
|
-
assert_equal 'baz', params[
|
|
361
|
-
assert_equal '14', params[
|
|
359
|
+
assert_equal 'bar', params[:org]
|
|
360
|
+
assert_equal 'baz', params[:repo]
|
|
361
|
+
assert_equal '14', params[:id]
|
|
362
362
|
|
|
363
363
|
route = router.('/foo/bar/issues/14/blah', {})
|
|
364
364
|
assert_nil route
|
|
@@ -380,7 +380,7 @@ class RoutingTreeTest < Minitest::Test
|
|
|
380
380
|
|
|
381
381
|
route = router.('/posts/foo', params = {})
|
|
382
382
|
assert_equal File.join(@rt.app_root, 'posts/[id].rb'), route[:target][:fn]
|
|
383
|
-
assert_equal 'foo', params[
|
|
383
|
+
assert_equal 'foo', params[:id]
|
|
384
384
|
end
|
|
385
385
|
|
|
386
386
|
def test_mount_applet
|
|
@@ -582,4 +582,59 @@ class RoutingTreeWildcardIndexTest < Minitest::Test
|
|
|
582
582
|
route = router.('/docs/bars/about', {})
|
|
583
583
|
assert_nil route
|
|
584
584
|
end
|
|
585
|
+
|
|
586
|
+
def test_route_params
|
|
587
|
+
file_tree = {
|
|
588
|
+
'posts': {
|
|
589
|
+
'[id].rb': '',
|
|
590
|
+
},
|
|
591
|
+
'api+.rb': '',
|
|
592
|
+
'api2': {
|
|
593
|
+
'index+.rb': ''
|
|
594
|
+
},
|
|
595
|
+
'api3': {
|
|
596
|
+
'[id]': {
|
|
597
|
+
'index+.rb': ''
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
@app_root = "/tmp/#{__FILE__.gsub('/', '-')}-#{SecureRandom.hex}"
|
|
603
|
+
make_tmp_file_tree(@app_root, file_tree)
|
|
604
|
+
@rt = Syntropy::RoutingTree.new(app_root: @app_root, mount_path: '/')
|
|
605
|
+
router = @rt.router_proc
|
|
606
|
+
|
|
607
|
+
params = {}
|
|
608
|
+
r = router.('/posts/13', params)
|
|
609
|
+
p
|
|
610
|
+
assert_equal '13', params[:id]
|
|
611
|
+
|
|
612
|
+
params = {}
|
|
613
|
+
rr = []
|
|
614
|
+
rr << router.('/api/foo/bar', params)
|
|
615
|
+
assert_equal 'foo/bar', params[:__rel_path__]
|
|
616
|
+
params = {}
|
|
617
|
+
rr << router.('/api', params)
|
|
618
|
+
assert_nil params[:__rel_path__]
|
|
619
|
+
assert_equal 1, rr.uniq.size
|
|
620
|
+
|
|
621
|
+
params = {}
|
|
622
|
+
rr = []
|
|
623
|
+
rr << router.('/api2/baz', params)
|
|
624
|
+
assert_equal 'baz', params[:__rel_path__]
|
|
625
|
+
params = {}
|
|
626
|
+
rr << router.('/api2', params)
|
|
627
|
+
assert_nil params[:__rel_path__]
|
|
628
|
+
assert_equal 1, rr.uniq.size
|
|
629
|
+
|
|
630
|
+
params = {}
|
|
631
|
+
rr = []
|
|
632
|
+
rr << router.('/api3/baz/buzz', params)
|
|
633
|
+
assert_equal 'baz', params[:id]
|
|
634
|
+
assert_equal 'buzz', params[:__rel_path__]
|
|
635
|
+
params = {}
|
|
636
|
+
rr << router.('/api3', params)
|
|
637
|
+
assert_nil params[:__rel_path__]
|
|
638
|
+
assert_equal 1, rr.uniq.size
|
|
639
|
+
end
|
|
585
640
|
end
|
data/test/test_server.rb
CHANGED
|
@@ -86,7 +86,7 @@ class ServerTest < Minitest::Test
|
|
|
86
86
|
|
|
87
87
|
def test_pipelined_requests
|
|
88
88
|
@app = ->(req) {
|
|
89
|
-
req.respond("method: #{req.
|
|
89
|
+
req.respond("method: #{req.http_method}")
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
write_http_request "GET /foo HTTP/1.1\r\nServer: foo.com\r\n\r\nPUT /bar HTTP/1.1\r\n\r\n"
|
|
@@ -124,7 +124,7 @@ class ServerTest < Minitest::Test
|
|
|
124
124
|
@app = ->(req) {
|
|
125
125
|
@reqs << req
|
|
126
126
|
@bodies << req.read
|
|
127
|
-
req.respond("method: #{req.
|
|
127
|
+
req.respond("method: #{req.http_method}")
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
msg = <<~HTTP.crlf_lines
|
|
@@ -174,7 +174,7 @@ class ServerTest < Minitest::Test
|
|
|
174
174
|
@app = ->(req) do
|
|
175
175
|
@reqs << req
|
|
176
176
|
@bodies << (b = req.read)
|
|
177
|
-
req.respond("method: #{req.
|
|
177
|
+
req.respond("method: #{req.http_method}")
|
|
178
178
|
rescue StandardError => e
|
|
179
179
|
p e
|
|
180
180
|
p e.backtrace
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: syntropy
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.44.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sharon Rosner
|
|
@@ -244,6 +244,30 @@ files:
|
|
|
244
244
|
- examples/github/app/collections.rb
|
|
245
245
|
- examples/github/app/explore.rb
|
|
246
246
|
- examples/github/app/index.rb
|
|
247
|
+
- examples/gitshabbos/Dockerfile
|
|
248
|
+
- examples/gitshabbos/Gemfile
|
|
249
|
+
- examples/gitshabbos/README.md
|
|
250
|
+
- examples/gitshabbos/app/[repo]/commits.rb
|
|
251
|
+
- examples/gitshabbos/app/[repo]/index.rb
|
|
252
|
+
- examples/gitshabbos/app/[repo]/raw+.rb
|
|
253
|
+
- examples/gitshabbos/app/[repo]/tree+.rb
|
|
254
|
+
- examples/gitshabbos/app/_layout/default.rb
|
|
255
|
+
- examples/gitshabbos/app/_layout/repo.rb
|
|
256
|
+
- examples/gitshabbos/app/_layout/style.css
|
|
257
|
+
- examples/gitshabbos/app/_lib/git_repository.rb
|
|
258
|
+
- examples/gitshabbos/app/_repos.rb
|
|
259
|
+
- examples/gitshabbos/app/git/[repo]/git-receive-pack.rb
|
|
260
|
+
- examples/gitshabbos/app/git/[repo]/git-upload-pack.rb
|
|
261
|
+
- examples/gitshabbos/app/git/[repo]/info/refs.rb
|
|
262
|
+
- examples/gitshabbos/app/git/[repo]/objects/index+.rb
|
|
263
|
+
- examples/gitshabbos/app/git/index+.rb
|
|
264
|
+
- examples/gitshabbos/app/index.rb
|
|
265
|
+
- examples/gitshabbos/config/Caddyfile
|
|
266
|
+
- examples/gitshabbos/config/development.rb
|
|
267
|
+
- examples/gitshabbos/config/production.rb
|
|
268
|
+
- examples/gitshabbos/config/test.rb
|
|
269
|
+
- examples/gitshabbos/docker-compose.yml
|
|
270
|
+
- examples/gitshabbos/test/test_app.rb
|
|
247
271
|
- examples/mcp-oauth/.ruby-version
|
|
248
272
|
- examples/mcp-oauth/Gemfile
|
|
249
273
|
- examples/mcp-oauth/README.md
|