syntropy 0.42.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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -0
  3. data/TODO.md +60 -0
  4. data/examples/blog/app/posts/[id]/edit.rb +1 -1
  5. data/examples/blog/app/posts/[id]/index.rb +3 -3
  6. data/examples/gitshabbos/Dockerfile +25 -0
  7. data/examples/gitshabbos/Gemfile +3 -0
  8. data/examples/gitshabbos/README.md +40 -0
  9. data/examples/gitshabbos/app/[repo]/commits.rb +23 -0
  10. data/examples/gitshabbos/app/[repo]/index.rb +32 -0
  11. data/examples/gitshabbos/app/[repo]/raw+.rb +11 -0
  12. data/examples/gitshabbos/app/[repo]/tree+.rb +37 -0
  13. data/examples/gitshabbos/app/_layout/default.rb +14 -0
  14. data/examples/gitshabbos/app/_layout/repo.rb +27 -0
  15. data/examples/gitshabbos/app/_layout/style.css +466 -0
  16. data/examples/gitshabbos/app/_lib/git_repository.rb +95 -0
  17. data/examples/gitshabbos/app/_repos.rb +10 -0
  18. data/examples/gitshabbos/app/git/[repo]/git-receive-pack.rb +0 -0
  19. data/examples/gitshabbos/app/git/[repo]/git-upload-pack.rb +21 -0
  20. data/examples/gitshabbos/app/git/[repo]/info/refs.rb +19 -0
  21. data/examples/gitshabbos/app/git/[repo]/objects/index+.rb +37 -0
  22. data/examples/gitshabbos/app/git/index+.rb +37 -0
  23. data/examples/gitshabbos/app/index.rb +18 -0
  24. data/examples/gitshabbos/config/Caddyfile +5 -0
  25. data/examples/gitshabbos/config/development.rb +11 -0
  26. data/examples/gitshabbos/config/production.rb +5 -0
  27. data/examples/gitshabbos/config/test.rb +5 -0
  28. data/examples/gitshabbos/docker-compose.yml +71 -0
  29. data/examples/gitshabbos/test/test_app.rb +14 -0
  30. data/examples/mcp-oauth/app/oauth/consent.rb +1 -1
  31. data/examples/mcp-oauth/app/signin.rb +1 -1
  32. data/lib/syntropy/app.rb +4 -4
  33. data/lib/syntropy/applets/builtin/default_error_handler.rb +1 -1
  34. data/lib/syntropy/controller_extensions.rb +1 -1
  35. data/lib/syntropy/errors.rb +2 -0
  36. data/lib/syntropy/http/server_connection.rb +1 -1
  37. data/lib/syntropy/json_api.rb +1 -1
  38. data/lib/syntropy/logger.rb +7 -4
  39. data/lib/syntropy/markdown.rb +1 -1
  40. data/lib/syntropy/request/request_info.rb +11 -2
  41. data/lib/syntropy/request/response.rb +46 -4
  42. data/lib/syntropy/request/validation.rb +2 -1
  43. data/lib/syntropy/routing_tree.rb +16 -7
  44. data/lib/syntropy/version.rb +1 -1
  45. data/test/fixtures/app/mod/bar/index+.rb +5 -1
  46. data/test/fixtures/app/params/[foo].rb +1 -1
  47. data/test/test_app.rb +29 -0
  48. data/test/test_response.rb +115 -0
  49. data/test/test_routing_tree.rb +80 -25
  50. data/test/test_server.rb +3 -3
  51. metadata +25 -1
@@ -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 ({ 'org' => 'df', 'repo' => 'papercraft', 'id' => '14'}), params
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['org']
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['org']
263
- assert_equal 'bar', params['repo']
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['org']
268
- assert_equal 'baz', params['repo']
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['org']
273
- assert_equal 'bar', params['repo']
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['org']
278
- assert_equal 'baz', params['repo']
279
- assert_equal '14', params['id']
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['id']
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 ({ 'org' => 'df', 'repo' => 'papercraft', 'id' => '14'}), params
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['org']
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['org']
345
- assert_equal 'bar', params['repo']
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['org']
350
- assert_equal 'baz', params['repo']
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['org']
355
- assert_equal 'bar', params['repo']
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['org']
360
- assert_equal 'baz', params['repo']
361
- assert_equal '14', params['id']
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['id']
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.method}")
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.method}")
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.method}")
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.42.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