breezy_template 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -7,11 +7,11 @@ if Rails.version >= '4.1'
7
7
  alias_method :original_jsonify, :jsonify
8
8
 
9
9
  def jsonify(value)
10
- if ::BreezyTemplate::Template::Digest === value
10
+ if ::BreezyTemplate::Digest === value
11
11
  value
12
- elsif ::BreezyTemplate::Template::JointVar === value
12
+ elsif ::BreezyTemplate::JointVar === value
13
13
  value
14
- elsif ::BreezyTemplate::Template::DeferVar === value
14
+ elsif ::BreezyTemplate::DeferVar === value
15
15
  value
16
16
  else
17
17
  original_jsonify(value)
@@ -0,0 +1,11 @@
1
+ class BreezyTemplate
2
+ class Blank
3
+ def ==(other)
4
+ super || Blank === other
5
+ end
6
+
7
+ def empty?
8
+ true
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ BreezyTemplate = Class.new(begin
2
+ require 'active_support/proxy_object'
3
+ ActiveSupport::ProxyObject
4
+ rescue LoadError
5
+ require 'active_support/basic_object'
6
+ ActiveSupport::BasicObject
7
+ end)
@@ -1,4 +1,6 @@
1
- module BreezyTemplate
1
+ require 'breezy_template/breezy_template'
2
+
3
+ class BreezyTemplate
2
4
  module CacheExtension
3
5
  class Digest
4
6
  def initialize(digest)
@@ -18,44 +20,73 @@ module BreezyTemplate
18
20
  end
19
21
  end
20
22
 
21
- def _result(value)
22
- if _cache_options?
23
- _cache(*_cache_options) { super }
23
+ def _result(value, *args)
24
+ options = _cache_options(args[0])
25
+ if options
26
+ _cache(*options) { super }
24
27
  else
25
28
  super
26
29
  end
27
30
  end
28
31
 
32
+ def _normalize_with_cache_options(options)
33
+ return options unless options.key? :cache
34
+
35
+ options = options.dup
36
+ options[:cache] = [*options[:cache]]
37
+
38
+ if options[:cache].size == 1
39
+ options[:cache].push({})
40
+ end
41
+
42
+ options
43
+ end
44
+
29
45
  def set!(key, value = BLANK, *args)
30
46
  options = args.first || {}
31
- options = _normalize_options(options)
32
- if options[:partial] && _cache_options?
33
- _cache_options[1] ||= {}
34
- _cache_options[1][:_partial] = options[:partial]
47
+ options = _normalize_with_cache_options(options)
48
+
49
+ if options[:partial] && options[:cache]
50
+ partial_name = [*options[:partial]][0]
51
+ cache_options = options[:cache][1]
52
+ cache_options[:_partial] = partial_name
53
+ end
54
+
55
+ if ::Kernel.block_given?
56
+ super(key, value, options, ::Proc.new)
57
+ else
58
+ super(key, value, options)
35
59
  end
36
- super
37
60
  end
38
61
 
39
62
  def array!(collection=[], *attributes)
40
- options = attributes.first || {}
41
- options = _normalize_options(options)
63
+ has_option = attributes.first.is_a? ::Hash
64
+ return super if !has_option
65
+
66
+ options = attributes.first.dup
67
+ options = _normalize_with_cache_options(options)
42
68
 
43
- if options[:partial] && _cache_options?
44
- _cache_options[1] ||= {}
45
- _cache_options[1][:_partial] = options[:partial]
69
+ if options[:partial] && options[:cache]
70
+ partial_name = [*options[:partial]][0]
71
+ cache_options = options[:cache][1]
72
+ cache_options[:_partial] = partial_name
46
73
  end
47
74
 
48
- super
75
+ if ::Kernel.block_given?
76
+ super(collection, options, ::Proc.new)
77
+ else
78
+ super(collection, options)
79
+ end
49
80
  end
50
81
 
51
82
  def _mapping_element(element, opts={})
52
- if _cache_options
53
- key = _cache_options.first
83
+ if _cache_options?(opts)
84
+ key, options = _cache_options(opts)
54
85
  if ::Proc === key
55
86
  key = key.call(element)
56
87
  end
57
88
 
58
- _cache(key, opts) {
89
+ _cache(key, options) {
59
90
  _scope { yield element }
60
91
  }
61
92
  else
@@ -63,16 +94,20 @@ module BreezyTemplate
63
94
  end
64
95
  end
65
96
 
66
- def _cache_options?
67
- !!@extensions[:cache]
97
+ def _cache_options?(options)
98
+ !!options[:cache]
68
99
  end
69
100
 
70
- def _cache_options
71
- @extensions[:cache]
101
+ def _cache_options(options)
102
+ return nil if !options
103
+ options = [*options[:cache]]
104
+ key, options = options
105
+
106
+ return [key, options]
72
107
  end
73
108
 
74
109
  def _extended_options?(value)
75
- _cache_options? || super
110
+ _cache_options?(value) || super
76
111
  end
77
112
 
78
113
  def _breezy_set_cache(key, value)
@@ -90,7 +125,11 @@ module BreezyTemplate
90
125
  end
91
126
 
92
127
  def _cache(key=nil, options={})
93
- return yield self if !@context.controller.perform_caching || key.nil?
128
+ perform_caching = @context.respond_to?(:controller) && @context.controller.perform_caching
129
+
130
+ if !perform_caching || key.nil?
131
+ return yield self
132
+ end
94
133
 
95
134
  parent_js = @js
96
135
  key = _cache_key(key, options)
@@ -120,11 +159,20 @@ module BreezyTemplate
120
159
  end
121
160
 
122
161
  def _fragment_name_with_digest(key, options)
123
- if _cache_options? && _cache_options[1] && _cache_options[1][:_partial] && !options[:skip_digest]
124
- partial = _cache_options[1][:_partial]
162
+ if options && options[:_partial]
163
+ partial = options[:_partial]
125
164
  [key, _partial_digest(partial)]
126
165
  else
127
- super
166
+ if @context.respond_to?(:cache_fragment_name)
167
+ # Current compatibility, fragment_name_with_digest is private again and cache_fragment_name
168
+ # should be used instead.
169
+ @context.cache_fragment_name(key, options)
170
+ elsif @context.respond_to?(:fragment_name_with_digest)
171
+ # Backwards compatibility for period of time when fragment_name_with_digest was made public.
172
+ @context.fragment_name_with_digest(key)
173
+ else
174
+ key
175
+ end
128
176
  end
129
177
  end
130
178
  end
@@ -1,4 +1,6 @@
1
- module BreezyTemplate
1
+ require 'breezy_template/breezy_template'
2
+
3
+ class BreezyTemplate
2
4
  class Configuration
3
5
  attr_accessor :track_assets
4
6
 
@@ -1,10 +1,13 @@
1
- module BreezyTemplate
1
+ require 'breezy_template/breezy_template'
2
+
3
+ class BreezyTemplate
2
4
  module DefermentExtension
3
5
  ACTIVE_MODES = [:auto, :manual].freeze
4
6
 
5
7
  def set!(key, value = BLANK, *args)
6
- if ::Kernel.block_given? && _deferment_options?
7
- if _deferment_auto?
8
+ options = args[0]
9
+ if ::Kernel.block_given? && _deferment_options?(options)
10
+ if _deferment_auto?(options)
8
11
  @js.push(_breezy_visit_current(@path))
9
12
  end
10
13
  return _set_value key, nil
@@ -20,17 +23,16 @@ module BreezyTemplate
20
23
  "defers.push({url:'#{uri}'});"
21
24
  end
22
25
 
23
- def _deferment_options?
24
- !!@extensions[:defer] && (@search_path.nil? || @search_path.size == 0)
25
-
26
+ def _deferment_options?(options)
27
+ options && !!options[:defer] && (@search_path.nil? || @search_path.size == 0)
26
28
  end
27
29
 
28
- def _deferment_options
29
- @extensions[:defer]
30
+ def _deferment_options(options)
31
+ options[:defer]
30
32
  end
31
33
 
32
- def _deferment_auto?
33
- _deferment_options[0] == :auto
34
+ def _deferment_auto?(options)
35
+ _deferment_options(options) == :auto
34
36
  end
35
37
 
36
38
  def _set_request_url(request_path)
@@ -38,11 +40,11 @@ module BreezyTemplate
38
40
  end
39
41
 
40
42
  def _extended_options?(value)
41
- _deferment_options? || super
43
+ _deferment_options?(value) || super
42
44
  end
43
45
 
44
46
  def _mapping_element(element, options)
45
- if _deferment_options?
47
+ if _deferment_options?(options)
46
48
  if options.has_key? :key
47
49
  id_name = options[:key]
48
50
  id_val = element[id_name]
@@ -1,4 +1,5 @@
1
1
  # This was taken from jbuilder
2
+ require 'breezy_template/breezy_template'
2
3
 
3
4
  dependency_tracker = false
4
5
 
@@ -15,7 +16,7 @@ rescue LoadError
15
16
  end
16
17
 
17
18
  if dependency_tracker
18
- class BreezyTemplate::Template
19
+ class BreezyTemplate
19
20
  module DependencyTrackerMethods
20
21
  # Matches:
21
22
  # json.partial! partial: "comments/comment"
@@ -26,6 +27,8 @@ if dependency_tracker
26
27
  INDIRECT_RENDERS = /
27
28
  (?::partial\s*=>|partial:) # partial: or :partial =>
28
29
  \s* # optional whitespace
30
+ \[* # optional Bracket
31
+ \s* # optional whitespace
29
32
  (['"])([^'"]+)\1 # quoted value
30
33
  /x
31
34
 
@@ -42,6 +45,6 @@ if dependency_tracker
42
45
  end
43
46
 
44
47
  ::BreezyTemplate::DependencyTracker = Class.new(dependency_tracker::ERBTracker)
45
- ::BreezyTemplate::DependencyTracker.send :include, ::BreezyTemplate::Template::DependencyTrackerMethods
48
+ ::BreezyTemplate::DependencyTracker.send :include, ::BreezyTemplate::DependencyTrackerMethods
46
49
  dependency_tracker.register_tracker :breezy, ::BreezyTemplate::DependencyTracker
47
50
  end
@@ -1,7 +1,8 @@
1
+ require 'breezy_template/breezy_template'
1
2
  require 'action_view'
2
3
  require 'action_view/digestor'
3
4
 
4
- module BreezyTemplate
5
+ class BreezyTemplate
5
6
  module PartialDigestor
6
7
  if ::Rails.version >= '5.0'
7
8
  def _partial_digestor(options)
@@ -0,0 +1,24 @@
1
+ require 'breezy_template/breezy_template'
2
+
3
+ class BreezyTemplate
4
+ class NullError < ::NoMethodError
5
+ def self.build(key)
6
+ message = "Failed to add #{key.to_s.inspect} property to null object"
7
+ new(message)
8
+ end
9
+ end
10
+
11
+ class ArrayError < ::StandardError
12
+ def self.build(key)
13
+ message = "Failed to add #{key.to_s.inspect} property to an array"
14
+ new(message)
15
+ end
16
+ end
17
+
18
+ class MergeError < ::StandardError
19
+ def self.build(current_value, updates)
20
+ message = "Can't merge #{updates.inspect} into #{current_value.inspect}"
21
+ new(message)
22
+ end
23
+ end
24
+ end
@@ -1,11 +1,13 @@
1
- module BreezyTemplate
1
+ require 'breezy_template/breezy_template'
2
+
3
+ class BreezyTemplate
2
4
  class Handler
3
5
  cattr_accessor :default_format
4
6
  self.default_format = Mime[:js]
5
7
 
6
8
  def self.call(template)
7
9
  # this juggling is required to keep line numbers right in the error
8
- %{__already_defined = defined?(json); json||=::BreezyTemplate::Template.new(self);json._filter_by_path(breezy_filter) if defined?(breezy_filter); json._set_request_url(request.path);#{template.source}
10
+ %{__already_defined = defined?(json); json||=::BreezyTemplate.new(self);json._filter_by_path(breezy_filter) if defined?(breezy_filter); json._set_request_url(request.path);#{template.source}
9
11
  if !(__already_defined && __already_defined != "method")
10
12
  json.merge!({data: json.found! || json.empty! })
11
13
  json.key_format! :downcase
@@ -0,0 +1,34 @@
1
+ require 'breezy_template/breezy_template'
2
+ require 'active_support/core_ext/array'
3
+
4
+ class BreezyTemplate
5
+ class KeyFormatter
6
+ def initialize(*args)
7
+ @format = {}
8
+ @cache = {}
9
+
10
+ options = args.extract_options!
11
+ args.each do |name|
12
+ @format[name] = []
13
+ end
14
+ options.each do |name, parameters|
15
+ @format[name] = parameters
16
+ end
17
+ end
18
+
19
+ def initialize_copy(original)
20
+ @cache = {}
21
+ end
22
+
23
+ def format(key)
24
+ @cache[key] ||= @format.inject(key.to_s) do |result, args|
25
+ func, args = args
26
+ if ::Proc === func
27
+ func.call result, *args
28
+ else
29
+ result.send func, *args
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,4 +1,6 @@
1
- module BreezyTemplate
1
+ require 'breezy_template/breezy_template'
2
+
3
+ class BreezyTemplate
2
4
  module PartialExtension
3
5
  class DeferVar
4
6
  def initialize
@@ -37,8 +39,8 @@ module BreezyTemplate
37
39
  end
38
40
 
39
41
  def set!(key, value = BLANK, *args)
40
- options = args.first || {}
41
- options = _normalize_options(options)
42
+ options = args.last || {}
43
+
42
44
  if args.one? && _partial_options?(options)
43
45
  _set_inline_partial key, value, options
44
46
  else
@@ -47,11 +49,13 @@ module BreezyTemplate
47
49
  end
48
50
 
49
51
  def array!(collection = [], *attributes)
50
- options = attributes.first || {}
51
- options = _normalize_options(options)
52
+ options = attributes.last || {}
53
+ options = _normalize_options_for_partial(options)
52
54
 
53
55
  if attributes.one? && _partial_options?(options)
54
- _render_partial_with_options(options.merge(collection: collection))
56
+ _, opts = options[:partial]
57
+ opts.reverse_merge!(collection: collection)
58
+ _render_partial_with_options(options)
55
59
  else
56
60
  super
57
61
  end
@@ -65,6 +69,20 @@ module BreezyTemplate
65
69
  ::Hash === options && options.key?(:partial)
66
70
  end
67
71
 
72
+ def _normalize_options_for_partial(options)
73
+ if !_partial_options?(options)
74
+ return options
75
+ end
76
+
77
+ partial_options = [*options[:partial]]
78
+ partial, rest = partial_options
79
+ if partial && !rest
80
+ options.dup.merge(partial: [partial, rest || {}])
81
+ else
82
+ options
83
+ end
84
+ end
85
+
68
86
  def _partial_digest(partial)
69
87
  lookup_context = @context.lookup_context
70
88
  name = lookup_context.find(partial, lookup_context.prefixes, true).virtual_path
@@ -72,20 +90,31 @@ module BreezyTemplate
72
90
  end
73
91
 
74
92
  def _set_inline_partial(name, object, options)
75
- value = if object.nil? && options.empty?
93
+ options = _normalize_options_for_partial(options)
94
+
95
+ partial, partial_opts = options[:partial]
96
+ if partial_opts[:joint] == true
97
+ partial_opts[:joint] = name
98
+ end
99
+
100
+ value = if object.nil? && partial.empty?
76
101
  []
77
102
  else
78
103
  locals = {}
79
- locals[options[:as]] = object if !_blank?(object) && options.key?(:as)
80
- locals.merge!(options[:locals]) if options.key? :locals
104
+ locals[partial_opts[:as]] = object if !_blank?(partial_opts) && partial_opts.key?(:as)
105
+ locals.merge!(partial_opts[:locals]) if partial_opts.key? :locals
106
+ partial_opts.merge!(locals: locals)
81
107
 
82
- _scope{ _render_partial options.merge(locals: locals) }
108
+ _scope{ _render_partial(options) }
83
109
  end
84
110
 
85
- set! name, value
111
+ options = options.dup
112
+ options.delete(:partial)
113
+ set! name, value, options
86
114
  end
87
115
 
88
116
  def _render_partial(options)
117
+ partial, options = options[:partial]
89
118
  joint = options[:joint]
90
119
  if joint
91
120
  joint = joint.to_sym
@@ -95,25 +124,34 @@ module BreezyTemplate
95
124
  end
96
125
 
97
126
  options[:locals].merge! json: self
98
- @context.render options
127
+ @context.render options.merge(partial: partial)
99
128
  end
100
129
 
101
130
  def _render_partial_with_options(options)
131
+ options = _normalize_options_for_partial(options)
132
+ partial, partial_opts = options[:partial]
102
133
  ary_opts = options.dup
103
- options.reverse_merge! locals: {}
104
- options.reverse_merge! ::BreezyTemplate::Template.template_lookup_options
105
- as = options[:as]
106
134
 
107
- if options.key?(:collection)
108
- collection = options.delete(:collection)
109
- locals = options.delete(:locals)
135
+ partial_opts.reverse_merge! locals: {}
136
+ partial_opts.reverse_merge! ::BreezyTemplate.template_lookup_options
137
+ as = partial_opts[:as]
138
+
139
+ if partial_opts.key?(:collection)
140
+ collection = partial_opts.delete(:collection)
141
+ extract_joint_name = partial_opts.delete(:joint)
142
+ locals = partial_opts.delete(:locals)
110
143
 
111
144
  ary_opts.delete(:partial)
112
145
  array! collection, ary_opts do |member|
146
+
113
147
  member_locals = locals.clone
114
148
  member_locals.merge! collection: collection
115
149
  member_locals.merge! as.to_sym => member if as
116
- _render_partial options.merge(locals: member_locals)
150
+ partial_opts.merge!(locals: member_locals)
151
+ if extract_joint_name.respond_to?(:call)
152
+ partial_opts.merge!(joint: extract_joint_name.call(member))
153
+ end
154
+ _render_partial options
117
155
  end
118
156
  else
119
157
  _render_partial options