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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d83a01b55251fb5f6178f810ed1634adcd6c29eb088fdb8cdbbbef399e5d92ff
4
- data.tar.gz: 63388ea9f9d672a42aa949652217c454c18976193773c41865ba0d154ef0a394
3
+ metadata.gz: d235bda86922e62754528a0d8ebd0e875266c8101d162bed2d2791b30bbc76a7
4
+ data.tar.gz: ebffe464327f0bf09cff4cfdd5736ab9d3f8ed8866d8baa49bf77c74bf9c2870
5
5
  SHA512:
6
- metadata.gz: 7ae7bbb963a436bffe57626b16e85c66e480d4e4650466e3bf3a7a1a83de8037b1e1a7a98b9a1077ddd1c8003b336e944ef237c9eb778a4e3a8ebc8459100b5a
7
- data.tar.gz: 699378ef2f876cf6575aeada6c10b79f95326e2ad17c21534bdc855078a26962729f67c2470982aa833ac5a9667435b235291eeb7d02e08182a475c0eb6aae7e
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, 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
+ })
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(date)
358
- date ? date.strftime("%d de %b, %Y") : ''
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.7.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.7.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-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