snails 0.7.0 → 0.8.1
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 +4 -4
- data/example/app.rb +3 -1
- data/example/app2.rb +19 -0
- data/example/config.ru +37 -1
- data/lib/snails/app.rb +14 -2
- data/lib/snails/loader.rb +73 -0
- data/lib/snails.rb +1 -1
- data/snails.gemspec +2 -1
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d235bda86922e62754528a0d8ebd0e875266c8101d162bed2d2791b30bbc76a7
|
4
|
+
data.tar.gz: ebffe464327f0bf09cff4cfdd5736ab9d3f8ed8866d8baa49bf77c74bf9c2870
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1085f36ee8bd4dd653635407ed22d7a5276d6203ae01da4df9066039f77e9a916f6978b9677d1b4f8357f8291976d4b6e29ef0c79e5b8d44aea0aa98e261b09f
|
7
|
+
data.tar.gz: 2a7ac9e077c693a152af80d46f52bd1292a901f9299890490248b1208e44a4c8c70c526f34c3d0b3b6f618c4d2c4186d84b7915147509379092de2c9248f5502
|
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,
|
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
|
-
|
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
@@ -98,6 +98,7 @@ module Snails
|
|
98
98
|
require 'sprockets-helpers'
|
99
99
|
|
100
100
|
cwd = Pathname.new(Dir.pwd)
|
101
|
+
|
101
102
|
app.set :sprockets, Sprockets::Environment.new(cwd)
|
102
103
|
app.set :digest_assets, false
|
103
104
|
app.set :assets_prefix, app.setting(:assets_prefix, '/assets') # URL
|
@@ -106,6 +107,7 @@ module Snails
|
|
106
107
|
app.set :assets_precompile, app.setting(:assets_precompile, %w(js/main.js css/main.css))
|
107
108
|
app.set :assets_remove_digests, app.setting(:assets_remove_digests, false)
|
108
109
|
|
110
|
+
|
109
111
|
app.configure do
|
110
112
|
app.assets_paths.each do |path|
|
111
113
|
app.sprockets.append_path cwd.join(path)
|
@@ -354,11 +356,13 @@ module Snails
|
|
354
356
|
erb(view_name.to_sym, { layout: layout }.merge(opts))
|
355
357
|
end
|
356
358
|
|
357
|
-
def show_date(
|
358
|
-
|
359
|
+
def show_date(time)
|
360
|
+
time = Time.parse(time) if time.is_a?(String) && !time.blank?
|
361
|
+
time ? time.strftime("%d de %b, %Y") : ''
|
359
362
|
end
|
360
363
|
|
361
364
|
def show_time(time)
|
365
|
+
time = Time.parse(time) if time.is_a?(String) && !time.blank?
|
362
366
|
time ? time.strftime("%d de %b, %Y a las %H:%M") : ''
|
363
367
|
end
|
364
368
|
|
@@ -417,6 +421,10 @@ module Snails
|
|
417
421
|
set :views, Snails.root.join('lib', 'views')
|
418
422
|
set :static_paths, %w(/css /img /js /files /fonts /favicon.ico)
|
419
423
|
|
424
|
+
if defined?(Snails.loader) && Snails.loader.loaded?
|
425
|
+
set :lock, true if Snails.env.development?
|
426
|
+
end
|
427
|
+
|
420
428
|
enable :method_override
|
421
429
|
enable :logging
|
422
430
|
|
@@ -455,6 +463,10 @@ module Snails
|
|
455
463
|
show_error(404)
|
456
464
|
end
|
457
465
|
|
466
|
+
after do
|
467
|
+
Snails.loader.reload! if settings.lock
|
468
|
+
end
|
469
|
+
|
458
470
|
protected
|
459
471
|
|
460
472
|
def deliver(data, code = 200, format = :json)
|
@@ -0,0 +1,73 @@
|
|
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, :postload_paths, :ignore_paths, :no_eager_load_paths
|
14
|
+
|
15
|
+
def initialize(loader: nil, load_paths: nil, preload_paths: nil, postload_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
|
+
@postload_paths = postload_paths || []
|
20
|
+
@ignore_paths = []
|
21
|
+
@no_eager_load_paths = []
|
22
|
+
end
|
23
|
+
|
24
|
+
def loaded?
|
25
|
+
@loaded
|
26
|
+
end
|
27
|
+
|
28
|
+
def load!(opts = {})
|
29
|
+
# $LOAD_PATH.unshift(File.join(Snails.root, 'lib'))
|
30
|
+
|
31
|
+
preload_paths.each do |path|
|
32
|
+
Dir.glob(Snails.root.join(path, '*.rb')).each { |f| require f }
|
33
|
+
end
|
34
|
+
|
35
|
+
load_paths.each do |path|
|
36
|
+
loader.push_dir(Snails.root.join(path))
|
37
|
+
end
|
38
|
+
|
39
|
+
ignore_paths.each do |path|
|
40
|
+
loader.ignore(Snails.root.join(path))
|
41
|
+
end
|
42
|
+
|
43
|
+
no_eager_load_paths.each do |path|
|
44
|
+
loader.do_not_eager_load(Snails.root.join(path))
|
45
|
+
end
|
46
|
+
|
47
|
+
loader.enable_reloading if opts[:enable_reload]
|
48
|
+
loader.setup
|
49
|
+
|
50
|
+
postload_paths.each do |path|
|
51
|
+
Dir.glob(Snails.root.join(path, '*.rb')).each { |f| require f }
|
52
|
+
end
|
53
|
+
|
54
|
+
loader.eager_load if opts[:eager_load]
|
55
|
+
|
56
|
+
@loaded = true
|
57
|
+
|
58
|
+
# enable reloading for already defined apps
|
59
|
+
Snails.apps.each do |app|
|
60
|
+
app.set :lock, true
|
61
|
+
end if Snails.env.dev?
|
62
|
+
end
|
63
|
+
|
64
|
+
def reload!
|
65
|
+
loader.reload
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
DEFAULT_LOAD_PATHS = ['lib']
|
71
|
+
DEFAULT_PRELOAD_PATHS = ['config/initializers']
|
72
|
+
end
|
73
|
+
end
|
data/lib/snails.rb
CHANGED
@@ -44,7 +44,7 @@ end
|
|
44
44
|
# sinatra/activerecord only 'reads' RACK_ENV, so make sure it is set
|
45
45
|
ENV['RACK_ENV'] ||= ENV['RAILS_ENV']
|
46
46
|
|
47
|
-
require 'snails/app' unless Snails.env.test?
|
47
|
+
# require 'snails/app' unless Snails.env.test?
|
48
48
|
unless ENV['SILENT']
|
49
49
|
ruby_version = "#{RUBY_VERSION}" # -p#{RUBY_PATCHLEVEL}
|
50
50
|
ruby_version += " +YJIT" if RUBY_DESCRIPTION['YJIT']
|
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
|
+
s.version = '0.8.1'
|
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.
|
4
|
+
version: 0.8.1
|
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-
|
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
|