syntropy 0.27.1 → 0.27.3

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: 8fd5a77712915e9472ed58a8786dce7369e9d24852533c19ce25d9f4959815bf
4
- data.tar.gz: d6420486dc63bb1227b723f14e28e170e6e772f28970a2ce62e2d8283bdcd2b8
3
+ metadata.gz: 2e5ab54a8f18c43cde603b8de66783b40cc73ce3587acacaaea5cde18c0d1e7d
4
+ data.tar.gz: 1c3660cbc1a05cf4c9c89d4353df55abe9636a462bac3b5ad83b026414fceb91
5
5
  SHA512:
6
- metadata.gz: 5041a3820ed58393b643c7ed298fbdfedf255b9116156a1909d39bf0dfbb842004b38a651c85419d28c5dc2cae9b1c0d5fb13a9e24bbb1ec5340508ffbe7591c
7
- data.tar.gz: d239554ae9e5b8c1b3159cbc0bb13cc828d2b00a4cf376197aaeb7740c57ae49d6419ccb957893bc6a1026d2db273a77f25a2960e6c21d84dad68528bf2ebf97
6
+ metadata.gz: fe15c5b9460cc5be76a66340672db29fa5b6c12bf72acd7e3de8a6d3260f31a3da7661e1520296a73a183e82c02b91c53099d6ce6c7398a06b79887836f47e96
7
+ data.tar.gz: 7862290df41aa4d427a5267fbcfce99aa59db4c89d34166e4d3bdefdc9dca85e976c44082c1322cb5be0c7d76860cf4a9d7b7e80201b9ea62f66cfedd6aa7b94
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ # 0.27.3 2025-10-23
2
+
3
+ - Do not log Not Found errors
4
+ - Fix handling of syntax error in module
5
+ - Update dependencies
6
+
7
+ # 0.27.2 2025-10-21
8
+
9
+ - Add `Module#collection_module!` method
10
+
1
11
  # 0.27.1 2025-10-21
2
12
 
3
13
  - Fix error instantiation and error testing
data/TODO.md CHANGED
@@ -1,8 +1,5 @@
1
1
  ## Immediate
2
2
 
3
- - [ ] On internal error in module, default response should be to display page
4
- showing error, with auto refresh on file change
5
- - [ ] Do not log error backtrace for 404 errors (or other )
6
3
  - [ ] Collection - treat directories and files as collections of data.
7
4
 
8
5
  Kind of similar to the routing tree, but instead of routes it just takes a
data/lib/syntropy/app.rb CHANGED
@@ -70,13 +70,13 @@ module Syntropy
70
70
  req.route = route
71
71
  proc = route[:proc] ||= compute_route_proc(route)
72
72
  proc.(req)
73
- rescue StandardError => e
73
+ rescue ScriptError, StandardError => e
74
74
  @logger&.error(
75
75
  message: "Error while serving request: #{e.message}",
76
76
  method: req.method,
77
77
  path: req.path,
78
78
  error: e
79
- )
79
+ ) if Error.log_error?(e)
80
80
  error_handler = get_error_handler(route)
81
81
  error_handler.(req, e)
82
82
  end
@@ -8,7 +8,7 @@ module Syntropy
8
8
  Status = Qeweney::Status
9
9
 
10
10
  # By default, the HTTP status for errors is 500 Internal Server Error
11
- DEFAULT_STATUS = Qeweney::Status::INTERNAL_SERVER_ERROR
11
+ DEFAULT_STATUS = Status::INTERNAL_SERVER_ERROR
12
12
 
13
13
  # Returns the HTTP status for the given exception
14
14
  #
@@ -18,6 +18,10 @@ module Syntropy
18
18
  err.respond_to?(:http_status) ? err.http_status : DEFAULT_STATUS
19
19
  end
20
20
 
21
+ def self.log_error?(err)
22
+ http_status(err) != Status::NOT_FOUND
23
+ end
24
+
21
25
  # Creates an error with status 404 Not Found
22
26
  #
23
27
  # @return [Syntropy::Error]
@@ -49,14 +53,14 @@ module Syntropy
49
53
  #
50
54
  # @return [Integer, String] HTTP status
51
55
  def http_status
52
- @http_status || Qeweney::Status::INTERNAL_SERVER_ERROR
56
+ @http_status || Status::INTERNAL_SERVER_ERROR
53
57
  end
54
58
  end
55
59
 
56
60
  # ValidationError is raised when a validation has failed.
57
61
  class ValidationError < Error
58
62
  def initialize(msg)
59
- super(msg, Qeweney::Status::BAD_REQUEST)
63
+ super(msg, Status::BAD_REQUEST)
60
64
  end
61
65
  end
62
66
  end
@@ -53,9 +53,8 @@ module Syntropy
53
53
  # @return [void]
54
54
  def invalidate_fn(fn)
55
55
  ref = @fn_map[fn]
56
- return if !ref
57
-
58
- invalidate_ref(ref)
56
+ invalidate_ref(ref) if ref
57
+ invalidate_collection_modules
59
58
  end
60
59
 
61
60
  private
@@ -75,6 +74,14 @@ module Syntropy
75
74
  entry[:reverse_deps].each { invalidate_ref(it) }
76
75
  end
77
76
 
77
+ def invalidate_collection_modules
78
+ refs = []
79
+ @modules.each do |ref, entry|
80
+ refs << ref if entry[:module].is_collection_module?
81
+ end
82
+ refs.each { invalidate_ref(it) }
83
+ end
84
+
78
85
  # Registers reverse dependencies for the given module reference.
79
86
  #
80
87
  # @param ref [String] module reference
@@ -102,12 +109,13 @@ module Syntropy
102
109
  @fn_map[fn] = ref
103
110
  code = IO.read(fn)
104
111
  env = @env.merge(module_loader: self, ref: clean_ref(ref))
105
- m = Syntropy::Module.load(env, code, fn)
106
- add_dependencies(ref, m.__dependencies__)
107
- export_value = transform_module_export_value(m.__export_value__)
112
+ mod = Syntropy::Module.load(env, code, fn)
113
+ add_dependencies(ref, mod.__dependencies__)
114
+ export_value = transform_module_export_value(mod.__export_value__)
108
115
 
109
116
  {
110
117
  fn: fn,
118
+ module: mod,
111
119
  export_value: export_value,
112
120
  reverse_deps: []
113
121
  }
@@ -162,12 +170,6 @@ module Syntropy
162
170
  m.instance_eval(code, fn)
163
171
  env[:logger]&.info(message: "Loaded module at #{fn}")
164
172
  m
165
- rescue StandardError => e
166
- env[:logger]&.error(
167
- message: "Error while loading module #{fn}",
168
- error: e
169
- )
170
- raise
171
173
  end
172
174
 
173
175
  # Initializes a module with the given environment hash.
@@ -195,6 +197,14 @@ module Syntropy
195
197
  Syntropy.page_list(@env, ref)
196
198
  end
197
199
 
200
+ # Returns true if the module is a collection module. See also
201
+ # #collection_module!
202
+ #
203
+ # @return [bool]
204
+ def is_collection_module?
205
+ @collection_module_p
206
+ end
207
+
198
208
  private
199
209
 
200
210
  # Exports the given value. This value will be used as the module's
@@ -217,6 +227,16 @@ module Syntropy
217
227
  @module_loader.load(ref).tap { __dependencies__ << ref }
218
228
  end
219
229
 
230
+ # Marks module as a collection module. This will cause the module to be
231
+ # invalidated on every file change in dev mode, regardless if it is a
232
+ # dependency.
233
+ #
234
+ # @return [self]
235
+ def collection_module!
236
+ @collection_module_p = true
237
+ self
238
+ end
239
+
220
240
  def normalize_import_ref(ref)
221
241
  base = @ref == '' ? '/' : @ref
222
242
  if ref =~ /^\//
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Syntropy
4
- VERSION = '0.27.1'
4
+ VERSION = '0.27.3'
5
5
  end
data/syntropy.gemspec CHANGED
@@ -21,16 +21,16 @@ Gem::Specification.new do |s|
21
21
  s.required_ruby_version = '>= 3.4'
22
22
  s.executables = ['syntropy']
23
23
 
24
- s.add_dependency 'extralite', '2.13'
25
- s.add_dependency 'json', '2.13.2'
26
- s.add_dependency 'papercraft', '3.0.1'
27
- s.add_dependency 'qeweney', '0.24'
28
- s.add_dependency 'tp2', '0.19'
29
- s.add_dependency 'uringmachine', '0.18'
24
+ s.add_dependency 'extralite', '~>2.13'
25
+ s.add_dependency 'json', '~>2.15.1'
26
+ s.add_dependency 'papercraft', '~>3.0.2'
27
+ s.add_dependency 'qeweney', '~>0.24'
28
+ s.add_dependency 'tp2', '~>0.19'
29
+ s.add_dependency 'uringmachine', '~>0.18'
30
30
 
31
- s.add_dependency 'listen', '3.9.0'
32
- s.add_dependency 'logger', '1.7.0'
31
+ s.add_dependency 'listen', '~>3.9.0'
32
+ s.add_dependency 'logger', '~>1.7.0'
33
33
 
34
- s.add_development_dependency 'minitest', '5.25.5'
35
- s.add_development_dependency 'rake', '13.3.0'
34
+ s.add_development_dependency 'minitest', '~>5.26.0'
35
+ s.add_development_dependency 'rake', '~>13.3.0'
36
36
  end
@@ -0,0 +1,3 @@
1
+ ? export ->(req) {
2
+ req.respond('foobar')
3
+ }
data/test/test_app.rb CHANGED
@@ -117,6 +117,9 @@ class AppTest < Minitest::Test
117
117
 
118
118
  req = make_request(':method' => 'GET', ':path' => '/test/rss')
119
119
  assert_equal '<link>foo</link>', req.response_body
120
+
121
+ req = make_request(':method' => 'GET', ':path' => '/test/bad_mod')
122
+ assert_equal Status::INTERNAL_SERVER_ERROR, req.response_status
120
123
  end
121
124
 
122
125
  def test_app_file_watching
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.27.1
4
+ version: 0.27.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
@@ -13,140 +13,140 @@ dependencies:
13
13
  name: extralite
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
- - - '='
16
+ - - "~>"
17
17
  - !ruby/object:Gem::Version
18
18
  version: '2.13'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
- - - '='
23
+ - - "~>"
24
24
  - !ruby/object:Gem::Version
25
25
  version: '2.13'
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: json
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
- - - '='
30
+ - - "~>"
31
31
  - !ruby/object:Gem::Version
32
- version: 2.13.2
32
+ version: 2.15.1
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - '='
37
+ - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 2.13.2
39
+ version: 2.15.1
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: papercraft
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - '='
44
+ - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: 3.0.1
46
+ version: 3.0.2
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - '='
51
+ - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: 3.0.1
53
+ version: 3.0.2
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: qeweney
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - '='
58
+ - - "~>"
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0.24'
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - '='
65
+ - - "~>"
66
66
  - !ruby/object:Gem::Version
67
67
  version: '0.24'
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: tp2
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
- - - '='
72
+ - - "~>"
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0.19'
75
75
  type: :runtime
76
76
  prerelease: false
77
77
  version_requirements: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - '='
79
+ - - "~>"
80
80
  - !ruby/object:Gem::Version
81
81
  version: '0.19'
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: uringmachine
84
84
  requirement: !ruby/object:Gem::Requirement
85
85
  requirements:
86
- - - '='
86
+ - - "~>"
87
87
  - !ruby/object:Gem::Version
88
88
  version: '0.18'
89
89
  type: :runtime
90
90
  prerelease: false
91
91
  version_requirements: !ruby/object:Gem::Requirement
92
92
  requirements:
93
- - - '='
93
+ - - "~>"
94
94
  - !ruby/object:Gem::Version
95
95
  version: '0.18'
96
96
  - !ruby/object:Gem::Dependency
97
97
  name: listen
98
98
  requirement: !ruby/object:Gem::Requirement
99
99
  requirements:
100
- - - '='
100
+ - - "~>"
101
101
  - !ruby/object:Gem::Version
102
102
  version: 3.9.0
103
103
  type: :runtime
104
104
  prerelease: false
105
105
  version_requirements: !ruby/object:Gem::Requirement
106
106
  requirements:
107
- - - '='
107
+ - - "~>"
108
108
  - !ruby/object:Gem::Version
109
109
  version: 3.9.0
110
110
  - !ruby/object:Gem::Dependency
111
111
  name: logger
112
112
  requirement: !ruby/object:Gem::Requirement
113
113
  requirements:
114
- - - '='
114
+ - - "~>"
115
115
  - !ruby/object:Gem::Version
116
116
  version: 1.7.0
117
117
  type: :runtime
118
118
  prerelease: false
119
119
  version_requirements: !ruby/object:Gem::Requirement
120
120
  requirements:
121
- - - '='
121
+ - - "~>"
122
122
  - !ruby/object:Gem::Version
123
123
  version: 1.7.0
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: minitest
126
126
  requirement: !ruby/object:Gem::Requirement
127
127
  requirements:
128
- - - '='
128
+ - - "~>"
129
129
  - !ruby/object:Gem::Version
130
- version: 5.25.5
130
+ version: 5.26.0
131
131
  type: :development
132
132
  prerelease: false
133
133
  version_requirements: !ruby/object:Gem::Requirement
134
134
  requirements:
135
- - - '='
135
+ - - "~>"
136
136
  - !ruby/object:Gem::Version
137
- version: 5.25.5
137
+ version: 5.26.0
138
138
  - !ruby/object:Gem::Dependency
139
139
  name: rake
140
140
  requirement: !ruby/object:Gem::Requirement
141
141
  requirements:
142
- - - '='
142
+ - - "~>"
143
143
  - !ruby/object:Gem::Version
144
144
  version: 13.3.0
145
145
  type: :development
146
146
  prerelease: false
147
147
  version_requirements: !ruby/object:Gem::Requirement
148
148
  requirements:
149
- - - '='
149
+ - - "~>"
150
150
  - !ruby/object:Gem::Version
151
151
  version: 13.3.0
152
152
  email: sharon@noteflakes.com
@@ -236,6 +236,7 @@ files:
236
236
  - test/app/about/raise.rb
237
237
  - test/app/api+.rb
238
238
  - test/app/assets/style.css
239
+ - test/app/bad_mod.rb
239
240
  - test/app/bar.rb
240
241
  - test/app/baz.rb
241
242
  - test/app/index.html