snails 0.6.1 → 0.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 937ce9b1eb6e291efded282e837bd6b45662268fb1c157cb9be6bcc359648200
4
- data.tar.gz: b93517fcec6dc23ab51c993339e91a2bec7d35f1bbdad412fdc0ffc0eda3615c
3
+ metadata.gz: ace977fc33f80028eb415424addddbb1f6e9dcda49b35e4a852aaa7daa032524
4
+ data.tar.gz: a371db3ebc879c315e5b6b9fca7de42526963f053a2d128fb485acf07cf02214
5
5
  SHA512:
6
- metadata.gz: 398b80b121279775d0acca31128773220981aaa75aaeed4742dc70c2b2aa6e084c2f170e74fc1b1700f2fc2db6fbf936ba815cd078f755a084d674d9538e9806
7
- data.tar.gz: 4377e251ecdad20d0affd72be365aac86e78d6675b1b612f924b2b2e46d927893e4bf2e64f9a801293501720801e3ba1be26f9df90ed6a41fb0f9bebf48a9c32
6
+ metadata.gz: 6a24db7e0c46fe2bdfaa2ca0b19132116b8a39594f5bc59cd4bf14b4c5d433bb783fb1fa1702c82b36c0b94397d949dfecddc18727dba05629137d3c09db3a08
7
+ data.tar.gz: fac56d5ef6dac6db26678867090b88af56addbb792de515f835944698c079cab854110ed4e8f77f9b1ea690b6c515e5f670b032979ece8bd88b975c04924cc75
data/.gitignore CHANGED
@@ -3,3 +3,4 @@ pkg
3
3
  test
4
4
  example/Gemfile.lock
5
5
  *.sh
6
+ .ruby-version
data/example/app.rb CHANGED
@@ -3,14 +3,18 @@ require 'snails'
3
3
  require 'snails/mailer'
4
4
 
5
5
  class MyApp < Snails::App
6
- set :session_secret, 'foobar'
6
+
7
+ set :session_secret, SESSION_SECRET
8
+ set :session_domain, "app.localhost"
7
9
 
8
10
  register Snails::Assets
9
- register Snails::Sessions
11
+ register Snails::Sessions
10
12
  # register Snails::Database
11
13
 
12
14
  get '/' do
13
- 'Hello world!'
15
+ number = session[:number] || 0
16
+ session[:number] = number.to_i + 1
17
+ "<h1>Hello world!</h1><p>This is your visit number #{number}. Come again!</p>"
14
18
  end
15
19
  end
16
20
 
data/example/app2.rb ADDED
@@ -0,0 +1,19 @@
1
+ require 'bundler/setup'
2
+ require 'snails'
3
+ require 'snails/mailer'
4
+
5
+ class MyOtherApp < Snails::App
6
+
7
+ set :session_secret, SESSION_SECRET
8
+ set :session_domain, "app.localhost"
9
+
10
+ register Snails::Assets
11
+ register Snails::Sessions
12
+ # register Snails::Database
13
+
14
+ get '/' do
15
+ number = session[:number] || 0
16
+ session[:number] = number.to_i + 1
17
+ "<h1>Hello world!</h1><p>This is your visit number #{number}. Come again!</p>"
18
+ end
19
+ end
data/example/config.ru CHANGED
@@ -1,2 +1,38 @@
1
+ require 'securerandom'
2
+ SESSION_SECRET = SecureRandom.hex(32) # generates a new session cookie on each login
3
+ MAIN_DOMAIN = 'app.localhost'
4
+
1
5
  require './app'
2
- run MyApp
6
+ require './app2'
7
+
8
+ class SubdomainDispatcher
9
+ def initialize(mappings)
10
+ @mappings = mappings
11
+ end
12
+
13
+ def call(env)
14
+ subdomain = env['HTTP_HOST'].split('.').first
15
+
16
+ if subdomain.start_with?(MAIN_DOMAIN) # no domain, so see if first part of url matches one of the subdomains
17
+ parts = env['PATH_INFO'][1..].split('/')
18
+ if @mappings.key?(parts.first) # found match!
19
+ subdomain = parts.shift # get subdomain and remove it from path
20
+ env['PATH_INFO'] = parts.join('/')
21
+ else
22
+ subdomain = '' # map to root app, if present
23
+ end
24
+ end
25
+
26
+ if app = @mappings[subdomain]
27
+ app.call(env)
28
+ else
29
+ [404, { 'Content-Type' => 'text/html' }, "Not found"]
30
+ end
31
+ end
32
+ end
33
+
34
+ use Bugsnag::Rack if defined?(Bugsnag)
35
+ run SubdomainDispatcher.new({
36
+ 'one' => MyApp,
37
+ 'two' => MyOtherApp
38
+ })
data/lib/snails/app.rb CHANGED
@@ -392,6 +392,7 @@ module Snails
392
392
  app.set :sessions, {
393
393
  key: app.setting(:session_key, 'snails.session'),
394
394
  path: app.setting(:session_path, '/'),
395
+ domain: app.setting(:session_domain, nil),
395
396
  expire_after: app.setting(:session_expire_after, 2592000), # one month in seconds
396
397
  secret: app.session_secret # uses previous set :session_secret or generates one
397
398
  }
@@ -0,0 +1,57 @@
1
+ require_relative '../snails'
2
+ require 'zeitwerk'
3
+
4
+ module Snails
5
+
6
+ def self.loader
7
+ @loader ||= Loader.new
8
+ end
9
+
10
+ class Loader
11
+
12
+ attr_reader :loader
13
+ attr_accessor :load_paths, :preload_paths, :ignore_paths, :no_eager_load_paths
14
+
15
+ def initialize(loader: nil, load_paths: nil, preload_paths: nil)
16
+ @loader = loader || Zeitwerk::Loader.new
17
+ @load_paths = load_paths || DEFAULT_LOAD_PATHS
18
+ @preload_paths = preload_paths || DEFAULT_PRELOAD_PATHS
19
+ @ignore_paths = []
20
+ @no_eager_load_paths = []
21
+ end
22
+
23
+ def load!(opts = {})
24
+ # $LOAD_PATH.unshift(File.join(Snails.root, 'lib'))
25
+
26
+ load_paths.each do |path|
27
+ loader.push_dir(Snails.root.join(path))
28
+ end
29
+
30
+ ignore_paths.each do |path|
31
+ loader.ignore(Snails.root.join(path))
32
+ end
33
+
34
+ no_eager_load_paths.each do |path|
35
+ loader.do_not_eager_load(Snails.root.join(path))
36
+ end
37
+
38
+ loader.enable_reloading if opts[:enable_reload]
39
+ loader.setup
40
+
41
+ preload_paths.each do |path|
42
+ Dir.glob(Snails.root.join(path, '*.rb')).each { |f| require f }
43
+ end
44
+
45
+ loader.eager_load if opts[:eager_load]
46
+ end
47
+
48
+ def reload!
49
+ loader.reload
50
+ end
51
+
52
+ private
53
+
54
+ DEFAULT_LOAD_PATHS = ['lib']
55
+ DEFAULT_PRELOAD_PATHS = ['config/initializers']
56
+ end
57
+ end
data/lib/snails.rb CHANGED
@@ -46,5 +46,7 @@ ENV['RACK_ENV'] ||= ENV['RAILS_ENV']
46
46
 
47
47
  require 'snails/app' unless Snails.env.test?
48
48
  unless ENV['SILENT']
49
- puts "Loaded #{Snails.env} environment. (#{Time.now.to_s})"
49
+ ruby_version = "#{RUBY_VERSION}" # -p#{RUBY_PATCHLEVEL}
50
+ ruby_version += " +YJIT" if RUBY_DESCRIPTION['YJIT']
51
+ puts "Loaded \e[1m#{Snails.env}\e[0m environment with \e[1mRuby #{ruby_version}\e[0m \e[37m(#{Time.now.to_s})\e[0m"
50
52
  end
data/snails.gemspec CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "snails"
6
- s.version = '0.6.1'
6
+ s.version = '0.8.0'
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.authors = ['Tomás Pollak']
9
9
  s.email = ['tomas@forkhq.com']
@@ -17,7 +17,9 @@ Gem::Specification.new do |s|
17
17
  s.add_development_dependency "fuubar", '>= 2.3.2'
18
18
 
19
19
  s.add_runtime_dependency "i18n", ">= 1.0.1"
20
+ s.add_runtime_dependency "zeitwerk", "~> 2.6"
20
21
  s.add_runtime_dependency "sinatra-contrib", ">= 2.0.3"
22
+ s.add_runtime_dependency "activesupport", "> 6.0.0"
21
23
  # s.add_runtime_dependency "activerecord", "< 6.0"
22
24
  # s.add_runtime_dependency "sinatra-activerecord", ">= 2.0.13"
23
25
  s.add_runtime_dependency "sinatra-flash", ">= 0.3.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomás Pollak
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-30 00:00:00.000000000 Z
11
+ date: 2023-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -72,6 +72,20 @@ dependencies:
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
74
  version: 1.0.1
75
+ - !ruby/object:Gem::Dependency
76
+ name: zeitwerk
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '2.6'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '2.6'
75
89
  - !ruby/object:Gem::Dependency
76
90
  name: sinatra-contrib
77
91
  requirement: !ruby/object:Gem::Requirement
@@ -86,6 +100,20 @@ dependencies:
86
100
  - - ">="
87
101
  - !ruby/object:Gem::Version
88
102
  version: 2.0.3
103
+ - !ruby/object:Gem::Dependency
104
+ name: activesupport
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">"
108
+ - !ruby/object:Gem::Version
109
+ version: 6.0.0
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">"
115
+ - !ruby/object:Gem::Version
116
+ version: 6.0.0
89
117
  - !ruby/object:Gem::Dependency
90
118
  name: sinatra-flash
91
119
  requirement: !ruby/object:Gem::Requirement
@@ -127,9 +155,11 @@ files:
127
155
  - example/Gemfile
128
156
  - example/Rakefile
129
157
  - example/app.rb
158
+ - example/app2.rb
130
159
  - example/config.ru
131
160
  - lib/snails.rb
132
161
  - lib/snails/app.rb
162
+ - lib/snails/loader.rb
133
163
  - lib/snails/mailer.rb
134
164
  - lib/snails/markdown.rb
135
165
  - lib/snails/rspec.rb
@@ -155,8 +185,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
185
  - !ruby/object:Gem::Version
156
186
  version: 1.3.6
157
187
  requirements: []
158
- rubyforge_project:
159
- rubygems_version: 2.7.3
188
+ rubygems_version: 3.4.10
160
189
  signing_key:
161
190
  specification_version: 4
162
191
  summary: Ruby on Snails.