snails 0.7.0 → 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: d83a01b55251fb5f6178f810ed1634adcd6c29eb088fdb8cdbbbef399e5d92ff
4
- data.tar.gz: 63388ea9f9d672a42aa949652217c454c18976193773c41865ba0d154ef0a394
3
+ metadata.gz: ace977fc33f80028eb415424addddbb1f6e9dcda49b35e4a852aaa7daa032524
4
+ data.tar.gz: a371db3ebc879c315e5b6b9fca7de42526963f053a2d128fb485acf07cf02214
5
5
  SHA512:
6
- metadata.gz: 7ae7bbb963a436bffe57626b16e85c66e480d4e4650466e3bf3a7a1a83de8037b1e1a7a98b9a1077ddd1c8003b336e944ef237c9eb778a4e3a8ebc8459100b5a
7
- data.tar.gz: 699378ef2f876cf6575aeada6c10b79f95326e2ad17c21534bdc855078a26962729f67c2470982aa833ac5a9667435b235291eeb7d02e08182a475c0eb6aae7e
6
+ metadata.gz: 6a24db7e0c46fe2bdfaa2ca0b19132116b8a39594f5bc59cd4bf14b4c5d433bb783fb1fa1702c82b36c0b94397d949dfecddc18727dba05629137d3c09db3a08
7
+ data.tar.gz: fac56d5ef6dac6db26678867090b88af56addbb792de515f835944698c079cab854110ed4e8f77f9b1ea690b6c515e5f670b032979ece8bd88b975c04924cc75
data/example/app.rb CHANGED
@@ -4,7 +4,9 @@ require 'snails/mailer'
4
4
 
5
5
  class MyApp < Snails::App
6
6
 
7
- set :session_secret, SecureRandom.hex(32) # generates a new session cookie on each login
7
+ set :session_secret, SESSION_SECRET
8
+ set :session_domain, "app.localhost"
9
+
8
10
  register Snails::Assets
9
11
  register Snails::Sessions
10
12
  # register Snails::Database
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
+ })
@@ -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/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.7.0'
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,6 +17,7 @@ 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"
21
22
  s.add_runtime_dependency "activesupport", "> 6.0.0"
22
23
  # s.add_runtime_dependency "activerecord", "< 6.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.7.0
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-10-19 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
@@ -141,9 +155,11 @@ files:
141
155
  - example/Gemfile
142
156
  - example/Rakefile
143
157
  - example/app.rb
158
+ - example/app2.rb
144
159
  - example/config.ru
145
160
  - lib/snails.rb
146
161
  - lib/snails/app.rb
162
+ - lib/snails/loader.rb
147
163
  - lib/snails/mailer.rb
148
164
  - lib/snails/markdown.rb
149
165
  - lib/snails/rspec.rb