aerogel-core 1.3.0 → 1.4.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/aerogel-core.gemspec +8 -2
- data/app/helpers/assets.rb +22 -8
- data/app/helpers/core.rb +82 -0
- data/app/helpers/i18n.rb +11 -0
- data/app/helpers/icon.rb +12 -0
- data/app/helpers/render.rb +89 -17
- data/app/helpers/tags.rb +18 -3
- data/app/routes/aerogel.rb +30 -0
- data/app/routes/core.rb +16 -1
- data/app/routes/i18n.rb +14 -0
- data/config/application.conf +8 -0
- data/config/development/aerogel.conf +9 -0
- data/config/production/aerogel.conf +10 -0
- data/lib/aerogel/core/application.rb +3 -0
- data/lib/aerogel/core/assets.rb +24 -0
- data/lib/aerogel/core/cache.rb +72 -0
- data/lib/aerogel/core/config.rb +10 -2
- data/lib/aerogel/core/core.rb +55 -10
- data/lib/aerogel/core/core_ext/array.rb +38 -0
- data/lib/aerogel/core/core_ext/hash.rb +48 -0
- data/lib/aerogel/core/db.rb +28 -8
- data/lib/aerogel/core/db/model.rb +52 -4
- data/lib/aerogel/core/errors.rb +23 -1
- data/lib/aerogel/core/helpers.rb +1 -1
- data/lib/aerogel/core/i18n.rb +134 -0
- data/lib/aerogel/core/i18n/number_helper.rb +126 -0
- data/lib/aerogel/core/reloader.rb +49 -5
- data/lib/aerogel/core/routes.rb +5 -3
- data/lib/aerogel/core/routes/namespace.rb +1 -1
- data/lib/aerogel/core/version.rb +3 -1
- data/locales/core/en.yml +17 -0
- data/locales/core/ru.yml +17 -0
- data/locales/db/en.yml +25 -0
- data/locales/db/ru.yml +24 -0
- data/locales/i18n-defaults/en.yml +211 -0
- data/locales/i18n-defaults/ru.yml +257 -0
- data/rake/console.rake +8 -0
- data/views/layouts/application.html.erb +1 -1
- data/views/lorem.html.erb +48 -0
- metadata +91 -3
- data/app/routes/static.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f2aa3cd909e476af3c30504c867493ffd5cee0f3
|
4
|
+
data.tar.gz: bd4abadb05d22159b7374d1ba705683745eac39c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 77d0175b72a8c6e6b072708c2c9aebffdd812243e677e86cbff40618df166e862fad185642bc3c853249d461baaa55b869aecf736445d84180fd86b742783716
|
7
|
+
data.tar.gz: 8bd415aa95e4de394c1fb0b9087b3991764ee53968f0baa1de9402669743a164e8f77ea5f34f8e98928e83a9aaf5d935edbab5b37f638b17ba2a80bb38e4860e
|
data/aerogel-core.gemspec
CHANGED
@@ -5,7 +5,7 @@ require 'aerogel/core/version'
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "aerogel-core"
|
8
|
-
spec.version = Aerogel::VERSION
|
8
|
+
spec.version = Aerogel::Core::VERSION
|
9
9
|
spec.authors = ["Alex Kukushkin"]
|
10
10
|
spec.email = ["alex@kukushk.in"]
|
11
11
|
spec.description = %q{Aerogel core module}
|
@@ -22,14 +22,20 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_dependency 'sinatra-contrib'
|
23
23
|
spec.add_dependency 'sinatra-asset-pipeline'
|
24
24
|
spec.add_dependency 'rack-flash3'
|
25
|
+
spec.add_dependency 'sinatra-redirect-with-flash'
|
26
|
+
# spec.add_dependency 'active_support' #, "~> 4.0"
|
25
27
|
spec.add_dependency 'sass'
|
26
28
|
spec.add_dependency 'coffee-script'
|
27
29
|
spec.add_dependency 'uglifier'
|
28
30
|
spec.add_dependency 'yui-compressor'
|
29
31
|
spec.add_dependency 'aerogel-configurator', "~> 1.3"
|
30
|
-
spec.add_dependency 'mongoid'
|
32
|
+
spec.add_dependency 'mongoid', "~> 3.1"
|
33
|
+
spec.add_dependency 'mongoid-tree'
|
34
|
+
spec.add_dependency 'i18n'
|
35
|
+
spec.add_dependency 'lru_redux'
|
31
36
|
|
32
37
|
spec.add_development_dependency "bundler", "~> 1.3"
|
33
38
|
spec.add_development_dependency "rake"
|
39
|
+
spec.add_development_dependency "pry"
|
34
40
|
end
|
35
41
|
|
data/app/helpers/assets.rb
CHANGED
@@ -1,11 +1,25 @@
|
|
1
|
-
#
|
1
|
+
# Appends to and retrieves from declared assets stack.
|
2
2
|
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# or:
|
6
|
-
# <% assets 'controller/name' %> # for controller specific assets
|
3
|
+
# To include application assets and retrieve assets tags:
|
4
|
+
# <%= assets %>
|
7
5
|
#
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
# To include/display controller's assets:
|
7
|
+
# <%= assets 'controller/name' %>
|
8
|
+
#
|
9
|
+
# To append to assets stack on a per-view basis:
|
10
|
+
# # in layout:
|
11
|
+
# <%= assets 'controller/name' %>
|
12
|
+
#
|
13
|
+
# # in view:
|
14
|
+
# <% assets 'controller/name/view' %> # note that helper output is ignored here, view asset tags
|
15
|
+
# # are rendered in layout
|
16
|
+
#
|
17
|
+
def assets( filename = nil )
|
18
|
+
@assets_stack ||= []
|
19
|
+
filename = :application if @assets_stack.blank? && filename.blank?
|
20
|
+
@assets_stack.unshift filename if filename.present?
|
21
|
+
@assets_stack.map do |assets_filename|
|
22
|
+
(stylesheet_tag assets_filename.to_s) +
|
23
|
+
(javascript_tag assets_filename.to_s)
|
24
|
+
end.join("\n")
|
11
25
|
end
|
data/app/helpers/core.rb
CHANGED
@@ -9,3 +9,85 @@ def logger( name = nil )
|
|
9
9
|
env['rack.logger.'+name.to_s] or raise("Logger with name '#{name}' is not registered")
|
10
10
|
end
|
11
11
|
end
|
12
|
+
|
13
|
+
# Returns current_url
|
14
|
+
# To return current url in a different locale:
|
15
|
+
# current_url locale: :ru
|
16
|
+
#
|
17
|
+
def current_url( opts = {} )
|
18
|
+
url = URI.unescape( request.path_info )
|
19
|
+
opts.present? ? url_to( url, opts ) : url
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns current locale
|
23
|
+
#
|
24
|
+
def current_locale
|
25
|
+
I18n.locale
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns current hostname.
|
29
|
+
# If hostname is set in application configuration files, it has precedence.
|
30
|
+
# Otherwise, hostname is inferred from the +request.host+, stripped from potential
|
31
|
+
# locale name.
|
32
|
+
#
|
33
|
+
def current_hostname
|
34
|
+
return config.hostname! if config.hostname?
|
35
|
+
hostname_parts = request.host.split '.'
|
36
|
+
hostname_parts.shift if I18n.available_locales.include?( hostname_parts.first.to_sym )
|
37
|
+
hostname_parts.join "."
|
38
|
+
end
|
39
|
+
|
40
|
+
# Constructs an URL to a resource.
|
41
|
+
#
|
42
|
+
# Options passed in +opts+ will be appended to URL as a query string,
|
43
|
+
# except some reserved options which have special meaning:
|
44
|
+
# :locale => constructs URL with a certain locale
|
45
|
+
# :scheme => constructs URL with a certain protocol
|
46
|
+
# :fqdn => constructs full qualified URL, including hostname and protocol
|
47
|
+
#
|
48
|
+
# Example:
|
49
|
+
# url_to "/bar", locale: :de, page: 2, order: :name # => "http://de.example.org/bar?page=2&order=name"
|
50
|
+
#
|
51
|
+
def url_to( url, opts = {} )
|
52
|
+
hostname = nil
|
53
|
+
if opts[:fqdn] || opts[:scheme]
|
54
|
+
opts[:locale] ||= current_locale
|
55
|
+
end
|
56
|
+
if opts[:locale]
|
57
|
+
unless I18n.available_locales.include? opts[:locale]
|
58
|
+
raise ArgumentError.new("Unavailable locale '#{opts[:locale]}' passed to #url_to helper")
|
59
|
+
end
|
60
|
+
if opts[:locale] == I18n.default_locale
|
61
|
+
hostname = current_hostname
|
62
|
+
else
|
63
|
+
hostname = "#{opts[:locale]}.#{current_hostname}"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
query_string = opts.except( :locale, :fqdn, :scheme ).map{|k,v| "#{k}=#{h v}"}.join "&"
|
67
|
+
if query_string.present?
|
68
|
+
if url =~ /\?/
|
69
|
+
query_string = "&#{query_string}"
|
70
|
+
else
|
71
|
+
query_string = "?#{query_string}"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
scheme = opts[:scheme] || request.scheme || 'http'
|
75
|
+
scheme_hostname = hostname.nil? ? '' : "#{scheme}://#{hostname}"
|
76
|
+
"#{scheme_hostname}#{url}#{query_string}"
|
77
|
+
end
|
78
|
+
|
79
|
+
# xhr-conscious redirect.
|
80
|
+
#
|
81
|
+
def redirect(uri, *args)
|
82
|
+
if request.xhr?
|
83
|
+
if Hash === args.first
|
84
|
+
opts = args.first
|
85
|
+
[:error, :notice, :warning].each do |flash_key|
|
86
|
+
flash[flash_key] = opts[flash_key] if opts[flash_key].present?
|
87
|
+
end
|
88
|
+
end
|
89
|
+
halt 200, {'Content-Type' => 'text/javascript'}, "window.location.href=\"#{uri}\""
|
90
|
+
else
|
91
|
+
super( uri, *args )
|
92
|
+
end
|
93
|
+
end
|
data/app/helpers/i18n.rb
ADDED
data/app/helpers/icon.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# Renders icon from icon font.
|
2
|
+
# First part of the +name+ defines icon family.
|
3
|
+
#
|
4
|
+
# Example:
|
5
|
+
# <%= icon 'fa-caret-right' %> # => icon 'caret-right' from Font Awesome (fa) family
|
6
|
+
# <%= icon 'glyphicon-tick' %> #=> icon 'tick' from Boostrap glyphicons
|
7
|
+
#
|
8
|
+
def icon( name, opts = {} )
|
9
|
+
icon_family = name.split('-').first
|
10
|
+
icon_class = "#{icon_family} #{name} #{opts[:class]}"
|
11
|
+
tag :i, "", opts.merge( class: icon_class )
|
12
|
+
end
|
data/app/helpers/render.rb
CHANGED
@@ -1,24 +1,96 @@
|
|
1
|
-
# module Aerogel::Helpers
|
2
1
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
# Escapes html string.
|
3
|
+
#
|
4
|
+
def h( str )
|
5
|
+
Rack::Utils.escape_html(str)
|
6
|
+
end
|
7
|
+
|
8
|
+
# Displays text only first time the helper is called in this request
|
9
|
+
# Usage:
|
10
|
+
# render_once "hello, world"
|
11
|
+
# Or:
|
12
|
+
# render_once :hello_message, "hello, world"
|
13
|
+
#
|
14
|
+
def render_once( *args )
|
15
|
+
@render_once_hash ||= {}
|
16
|
+
if Symbol === args.first
|
17
|
+
key = args.shift
|
18
|
+
text = args.shift
|
19
|
+
else
|
20
|
+
key = args.shift
|
21
|
+
text = key
|
22
|
+
end
|
23
|
+
return '' if @render_once_hash.key? key
|
24
|
+
@render_once_hash[key] = true
|
25
|
+
text
|
26
|
+
end
|
27
|
+
|
28
|
+
# Renders erb template.
|
29
|
+
#
|
30
|
+
def view( name, opts = {} )
|
31
|
+
ts = Time.now
|
32
|
+
default_opts = {}
|
33
|
+
default_opts[:layout] = :"layouts/#{layout}.html" if layout.present?
|
34
|
+
#if settings.development?
|
35
|
+
erb( "#{name}.html".to_sym, default_opts.merge(opts) )+( "<!-- %s: %.3fs -->" % [name, Time.now - ts] )
|
36
|
+
#else
|
37
|
+
# erb( "#{name}.html".to_sym, default_opts.merge(opts) )
|
38
|
+
#end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Renders partial erb template.
|
42
|
+
#
|
43
|
+
def partial( name, opts = {} )
|
44
|
+
if opts.key?( :cacheable ) && config.aerogel.cache.enabled?
|
45
|
+
Aerogel::Cache.cacheable current_locale, name, opts[:cacheable] do |key|
|
46
|
+
__uncached_partial( name, opts )+"<!-- cache #{key} @ #{Time.now} -->"
|
47
|
+
end
|
48
|
+
else
|
49
|
+
__uncached_partial( name, opts )
|
7
50
|
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def __uncached_partial( name, opts = {} )
|
54
|
+
name_parts = name.to_s.split('/')
|
55
|
+
partial_name = name_parts[-1]
|
56
|
+
name_parts[-1] = '_'+partial_name+".html"
|
57
|
+
template_name = name_parts.join('/').to_sym
|
58
|
+
opts[:layout] = false
|
8
59
|
|
9
|
-
#
|
10
|
-
|
11
|
-
|
12
|
-
erb( "#{name}.html".to_sym, *args )
|
60
|
+
# render single template
|
61
|
+
unless opts.key? :collection
|
62
|
+
return erb template_name, opts
|
13
63
|
end
|
14
64
|
|
15
|
-
#
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
opts[:
|
21
|
-
erb
|
65
|
+
# render collection
|
66
|
+
out = ""
|
67
|
+
opts[:locals] ||= {}
|
68
|
+
opts[:collection].each do |object|
|
69
|
+
opts[:locals][partial_name.to_sym] = object
|
70
|
+
out += opts[:delimiter] if opts[:delimiter].present? && out.present?
|
71
|
+
out += erb template_name, opts.except( :collection, :delimiter, :cacheable )
|
22
72
|
end
|
73
|
+
out
|
74
|
+
end
|
75
|
+
|
76
|
+
# Sets/gets page title.
|
77
|
+
#
|
78
|
+
# Example:
|
79
|
+
# page_title "Home page" # sets page title
|
80
|
+
# page_title # => "Home page"
|
81
|
+
#
|
82
|
+
# Or in views:
|
83
|
+
# <% page_title "Home page" %> # sets page title
|
84
|
+
# <%= page_title %> # gets page title
|
85
|
+
#
|
86
|
+
def page_title( value = nil )
|
87
|
+
@page_title = value unless value.nil?
|
88
|
+
@page_title
|
89
|
+
end
|
23
90
|
|
24
|
-
#
|
91
|
+
# Sets/gets current layout.
|
92
|
+
#
|
93
|
+
def layout( value = nil )
|
94
|
+
@layout = value unless value.nil?
|
95
|
+
@layout
|
96
|
+
end
|
data/app/helpers/tags.rb
CHANGED
@@ -8,7 +8,7 @@ def tag( name, *args, &block )
|
|
8
8
|
end
|
9
9
|
attrs = args.shift || {}
|
10
10
|
# t_attrs = attrs.map{|k,v| v.nil? ? " #{k}" : " #{k}=\"#{h(v)}\""}
|
11
|
-
t_attrs = attrs.map{|k,v| v.nil? ? " #{k}" : " #{k}=\"#{(v)}\""}
|
11
|
+
t_attrs = attrs.map{|k,v| v.nil? ? " #{k}" : " #{k}=\"#{h(v)}\""}
|
12
12
|
if content
|
13
13
|
output = "<#{name}#{t_attrs.join}>"+content+"</#{name}>"
|
14
14
|
else
|
@@ -24,6 +24,21 @@ end
|
|
24
24
|
|
25
25
|
# Creates <a href=''..>...</a> tag.
|
26
26
|
#
|
27
|
-
def link_to( url,
|
28
|
-
|
27
|
+
def link_to( url, *args, &block )
|
28
|
+
opts = (String === args.first) ? args[1] : args[0]
|
29
|
+
opts = {
|
30
|
+
href: url
|
31
|
+
}.deep_merge( opts || {} )
|
32
|
+
if String === args.first
|
33
|
+
args[1] = opts
|
34
|
+
else
|
35
|
+
args[0] = opts
|
36
|
+
end
|
37
|
+
tag :a, *args, &block
|
38
|
+
end
|
39
|
+
|
40
|
+
# Creates a <button ...>...</button> tag.
|
41
|
+
#
|
42
|
+
def button_to( url, text = url, opts = {} )
|
43
|
+
tag :button, text, opts.merge( url: url )
|
29
44
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# Diagnostic routes for aerogel application
|
2
|
+
#
|
3
|
+
|
4
|
+
namespace "/aerogel" do
|
5
|
+
|
6
|
+
# Displays aerogel status info
|
7
|
+
#
|
8
|
+
get "/status" do
|
9
|
+
ruby_version = "#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
|
10
|
+
modules_loaded = Aerogel.registered_paths.map{|p| p[:module_name]}.sort
|
11
|
+
[
|
12
|
+
"ruby:#{ruby_version}, aerogel-core v#{Aerogel::Core::VERSION}-#{settings.environment}",
|
13
|
+
"modules loaded: #{modules_loaded.join(", ")}",
|
14
|
+
"application path: #{Aerogel.application_path}",
|
15
|
+
"reloader: #{ config.aerogel.reloader? ? 'enabled' : 'disabled' }",
|
16
|
+
"cache: #{ config.aerogel.cache.enabled? ? 'enabled' : 'disabled' }"
|
17
|
+
].join("<br/>\n")
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
# Displays cache info
|
22
|
+
#
|
23
|
+
get "/cache" do
|
24
|
+
[
|
25
|
+
( config.aerogel.cache.enabled? ? "enabled" : "disabled" ),
|
26
|
+
"objects: #{Aerogel::Cache.keys.size} of #{config.aerogel.cache.max_size}"
|
27
|
+
].join("<br/>\n")
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
data/app/routes/core.rb
CHANGED
@@ -1,9 +1,24 @@
|
|
1
|
+
# serve static files
|
2
|
+
get "/*" do |filename|
|
3
|
+
pass if filename.blank?
|
4
|
+
path = Aerogel.get_resource( :public, filename )
|
5
|
+
pass unless path
|
6
|
+
pass unless File.file? path
|
7
|
+
send_file path
|
8
|
+
end
|
9
|
+
|
10
|
+
# serve default root
|
1
11
|
get "/" do
|
2
12
|
view :index
|
3
13
|
end
|
4
14
|
|
15
|
+
# serve default root actions
|
5
16
|
get "/:action" do
|
6
|
-
|
17
|
+
begin
|
18
|
+
view params['action']
|
19
|
+
rescue Errno::ENOENT
|
20
|
+
pass
|
21
|
+
end
|
7
22
|
end
|
8
23
|
|
9
24
|
not_found do
|
data/app/routes/i18n.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
if config.locales.guess_from_hostname?
|
2
|
+
|
3
|
+
before do
|
4
|
+
default_locale = I18n.default_locale
|
5
|
+
request_locale = request.host.split(".").first.to_sym
|
6
|
+
locale = I18n.available_locales.include?( request_locale ) ? request_locale : default_locale
|
7
|
+
if locale == default_locale && config.hostname? && request.host != config.hostname
|
8
|
+
redirect current_url( locale: default_locale )
|
9
|
+
# flash[:debug] = "redirecto to canonical: #{current_url( locale: default_locale )}"
|
10
|
+
end
|
11
|
+
I18n.locale = locale
|
12
|
+
end
|
13
|
+
|
14
|
+
end # config.locales.guess_from_hostname?
|