snails 0.7.0 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
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