syntropy 0.34.4 → 0.35.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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/bin/syntropy +1 -1
  4. data/cmd/console.rb +1 -1
  5. data/{examples → cmd/new}/template/.gitignore +1 -0
  6. data/cmd/new/template/Dockerfile +25 -0
  7. data/{examples → cmd/new}/template/Gemfile +1 -1
  8. data/cmd/new/template/README.md +40 -0
  9. data/cmd/new/template/docker-compose.yml +46 -0
  10. data/cmd/new.rb +46 -0
  11. data/lib/syntropy/module_loader.rb +4 -0
  12. data/lib/syntropy/version.rb +1 -1
  13. metadata +40 -36
  14. /data/{examples → cmd/new}/template/app/_layout/default.rb +0 -0
  15. /data/{examples → cmd/new}/template/app/_lib/database.rb +0 -0
  16. /data/{examples → cmd/new}/template/app/_schema/2026-01-01-initial.rb +0 -0
  17. /data/{examples → cmd/new}/template/app/assets/style.css +0 -0
  18. /data/{examples → cmd/new}/template/app/index.rb +0 -0
  19. /data/{examples → cmd/new}/template/app/test.rb +0 -0
  20. /data/{examples → cmd/new}/template/config/development.rb +0 -0
  21. /data/{examples → cmd/new}/template/config/production.rb +0 -0
  22. /data/{examples → cmd/new}/template/config/test.rb +0 -0
  23. /data/{examples → cmd/new}/template/test/test_app.rb +0 -0
  24. /data/cmd/{setup/template → new/template_old}/site/.gitignore +0 -0
  25. /data/cmd/{setup/template → new/template_old}/site/Dockerfile +0 -0
  26. /data/cmd/{setup/template → new/template_old}/site/Gemfile +0 -0
  27. /data/cmd/{setup/template → new/template_old}/site/README.md +0 -0
  28. /data/cmd/{setup/template → new/template_old}/site/bin/console +0 -0
  29. /data/cmd/{setup/template → new/template_old}/site/bin/restart +0 -0
  30. /data/cmd/{setup/template → new/template_old}/site/bin/server +0 -0
  31. /data/cmd/{setup/template → new/template_old}/site/bin/start +0 -0
  32. /data/cmd/{setup/template → new/template_old}/site/bin/stop +0 -0
  33. /data/cmd/{setup/template → new/template_old}/site/docker-compose.yml +0 -0
  34. /data/cmd/{setup/template → new/template_old}/site/proxy/Dockerfile +0 -0
  35. /data/cmd/{setup/template → new/template_old}/site/proxy/etc/Caddyfile +0 -0
  36. /data/cmd/{setup/template → new/template_old}/site/proxy/etc/tls_auto +0 -0
  37. /data/cmd/{setup/template → new/template_old}/site/proxy/etc/tls_cloudflare +0 -0
  38. /data/cmd/{setup/template → new/template_old}/site/proxy/etc/tls_custom +0 -0
  39. /data/cmd/{setup/template → new/template_old}/site/proxy/etc/tls_selfsigned +0 -0
  40. /data/cmd/{setup/template → new/template_old}/site/site/_layout/default.rb +0 -0
  41. /data/cmd/{setup/template → new/template_old}/site/site/about.md +0 -0
  42. /data/cmd/{setup/template → new/template_old}/site/site/articles/cage.rb +0 -0
  43. /data/cmd/{setup/template → new/template_old}/site/site/articles/index.rb +0 -0
  44. /data/cmd/{setup/template → new/template_old}/site/site/assets/css/style.css +0 -0
  45. /data/cmd/{setup/template → new/template_old}/site/site/assets/img/syntropy.png +0 -0
  46. /data/cmd/{setup/template → new/template_old}/site/site/index.rb +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6db3fba37a6c6dbc673424d2f68a83164b5a802e569862cfc6757aa128b454a2
4
- data.tar.gz: c447710a87fd8c9833e6a677488c6be8cdc441fa5f0e5aa1729c223316e0af54
3
+ metadata.gz: 90b51e20e3a93a2b92bca677eddfe21efdd929d7378499f012dfb4c733336ddd
4
+ data.tar.gz: 3f873ae675918b8601f8144daca4041b7f90c490dcdda1d32143ad9c1ab13d75
5
5
  SHA512:
6
- metadata.gz: 3858b134e15456c71cfd2639c588c98014837aa5a695f1c32a5f1bd4438d4da3a3c82fd9a4e9955396e6827e3e6d49f95ec5116b3ccce77cf856173b7ef0c746
7
- data.tar.gz: 86297d5dc498b1130f66039e3792ea06bc51848f66002c231af13b38e2efa6c2f3f274ac3a22c9b3f8172a9e72c6b1f3ebabcb7fb296c2eb6792bee03659a98d
6
+ metadata.gz: 40a3b22e7d24ab92be72b5552702ec5e6ca878ea8731537d552323e3dca5252b0ce965add0270a6bda710e8d20d32478060adee740f7acc33e386255daf44882
7
+ data.tar.gz: 4129035e2daca7068eda05ced8b78604b10fbc39fd67aae20da3de5eb53b880b395c47d70795ec39e282cca50e65e2b3a878853ff8fd2e47e95bd2cb7cf80711
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ # 0.35.0 2026-06-04
2
+
3
+ - Add `syntropy new` command
4
+ - Finalize work on new app template
5
+
1
6
  # 0.34.4 2026-06-03
2
7
 
3
8
  - Really fix running test in watch mode with docker compose
data/bin/syntropy CHANGED
@@ -11,5 +11,5 @@ cmd = 'help' if cmd !~ /^[a-z]+$/
11
11
  fn = cmd_fn(cmd)
12
12
  fn = cmd_fn('help') if !File.file?(fn)
13
13
 
14
- puts SYNTROPY_BANNER
14
+ # puts SYNTROPY_BANNER
15
15
  require(fn)
data/cmd/console.rb CHANGED
@@ -15,7 +15,7 @@ env = {
15
15
  }
16
16
 
17
17
  parser = OptionParser.new do |o|
18
- o.banner = 'Usage: syntropy serve [options]'
18
+ o.banner = 'Usage: syntropy console [options]'
19
19
 
20
20
  o.on('-a', '--app PATH', 'Set app directory (default: ./app') do |path|
21
21
  env[:app_root] = path
@@ -1,2 +1,3 @@
1
1
  Gemfile.lock
2
2
  storage/*
3
+ vendor/bundle
@@ -0,0 +1,25 @@
1
+ FROM ruby:4.0-slim AS base
2
+ WORKDIR /syntropy
3
+ RUN apt-get update -qq && apt-get install -y \
4
+ curl \
5
+ build-essential \
6
+ libpq-dev \
7
+ libsqlite3-dev \
8
+ libssl-dev \
9
+ libyaml-dev \
10
+ pkg-config && \
11
+ rm -rf /var/lib/apt/lists /var/cache/apt/archives
12
+
13
+ ENV BUNDLE_PATH="/usr/local/bundle"
14
+ COPY Gemfile Gemfile.lock ./
15
+ RUN bundle install
16
+
17
+ RUN groupadd --system --gid 1000 syntropy && \
18
+ useradd syntropy --uid 1000 --gid 1000 --create-home --shell /bin/bash
19
+ USER 1000:1000
20
+
21
+ EXPOSE 1234
22
+
23
+ # Start the main process
24
+ # CMD ["bash"]
25
+ CMD ["bundle", "exec", "syntropy", "serve"]
@@ -1,3 +1,3 @@
1
1
  source 'https://gem.coop'
2
2
 
3
- gem 'syntropy', '~>0.34.3'
3
+ gem 'syntropy', '~>0.34.4'
@@ -0,0 +1,40 @@
1
+ # My awesome Syntropy app
2
+
3
+ ## Installation
4
+
5
+ ```bash
6
+ $ bundle install
7
+ ```
8
+
9
+ ## Running the web server
10
+
11
+ ```bash
12
+ $ bundle exec syntropy serve
13
+ ```
14
+
15
+ ## Starting the app console
16
+
17
+ ```bash
18
+ $ bundle exec syntropy console
19
+ ```
20
+
21
+ ### Running tests
22
+
23
+ ```bash
24
+ $ bundle exec syntropy tests
25
+ ```
26
+
27
+ ### Usage with Docker Compose
28
+
29
+ You can also run the app on Docker Compose:
30
+
31
+ ```bash
32
+ # run the app server
33
+ $ docker compose up
34
+
35
+ # run the console
36
+ $ docker compose run --remove-orphans console
37
+
38
+ # run tests
39
+ $ docker compose run --remove-orphans test
40
+ ```
@@ -0,0 +1,46 @@
1
+ #version: "3.8"
2
+
3
+ services:
4
+ app_server:
5
+ build: .
6
+ security_opt:
7
+ - seccomp:unconfined
8
+ volumes:
9
+ - .:/syntropy
10
+ ports:
11
+ - "1234:1234"
12
+ stop_signal: SIGINT
13
+ stop_grace_period: 10s
14
+ restart: always
15
+ healthcheck:
16
+ test: "curl 'http://localhost:1234/'"
17
+ interval: "30s"
18
+ timeout: "3s"
19
+ start_period: "5s"
20
+ retries: 3
21
+ console:
22
+ build: .
23
+ command: bundle exec syntropy console
24
+ stdin_open: true # docker run -i
25
+ tty: true
26
+ security_opt:
27
+ - seccomp:unconfined
28
+ profiles:
29
+ - dev
30
+ volumes:
31
+ - .:/syntropy
32
+ stop_signal: SIGINT
33
+ restart: never
34
+ test:
35
+ build: .
36
+ command: bundle exec syntropy test -w
37
+ stdin_open: true # docker run -i
38
+ tty: true
39
+ security_opt:
40
+ - seccomp:unconfined
41
+ profiles:
42
+ - dev
43
+ volumes:
44
+ - .:/syntropy
45
+ stop_signal: SIGINT
46
+ restart: never
data/cmd/new.rb ADDED
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'optparse'
4
+ require 'fileutils'
5
+
6
+ parser = OptionParser.new do |o|
7
+ o.banner = 'Usage: syntropy new NAME [options]'
8
+
9
+ o.on('-h', '--help', 'Show this help message') do
10
+ puts o
11
+ exit
12
+ end
13
+ end
14
+
15
+ begin
16
+ parser.parse!
17
+ rescue OptionParser::InvalidOption
18
+ puts parser
19
+ exit
20
+ rescue StandardError => e
21
+ p e
22
+ puts e.message
23
+ puts e.backtrace.join("\n")
24
+ exit
25
+ end
26
+
27
+ path = ARGV.shift
28
+ if !path
29
+ $stdout << 'Please enter a name for your app: '
30
+ path = $stdin.gets
31
+ end
32
+
33
+ full_path = File.expand_path(path)
34
+ puts "Creating app in #{full_path}"
35
+
36
+ template_path = File.join(__dir__, 'new/template')
37
+
38
+ begin
39
+ `mkdir -p "#{path}"`
40
+ `cp -r #{template_path}/* "#{path}/"`
41
+ puts "Your app is ready in #{path}"
42
+ rescue => e
43
+ p e
44
+ p e.backtrace
45
+ exit(1)
46
+ end
@@ -199,6 +199,7 @@ module Syntropy
199
199
  env[:logger]&.info(message: "Loaded module at #{fn}")
200
200
  m
201
201
  rescue SyntaxError => e
202
+ env[:logger]&.error(message: "Error while loading module at #{fn}", error: e)
202
203
  STDERR.puts("\n#{e.message}")
203
204
 
204
205
  if (m = e.message.match(/^(.+)\: syntax/))
@@ -209,6 +210,9 @@ module Syntropy
209
210
  else
210
211
  raise e
211
212
  end
213
+ rescue => e
214
+ env[:logger]&.error(message: "Error while loading module at #{fn}", error: e)
215
+ raise e
212
216
  end
213
217
 
214
218
  # Initializes a module with the given environment hash.
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Syntropy
4
- VERSION = '0.34.4'
4
+ VERSION = '0.35.0'
5
5
  end
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.34.4
4
+ version: 0.35.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
@@ -170,30 +170,46 @@ files:
170
170
  - cmd/_banner.rb
171
171
  - cmd/console.rb
172
172
  - cmd/help.rb
173
+ - cmd/new.rb
174
+ - cmd/new/template/.gitignore
175
+ - cmd/new/template/Dockerfile
176
+ - cmd/new/template/Gemfile
177
+ - cmd/new/template/README.md
178
+ - cmd/new/template/app/_layout/default.rb
179
+ - cmd/new/template/app/_lib/database.rb
180
+ - cmd/new/template/app/_schema/2026-01-01-initial.rb
181
+ - cmd/new/template/app/assets/style.css
182
+ - cmd/new/template/app/index.rb
183
+ - cmd/new/template/app/test.rb
184
+ - cmd/new/template/config/development.rb
185
+ - cmd/new/template/config/production.rb
186
+ - cmd/new/template/config/test.rb
187
+ - cmd/new/template/docker-compose.yml
188
+ - cmd/new/template/test/test_app.rb
189
+ - cmd/new/template_old/site/.gitignore
190
+ - cmd/new/template_old/site/Dockerfile
191
+ - cmd/new/template_old/site/Gemfile
192
+ - cmd/new/template_old/site/README.md
193
+ - cmd/new/template_old/site/bin/console
194
+ - cmd/new/template_old/site/bin/restart
195
+ - cmd/new/template_old/site/bin/server
196
+ - cmd/new/template_old/site/bin/start
197
+ - cmd/new/template_old/site/bin/stop
198
+ - cmd/new/template_old/site/docker-compose.yml
199
+ - cmd/new/template_old/site/proxy/Dockerfile
200
+ - cmd/new/template_old/site/proxy/etc/Caddyfile
201
+ - cmd/new/template_old/site/proxy/etc/tls_auto
202
+ - cmd/new/template_old/site/proxy/etc/tls_cloudflare
203
+ - cmd/new/template_old/site/proxy/etc/tls_custom
204
+ - cmd/new/template_old/site/proxy/etc/tls_selfsigned
205
+ - cmd/new/template_old/site/site/_layout/default.rb
206
+ - cmd/new/template_old/site/site/about.md
207
+ - cmd/new/template_old/site/site/articles/cage.rb
208
+ - cmd/new/template_old/site/site/articles/index.rb
209
+ - cmd/new/template_old/site/site/assets/css/style.css
210
+ - cmd/new/template_old/site/site/assets/img/syntropy.png
211
+ - cmd/new/template_old/site/site/index.rb
173
212
  - cmd/serve.rb
174
- - cmd/setup/template/site/.gitignore
175
- - cmd/setup/template/site/Dockerfile
176
- - cmd/setup/template/site/Gemfile
177
- - cmd/setup/template/site/README.md
178
- - cmd/setup/template/site/bin/console
179
- - cmd/setup/template/site/bin/restart
180
- - cmd/setup/template/site/bin/server
181
- - cmd/setup/template/site/bin/start
182
- - cmd/setup/template/site/bin/stop
183
- - cmd/setup/template/site/docker-compose.yml
184
- - cmd/setup/template/site/proxy/Dockerfile
185
- - cmd/setup/template/site/proxy/etc/Caddyfile
186
- - cmd/setup/template/site/proxy/etc/tls_auto
187
- - cmd/setup/template/site/proxy/etc/tls_cloudflare
188
- - cmd/setup/template/site/proxy/etc/tls_custom
189
- - cmd/setup/template/site/proxy/etc/tls_selfsigned
190
- - cmd/setup/template/site/site/_layout/default.rb
191
- - cmd/setup/template/site/site/about.md
192
- - cmd/setup/template/site/site/articles/cage.rb
193
- - cmd/setup/template/site/site/articles/index.rb
194
- - cmd/setup/template/site/site/assets/css/style.css
195
- - cmd/setup/template/site/site/assets/img/syntropy.png
196
- - cmd/setup/template/site/site/index.rb
197
213
  - cmd/test.rb
198
214
  - docker-compose.yml
199
215
  - examples/basic/bad.rb
@@ -235,18 +251,6 @@ files:
235
251
  - examples/mcp-oauth/app/signin.rb
236
252
  - examples/mcp-oauth/test/test_app.rb
237
253
  - examples/mcp-oauth/test/test_oauth.rb
238
- - examples/template/.gitignore
239
- - examples/template/Gemfile
240
- - examples/template/app/_layout/default.rb
241
- - examples/template/app/_lib/database.rb
242
- - examples/template/app/_schema/2026-01-01-initial.rb
243
- - examples/template/app/assets/style.css
244
- - examples/template/app/index.rb
245
- - examples/template/app/test.rb
246
- - examples/template/config/development.rb
247
- - examples/template/config/production.rb
248
- - examples/template/config/test.rb
249
- - examples/template/test/test_app.rb
250
254
  - lib/syntropy.rb
251
255
  - lib/syntropy/app.rb
252
256
  - lib/syntropy/applets/builtin/auto_refresh/watch.js
File without changes
File without changes
File without changes
File without changes