liquid-rails 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.coveralls.yml +2 -0
- data/.gitignore +24 -0
- data/.rspec +1 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +17 -0
- data/Gemfile +12 -0
- data/Guardfile +33 -0
- data/LICENSE.txt +22 -0
- data/README.md +140 -0
- data/Rakefile +27 -0
- data/gemfiles/rails_32.gemfile +11 -0
- data/gemfiles/rails_40.gemfile +11 -0
- data/gemfiles/rails_41.gemfile +11 -0
- data/lib/liquid-rails.rb +23 -0
- data/lib/liquid-rails/drops/collection_drop.rb +91 -0
- data/lib/liquid-rails/drops/drop.rb +114 -0
- data/lib/liquid-rails/drops/droppable.rb +22 -0
- data/lib/liquid-rails/file_system.rb +14 -0
- data/lib/liquid-rails/filters/asset_tag_filter.rb +25 -0
- data/lib/liquid-rails/filters/asset_url_filter.rb +37 -0
- data/lib/liquid-rails/filters/date_filter.rb +19 -0
- data/lib/liquid-rails/filters/google_static_map_url_filter.rb +30 -0
- data/lib/liquid-rails/filters/misc_filter.rb +47 -0
- data/lib/liquid-rails/filters/number_filter.rb +24 -0
- data/lib/liquid-rails/filters/sanitize_filter.rb +19 -0
- data/lib/liquid-rails/filters/text_filter.rb +47 -0
- data/lib/liquid-rails/filters/translate_filter.rb +13 -0
- data/lib/liquid-rails/filters/url_filter.rb +24 -0
- data/lib/liquid-rails/matchers.rb +5 -0
- data/lib/liquid-rails/railtie.rb +26 -0
- data/lib/liquid-rails/rspec/drop_example_group.rb +38 -0
- data/lib/liquid-rails/rspec/drop_matchers.rb +159 -0
- data/lib/liquid-rails/rspec/filter_example_group.rb +24 -0
- data/lib/liquid-rails/rspec/tag_example_group.rb +24 -0
- data/lib/liquid-rails/rspec/view_controller_context.rb +44 -0
- data/lib/liquid-rails/tags/content_for_tag.rb +68 -0
- data/lib/liquid-rails/tags/csrf_meta_tags.rb +11 -0
- data/lib/liquid-rails/tags/google_analytics_tag.rb +43 -0
- data/lib/liquid-rails/tags/javascript_tag.rb +22 -0
- data/lib/liquid-rails/tags/paginate_tag.rb +117 -0
- data/lib/liquid-rails/template_handler.rb +44 -0
- data/lib/liquid-rails/version.rb +5 -0
- data/liquid-rails.gemspec +26 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/controllers/home_controller.rb +25 -0
- data/spec/dummy/app/controllers/pages_controller.rb +16 -0
- data/spec/dummy/app/helpers/application_helper.rb +5 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/home/_partial.liquid +1 -0
- data/spec/dummy/app/views/home/index.liquid +1 -0
- data/spec/dummy/app/views/home/index_partial.liquid +4 -0
- data/spec/dummy/app/views/home/index_partial_with_full_path.liquid +4 -0
- data/spec/dummy/app/views/home/index_with_filter.liquid +2 -0
- data/spec/dummy/app/views/home/index_with_layout.liquid +1 -0
- data/spec/dummy/app/views/layouts/application.liquid +2 -0
- data/spec/dummy/app/views/pages/index_without_filter.liquid +2 -0
- data/spec/dummy/app/views/shared/_partial.liquid +1 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +25 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +29 -0
- data/spec/dummy/config/environments/production.rb +80 -0
- data/spec/dummy/config/environments/test.rb +36 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +17 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +4 -0
- data/spec/dummy/config/locales/km.yml +4 -0
- data/spec/dummy/config/routes.rb +10 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/public/404.html +58 -0
- data/spec/dummy/public/422.html +58 -0
- data/spec/dummy/public/500.html +57 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/fixtures/poro.rb +58 -0
- data/spec/lib/liquid-rails/drops/drop_spec.rb +119 -0
- data/spec/lib/liquid-rails/filters/asset_tag_filter_spec.rb +22 -0
- data/spec/lib/liquid-rails/filters/asset_url_filter_spec.rb +34 -0
- data/spec/lib/liquid-rails/filters/google_static_map_url_filter_spec.rb +23 -0
- data/spec/lib/liquid-rails/filters/misc_filter_spec.rb +26 -0
- data/spec/lib/liquid-rails/filters/translate_filter_spec.rb +25 -0
- data/spec/lib/liquid-rails/railtie_spec.rb +9 -0
- data/spec/lib/liquid-rails/rspec/drop_matchers_spec.rb +34 -0
- data/spec/lib/liquid-rails/tags/content_for_tag_spec.rb +27 -0
- data/spec/lib/liquid-rails/tags/csrf_meta_tag_spec.rb +16 -0
- data/spec/lib/liquid-rails/tags/google_analtyics_tag_spec.rb +31 -0
- data/spec/lib/liquid-rails/tags/javascript_tag_spec.rb +14 -0
- data/spec/lib/liquid-rails/tags/paginate_tag_spec.rb +96 -0
- data/spec/lib/liquid-rails/template_handler_spec.rb +53 -0
- data/spec/spec_helper.rb +44 -0
- data/spec/support/delegate_matcher.rb +60 -0
- metadata +261 -0
@@ -0,0 +1,114 @@
|
|
1
|
+
module Liquid
|
2
|
+
module Rails
|
3
|
+
class Drop < ::Liquid::Drop
|
4
|
+
|
5
|
+
class << self
|
6
|
+
attr_accessor :_attributes
|
7
|
+
attr_accessor :_associations
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.inherited(base)
|
11
|
+
base._attributes = []
|
12
|
+
base._associations = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.attributes(*attrs)
|
16
|
+
@_attributes.concat attrs
|
17
|
+
|
18
|
+
attrs.each do |attr|
|
19
|
+
next if method_defined?(attr)
|
20
|
+
|
21
|
+
define_method(attr) do
|
22
|
+
object.send(attr) if object.respond_to?(attr, true)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# By default, `Product` maps to `ProductDrop`.
|
28
|
+
# Array of products maps to `Liquid::Rails::CollectionDrop`.
|
29
|
+
def self.drop_class_for(resource)
|
30
|
+
if resource.respond_to?(:to_ary)
|
31
|
+
Liquid::Rails::CollectionDrop
|
32
|
+
else
|
33
|
+
if self == Liquid::Rails::Drop
|
34
|
+
resource.drop_class || Liquid::Rails::Drop
|
35
|
+
else
|
36
|
+
self
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Create a drop instance when it cannot be inferred.
|
42
|
+
def self.dropify(resource, options={})
|
43
|
+
drop_class = if options[:class_name]
|
44
|
+
options[:class_name].constantize
|
45
|
+
else
|
46
|
+
drop_class_for(resource)
|
47
|
+
end
|
48
|
+
|
49
|
+
drop_class.new(resource, options.except(:class_name))
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.belongs_to(*attrs)
|
53
|
+
associate(:belongs_to, attrs)
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.has_many(*attrs)
|
57
|
+
associate(:has_many, attrs)
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.associate(type, attrs)
|
61
|
+
options = attrs.extract_options!
|
62
|
+
self._associations = _associations.dup
|
63
|
+
|
64
|
+
attrs.each do |attr|
|
65
|
+
next if method_defined?(attr)
|
66
|
+
|
67
|
+
define_method attr do
|
68
|
+
value = instance_variable_get("@_#{attr}")
|
69
|
+
return value if value
|
70
|
+
|
71
|
+
association = object.send(attr)
|
72
|
+
return nil if association.nil?
|
73
|
+
|
74
|
+
drop_instance = Liquid::Rails::Drop.dropify(association, options)
|
75
|
+
instance_variable_set("@_#{attr}", drop_instance)
|
76
|
+
end
|
77
|
+
|
78
|
+
self._associations[attr] = { type: type, options: options }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# Wraps an object in a new instance of the drop.
|
83
|
+
def initialize(object, options={})
|
84
|
+
@object = object
|
85
|
+
end
|
86
|
+
|
87
|
+
def attributes
|
88
|
+
@attributes ||= self.class._attributes.dup.each_with_object({}) do |name, hash|
|
89
|
+
hash[name.to_s] = send(name)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def as_json(options={})
|
94
|
+
attributes.as_json(options)
|
95
|
+
end
|
96
|
+
|
97
|
+
def to_json(options={})
|
98
|
+
as_json.to_json(options)
|
99
|
+
end
|
100
|
+
|
101
|
+
def before_method(method)
|
102
|
+
attributes[method.to_s]
|
103
|
+
end
|
104
|
+
|
105
|
+
def inspect
|
106
|
+
"#<#{self.class.name} @object: #{object.inspect} @attributes: #{attributes.inspect}>"
|
107
|
+
end
|
108
|
+
|
109
|
+
protected
|
110
|
+
|
111
|
+
attr_reader :object
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Liquid
|
2
|
+
module Rails
|
3
|
+
module Droppable
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
def to_liquid
|
7
|
+
drop_class.new(self)
|
8
|
+
end
|
9
|
+
alias_method :dropify, :to_liquid
|
10
|
+
|
11
|
+
def drop_class
|
12
|
+
self.class.drop_class
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
def drop_class
|
17
|
+
"#{self.name}Drop".safe_constantize
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'liquid/file_system'
|
2
|
+
|
3
|
+
module Liquid
|
4
|
+
module Rails
|
5
|
+
class FileSystem < ::Liquid::LocalFileSystem
|
6
|
+
def read_template_file(template_path, context)
|
7
|
+
controller_name = context.registers[:controller].controller_name
|
8
|
+
template_path = "#{controller_name}/#{template_path}" unless template_path.include?('/')
|
9
|
+
|
10
|
+
super
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Liquid
|
2
|
+
module Rails
|
3
|
+
module AssetTagFilter
|
4
|
+
delegate \
|
5
|
+
:audio_tag,
|
6
|
+
:auto_discovery_link_tag,
|
7
|
+
:favicon_link_tag,
|
8
|
+
:image_alt,
|
9
|
+
:image_tag,
|
10
|
+
:javascript_include_tag,
|
11
|
+
:stylesheet_link_tag,
|
12
|
+
:video_tag,
|
13
|
+
|
14
|
+
to: :h
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def h
|
19
|
+
@h ||= @context.registers[:view]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
Liquid::Template.register_filter(Liquid::Rails::AssetTagFilter)
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Liquid
|
2
|
+
module Rails
|
3
|
+
module AssetUrlFilter
|
4
|
+
delegate \
|
5
|
+
:asset_path,
|
6
|
+
:asset_url,
|
7
|
+
|
8
|
+
:audio_path,
|
9
|
+
:audio_url,
|
10
|
+
|
11
|
+
:font_path,
|
12
|
+
:font_url,
|
13
|
+
|
14
|
+
:image_path,
|
15
|
+
:image_url,
|
16
|
+
|
17
|
+
:javascript_path,
|
18
|
+
:javascript_url,
|
19
|
+
|
20
|
+
:stylesheet_path,
|
21
|
+
:stylesheet_url,
|
22
|
+
|
23
|
+
:video_path,
|
24
|
+
:video_url,
|
25
|
+
|
26
|
+
to: :h
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def h
|
31
|
+
@h ||= @context.registers[:view]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
Liquid::Template.register_filter(Liquid::Rails::AssetUrlFilter)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Liquid
|
2
|
+
module Rails
|
3
|
+
module DateFilter
|
4
|
+
delegate \
|
5
|
+
:distance_of_time_in_words,
|
6
|
+
:time_ago_in_words,
|
7
|
+
|
8
|
+
to: :h
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def h
|
13
|
+
@h ||= @context.registers[:view]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
Liquid::Template.register_filter(Liquid::Rails::DateFilter)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Liquid
|
2
|
+
module Rails
|
3
|
+
module GoogleStaticMapUrlFilter
|
4
|
+
|
5
|
+
# size: '600x300'
|
6
|
+
#
|
7
|
+
# Available keys inside options
|
8
|
+
# center: '40.714728,-73.998672'
|
9
|
+
# zoom: 13
|
10
|
+
# maptype: 'roadmap', 'satellite', 'terrain', or 'hybrid'
|
11
|
+
# markers: an array of this 'color:blue|label:S|40.702147,-74.015794'
|
12
|
+
# or string with semicolon
|
13
|
+
def google_static_map_url(size, options={})
|
14
|
+
markers = options.delete('markers')
|
15
|
+
markers = if markers
|
16
|
+
markers = markers.split(';') if markers.is_a?(String)
|
17
|
+
markers.map { |marker| { markers: marker }.to_query }
|
18
|
+
else
|
19
|
+
''
|
20
|
+
end
|
21
|
+
options = options.merge('size' => size)
|
22
|
+
querystring = [options.to_query, markers].delete_if { |value| value.blank? }.join('&')
|
23
|
+
|
24
|
+
"https://maps.googleapis.com/maps/api/staticmap?#{querystring}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
Liquid::Template.register_filter(Liquid::Rails::GoogleStaticMapUrlFilter)
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Liquid
|
4
|
+
module Rails
|
5
|
+
module MiscFilter
|
6
|
+
# Get the nth element of the passed in array
|
7
|
+
def index(array, position)
|
8
|
+
array.at(position) if array.respond_to?(:at)
|
9
|
+
end
|
10
|
+
|
11
|
+
def random(input)
|
12
|
+
rand(input.to_i)
|
13
|
+
end
|
14
|
+
|
15
|
+
def jsonify(object)
|
16
|
+
JSON.dump(object)
|
17
|
+
end
|
18
|
+
|
19
|
+
# If condition is true, the class_name is returned. Otherwise, it returns nil.
|
20
|
+
# class_name: css class name
|
21
|
+
# condition: boolean
|
22
|
+
def toggle_class_name(class_name, condition)
|
23
|
+
condition ? class_name : nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def default_pagination(paginate)
|
27
|
+
html = []
|
28
|
+
html << %(<span class="prev">#{link_to(paginate['previous']['title'], paginate['previous']['url'])}</span>) if paginate['previous']
|
29
|
+
|
30
|
+
for part in paginate['parts']
|
31
|
+
if part['is_link']
|
32
|
+
html << %(<span class="page">#{link_to(part['title'], part['url'])}</span>)
|
33
|
+
elsif part['title'].to_i == paginate['current_page'].to_i
|
34
|
+
html << %(<span class="page current">#{part['title']}</span>)
|
35
|
+
else
|
36
|
+
html << %(<span class="deco">#{part['title']}</span>)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
html << %(<span class="next">#{link_to(paginate['next']['title'], paginate['next']['url'])}</span>) if paginate['next']
|
41
|
+
html.join(' ')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
Liquid::Template.register_filter(Liquid::Rails::MiscFilter)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Liquid
|
2
|
+
module Rails
|
3
|
+
module NumberFilter
|
4
|
+
delegate \
|
5
|
+
:number_to_phone,
|
6
|
+
:number_to_currency,
|
7
|
+
:number_to_percentage,
|
8
|
+
:number_with_delimiter,
|
9
|
+
:number_with_precision,
|
10
|
+
:number_to_human_size,
|
11
|
+
:number_to_human,
|
12
|
+
|
13
|
+
to: :h
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def h
|
18
|
+
@h ||= @context.registers[:view]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
Liquid::Template.register_filter(Liquid::Rails::NumberFilter)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Liquid
|
2
|
+
module Rails
|
3
|
+
module SanitizeFilter
|
4
|
+
delegate \
|
5
|
+
:strip_tags,
|
6
|
+
:strip_links,
|
7
|
+
|
8
|
+
to: :h
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def h
|
13
|
+
@h ||= @context.registers[:view]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
Liquid::Template.register_filter(Liquid::Rails::SanitizeFilter)
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Liquid
|
2
|
+
module Rails
|
3
|
+
module TextFilter
|
4
|
+
delegate \
|
5
|
+
:truncate,
|
6
|
+
:highlight,
|
7
|
+
:excerpt,
|
8
|
+
:pluralize,
|
9
|
+
:word_wrap,
|
10
|
+
:simple_format,
|
11
|
+
|
12
|
+
to: :h
|
13
|
+
|
14
|
+
# right justify and padd a string
|
15
|
+
def rjust(input, integer, padstr = '')
|
16
|
+
input.to_s.rjust(integer, padstr)
|
17
|
+
end
|
18
|
+
|
19
|
+
# left justify and padd a string
|
20
|
+
def ljust(input, integer, padstr = '')
|
21
|
+
input.to_s.ljust(integer, padstr)
|
22
|
+
end
|
23
|
+
|
24
|
+
def underscore(input)
|
25
|
+
input.to_s.gsub(' ', '_').gsub('/', '_').underscore
|
26
|
+
end
|
27
|
+
|
28
|
+
def dasherize(input)
|
29
|
+
input.to_s.gsub(' ', '-').gsub('/', '-').dasherize
|
30
|
+
end
|
31
|
+
|
32
|
+
def concat(input, *args)
|
33
|
+
result = input.to_s
|
34
|
+
args.flatten.each { |a| result << a.to_s }
|
35
|
+
result
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def h
|
41
|
+
@h ||= @context.registers[:view]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
Liquid::Template.register_filter(Liquid::Rails::TextFilter)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Liquid
|
2
|
+
module Rails
|
3
|
+
module TranslateFilter
|
4
|
+
def translate(key, locale = nil, scope = nil)
|
5
|
+
locale ||= ::I18n.locale.to_s
|
6
|
+
|
7
|
+
@context.registers[:view].translate(key.to_s, locale: locale, scope: scope)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
Liquid::Template.register_filter Liquid::Rails::TranslateFilter
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Liquid
|
2
|
+
module Rails
|
3
|
+
module UrlFilter
|
4
|
+
|
5
|
+
def link_to(name, url, options={})
|
6
|
+
@context.registers[:view].link_to(name, url.to_s, options)
|
7
|
+
end
|
8
|
+
|
9
|
+
def link_to_unless_current(name, url, options={})
|
10
|
+
@context.registers[:view].link_to_unless_current(name, url.to_s, options)
|
11
|
+
end
|
12
|
+
|
13
|
+
def mail_to(email_address, name=nil, options={})
|
14
|
+
@context.registers[:view].mail_to(email_address, name, options)
|
15
|
+
end
|
16
|
+
|
17
|
+
def current_page?(path)
|
18
|
+
@context.registers[:view].current_page?(path.to_s)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
Liquid::Template.register_filter(Liquid::Rails::UrlFilter)
|