breezy 0.1.4 → 0.2.0
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 +4 -4
- data/lib/assets/javascript/breezy.js +6067 -0
- data/lib/breezy.rb +0 -7
- data/lib/breezy/configuration.rb +9 -3
- data/lib/breezy/helpers.rb +1 -1
- data/lib/breezy/render.rb +1 -1
- data/lib/breezy/version.rb +1 -1
- data/lib/generators/breezy/view/templates/view.js +17 -0
- data/lib/generators/breezy/view/templates/view.js.breezy +2 -0
- data/lib/generators/breezy/view/templates/view.jsx +21 -0
- data/lib/generators/breezy/view/view_generator.rb +40 -7
- data/lib/install/mobile.rb +54 -0
- data/lib/install/templates/mobile/app.js +84 -0
- data/lib/install/templates/mobile/app.json +6 -0
- data/lib/install/templates/mobile/package.json +32 -0
- data/lib/install/templates/mobile/rn-cli.config.js +4 -0
- data/lib/install/templates/web/application.js +62 -0
- data/lib/install/web.rb +72 -0
- data/lib/tasks/install.rake +46 -0
- data/test/render_test.rb +2 -2
- data/test/test_helper.rb +2 -0
- metadata +37 -48
- data/README.md +0 -338
- data/lib/assets/javascripts/breezy.coffee +0 -4
- data/lib/assets/javascripts/breezy/component_url.coffee +0 -61
- data/lib/assets/javascripts/breezy/controller.coffee +0 -197
- data/lib/assets/javascripts/breezy/csrf_token.coffee +0 -9
- data/lib/assets/javascripts/breezy/doubly_linked_list.coffee +0 -57
- data/lib/assets/javascripts/breezy/parallel_queue.coffee +0 -35
- data/lib/assets/javascripts/breezy/progress_bar.coffee +0 -139
- data/lib/assets/javascripts/breezy/remote.coffee +0 -136
- data/lib/assets/javascripts/breezy/snapshot.coffee +0 -100
- data/lib/assets/javascripts/breezy/start.coffee +0 -60
- data/lib/assets/javascripts/breezy/utils.coffee +0 -174
- data/lib/breezy/active_support.rb +0 -21
- data/lib/breezy_template.rb +0 -320
- data/lib/breezy_template/deferment_extension.rb +0 -48
- data/lib/breezy_template/dependency_tracker.rb +0 -47
- data/lib/breezy_template/digestor.rb +0 -30
- data/lib/breezy_template/handler.rb +0 -43
- data/lib/breezy_template/partial_extension.rb +0 -87
- data/lib/breezy_template/search_extension.rb +0 -108
- data/lib/generators/breezy/install/install_generator.rb +0 -61
- data/lib/generators/breezy/install/templates/Default.js.jsx +0 -7
- data/lib/generators/breezy/install/templates/View.js.jsx +0 -7
- data/lib/generators/breezy/install/templates/boot.js +0 -5
- data/lib/generators/breezy/view/templates/view.js.jsx +0 -8
- data/test/blade_helper.rb +0 -22
- data/test/breezy_template_test.rb +0 -1095
- data/test/dependency_tracker_test.rb +0 -66
@@ -1,21 +0,0 @@
|
|
1
|
-
# https://github.com/rails/jbuilder/issues/204
|
2
|
-
|
3
|
-
if Rails.version >= '4.1'
|
4
|
-
module ActiveSupport
|
5
|
-
module JSON
|
6
|
-
module Encoding
|
7
|
-
class JSONGemEncoder
|
8
|
-
alias_method :original_jsonify, :jsonify
|
9
|
-
|
10
|
-
def jsonify(value)
|
11
|
-
if ::BreezyTemplate::Template::Digest === value
|
12
|
-
value
|
13
|
-
else
|
14
|
-
original_jsonify(value)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/lib/breezy_template.rb
DELETED
@@ -1,320 +0,0 @@
|
|
1
|
-
require 'jbuilder'
|
2
|
-
require 'digest/md5'
|
3
|
-
require 'action_view'
|
4
|
-
require 'breezy_template/digestor'
|
5
|
-
require 'breezy_template/handler'
|
6
|
-
require 'breezy_template/partial_extension'
|
7
|
-
require 'breezy_template/deferment_extension'
|
8
|
-
require 'breezy_template/search_extension'
|
9
|
-
|
10
|
-
module BreezyTemplate
|
11
|
-
class Template < ::Jbuilder
|
12
|
-
include PartialDigestor
|
13
|
-
|
14
|
-
prepend PartialExtension
|
15
|
-
prepend SearchExtension
|
16
|
-
prepend DefermentExtension
|
17
|
-
|
18
|
-
class << self
|
19
|
-
attr_accessor :template_lookup_options
|
20
|
-
end
|
21
|
-
|
22
|
-
self.template_lookup_options = { handlers: [:breezy] }
|
23
|
-
|
24
|
-
|
25
|
-
class Digest
|
26
|
-
def initialize(digest)
|
27
|
-
@digest = "Breezy.cache(\"#{digest}\")"
|
28
|
-
end
|
29
|
-
|
30
|
-
def to_json(*)
|
31
|
-
@digest
|
32
|
-
end
|
33
|
-
|
34
|
-
def as_json(*)
|
35
|
-
self
|
36
|
-
end
|
37
|
-
|
38
|
-
def encode_json(*)
|
39
|
-
@digest
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def initialize(context, *args)
|
44
|
-
@context = context
|
45
|
-
@js = []
|
46
|
-
@path = []
|
47
|
-
super(*args)
|
48
|
-
end
|
49
|
-
|
50
|
-
def empty!
|
51
|
-
attributes = @attributes
|
52
|
-
@attributes = {}
|
53
|
-
attributes
|
54
|
-
end
|
55
|
-
|
56
|
-
def _breezy_visit_current(path)
|
57
|
-
uri = ::URI.parse(@request_path)
|
58
|
-
qry = ::URI.decode_www_form(uri.query || '') << ["_breezy_filter", path.join('.')]
|
59
|
-
uri.query = ::URI.encode_www_form(qry)
|
60
|
-
"Breezy.visit('#{uri}', {async: true, pushState: false});"
|
61
|
-
end
|
62
|
-
|
63
|
-
def _blank
|
64
|
-
BLANK
|
65
|
-
end
|
66
|
-
|
67
|
-
def method_missing(*args)
|
68
|
-
key = args[0]
|
69
|
-
@path.push(key)
|
70
|
-
if ::Kernel.block_given?
|
71
|
-
args = _args_for_set_with_block(*args)
|
72
|
-
set!(*args, &::Proc.new)
|
73
|
-
else
|
74
|
-
args = _args_for_set(*args)
|
75
|
-
set!(*args)
|
76
|
-
end
|
77
|
-
ensure
|
78
|
-
@path.pop
|
79
|
-
end
|
80
|
-
|
81
|
-
def set!(key, value = BLANK, *args)
|
82
|
-
options = args.first || {}
|
83
|
-
options = _normalize_options(options)
|
84
|
-
return super if !_cache_options?(options) && !_deferment_options?(options)
|
85
|
-
|
86
|
-
result = if ::Kernel.block_given?
|
87
|
-
_ensure_valid_key(key)
|
88
|
-
_cache(*options[:cache]) { _scope { yield self } }
|
89
|
-
elsif ::Jbuilder === value
|
90
|
-
# json.age 32
|
91
|
-
# json.person another_jbuilder
|
92
|
-
# { "age": 32, "person": { ... }
|
93
|
-
_ensure_valid_key(key)
|
94
|
-
_cache(*options[:cache]) { value.attributes! }
|
95
|
-
else
|
96
|
-
# json.age 32
|
97
|
-
# { "age": 32 }
|
98
|
-
_ensure_valid_key(key)
|
99
|
-
_cache(*options[:cache]) { value }
|
100
|
-
end
|
101
|
-
|
102
|
-
_set_value key, result
|
103
|
-
end
|
104
|
-
|
105
|
-
def child!(options = {})
|
106
|
-
return super(&::Proc.new) if !_cache_options?(options)
|
107
|
-
options = _normalize_options(options)
|
108
|
-
|
109
|
-
@attributes = [] unless ::Array === @attributes
|
110
|
-
@attributes << _cache(*options[:cache]) {
|
111
|
-
_scope { yield self }
|
112
|
-
}
|
113
|
-
end
|
114
|
-
|
115
|
-
def array!(collection = [], *attributes)
|
116
|
-
options = attributes.first || {}
|
117
|
-
options = _normalize_options(options)
|
118
|
-
|
119
|
-
collection = [] if collection.nil?
|
120
|
-
collection = _prepare_collection_for_map(collection)
|
121
|
-
array = if ::Kernel.block_given?
|
122
|
-
_map_collection(collection, options, &::Proc.new)
|
123
|
-
elsif attributes.any?
|
124
|
-
_map_collection(collection, options) { |element| extract! element, *attributes }
|
125
|
-
else
|
126
|
-
collection.to_a
|
127
|
-
end
|
128
|
-
|
129
|
-
merge! array #remove this depednacy
|
130
|
-
end
|
131
|
-
|
132
|
-
def target!
|
133
|
-
js = _breezy_return(@attributes)
|
134
|
-
@js.push(js)
|
135
|
-
"(function(){#{@js.join}})()"
|
136
|
-
end
|
137
|
-
|
138
|
-
private
|
139
|
-
def _merge_values(current_value, updates)
|
140
|
-
# Always use the new values. This is because cached values
|
141
|
-
# are no longer a Ruby object. They are JS values and can't
|
142
|
-
# be merged.
|
143
|
-
|
144
|
-
updates
|
145
|
-
end
|
146
|
-
|
147
|
-
def _prepare_collection_for_map(collection)
|
148
|
-
collection
|
149
|
-
end
|
150
|
-
|
151
|
-
def _args_for_set_with_block(*args)
|
152
|
-
key = args[0]
|
153
|
-
if ::Hash === args[1] && _extended_options?(args[1])
|
154
|
-
options = args[1]
|
155
|
-
[key, BLANK, options]
|
156
|
-
else
|
157
|
-
[key, BLANK]
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
def _args_for_set(*args)
|
162
|
-
if args.length == 3
|
163
|
-
key, value, options = args
|
164
|
-
|
165
|
-
[key, value, options]
|
166
|
-
elsif args.length == 2 && _extended_options?(args[1])
|
167
|
-
options = args[1]
|
168
|
-
key = args[0]
|
169
|
-
|
170
|
-
[key, BLANK, options]
|
171
|
-
else
|
172
|
-
key, value = args
|
173
|
-
|
174
|
-
[key, value]
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
|
-
def _extended_options?(value)
|
179
|
-
_partial_options?(value) || _cache_options?(value) || _deferment_options?(value)
|
180
|
-
end
|
181
|
-
|
182
|
-
def _mapping_element(element, options)
|
183
|
-
opts = options.dup
|
184
|
-
if opts[:cache]
|
185
|
-
opts[:cache] = opts[:cache].dup
|
186
|
-
|
187
|
-
if ::Array === opts[:cache] && ::Proc === opts[:cache].first
|
188
|
-
key_proc = opts[:cache][0]
|
189
|
-
opts[:cache][0] = key_proc.call(element)
|
190
|
-
end
|
191
|
-
end
|
192
|
-
_cache(*opts[:cache]) {
|
193
|
-
_scope { yield element }
|
194
|
-
}
|
195
|
-
end
|
196
|
-
|
197
|
-
def _map_collection(collection, options)
|
198
|
-
@path.push(nil)
|
199
|
-
collection.map.with_index do |element, i|
|
200
|
-
if options.has_key? :key
|
201
|
-
id_name = options[:key]
|
202
|
-
id_val = element[id_name]
|
203
|
-
@path[-1] = "#{id_name}=#{id_val}"
|
204
|
-
else
|
205
|
-
@path[-1] = i
|
206
|
-
end
|
207
|
-
|
208
|
-
_mapping_element(element, options, &::Proc.new)
|
209
|
-
|
210
|
-
end - [BLANK]
|
211
|
-
ensure
|
212
|
-
@path.pop
|
213
|
-
end
|
214
|
-
|
215
|
-
def _cache_key(key, options={})
|
216
|
-
key = _fragment_name_with_digest(key, options)
|
217
|
-
key = url_for(key).split('://', 2).last if ::Hash === key
|
218
|
-
key = ::ActiveSupport::Cache.expand_cache_key(key, :jbuilder)
|
219
|
-
|
220
|
-
::Digest::MD5.hexdigest(key.to_s).tap do |digest|
|
221
|
-
_logger.try :debug, "Cache key :#{key} was digested to #{digest}"
|
222
|
-
end
|
223
|
-
end
|
224
|
-
|
225
|
-
def _cache(key=nil, options={})
|
226
|
-
return yield self if !@context.controller.perform_caching || key.nil?
|
227
|
-
|
228
|
-
parent_js = @js
|
229
|
-
key = _cache_key(key, options)
|
230
|
-
@js = []
|
231
|
-
|
232
|
-
blank_or_value = begin
|
233
|
-
::Rails.cache.fetch(key, options) do
|
234
|
-
result = yield self
|
235
|
-
if result !=BLANK
|
236
|
-
@js << _breezy_set_cache(key, result)
|
237
|
-
@js.join
|
238
|
-
else
|
239
|
-
BLANK
|
240
|
-
end
|
241
|
-
end
|
242
|
-
ensure
|
243
|
-
@js = parent_js
|
244
|
-
end
|
245
|
-
|
246
|
-
if blank_or_value == BLANK
|
247
|
-
BLANK
|
248
|
-
else
|
249
|
-
v = blank_or_value
|
250
|
-
@js.push(v)
|
251
|
-
Digest.new(key)
|
252
|
-
end
|
253
|
-
end
|
254
|
-
|
255
|
-
def _breezy_set_cache(key, value)
|
256
|
-
"Breezy.cache(\"#{key}\", #{_dump(value)});"
|
257
|
-
end
|
258
|
-
|
259
|
-
def _breezy_return(results)
|
260
|
-
"return (#{_dump(results)});"
|
261
|
-
end
|
262
|
-
|
263
|
-
def _dump(value)
|
264
|
-
::MultiJson.dump(value)
|
265
|
-
end
|
266
|
-
|
267
|
-
def _ensure_valid_key(key)
|
268
|
-
current_value = _blank? ? BLANK : @attributes.fetch(_key(key), BLANK)
|
269
|
-
raise NullError.build(key) if current_value.nil?
|
270
|
-
end
|
271
|
-
|
272
|
-
def _normalize_options(options)
|
273
|
-
options = options.dup
|
274
|
-
key = options[:cache]
|
275
|
-
opts = {}
|
276
|
-
return options if !key
|
277
|
-
|
278
|
-
if ::Array === key && key.length == 2 && ::Hash === key.last
|
279
|
-
return options
|
280
|
-
end
|
281
|
-
|
282
|
-
if options[:partial]
|
283
|
-
opts[:partial] = options[:partial]
|
284
|
-
end
|
285
|
-
|
286
|
-
key = case key
|
287
|
-
when ::Array
|
288
|
-
key
|
289
|
-
when ::Proc
|
290
|
-
key
|
291
|
-
else
|
292
|
-
[key]
|
293
|
-
end
|
294
|
-
|
295
|
-
options[:cache] = [key, opts]
|
296
|
-
options
|
297
|
-
end
|
298
|
-
|
299
|
-
def _fragment_name_with_digest(key, options)
|
300
|
-
if @context.respond_to?(:cache_fragment_name)
|
301
|
-
# Current compatibility, fragment_name_with_digest is private again and cache_fragment_name
|
302
|
-
# should be used instead.
|
303
|
-
@context.cache_fragment_name(key, options)
|
304
|
-
elsif @context.respond_to?(:fragment_name_with_digest)
|
305
|
-
# Backwards compatibility for period of time when fragment_name_with_digest was made public.
|
306
|
-
@context.fragment_name_with_digest(key)
|
307
|
-
else
|
308
|
-
key
|
309
|
-
end
|
310
|
-
end
|
311
|
-
|
312
|
-
def _cache_options?(options)
|
313
|
-
::Hash === options && options.key?(:cache)
|
314
|
-
end
|
315
|
-
|
316
|
-
def _logger
|
317
|
-
::ActionView::Base.logger
|
318
|
-
end
|
319
|
-
end
|
320
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
module BreezyTemplate
|
2
|
-
module DefermentExtension
|
3
|
-
ACTIVE_MODES = [:auto, :manual].freeze
|
4
|
-
|
5
|
-
def set!(key, value = BLANK, *args)
|
6
|
-
options = args.first || {}
|
7
|
-
options = _normalize_options(options)
|
8
|
-
if ::Kernel.block_given? && _deferment_enabled?(options)
|
9
|
-
if _deferment_auto?(options)
|
10
|
-
@js.push(_breezy_visit_current(@path))
|
11
|
-
end
|
12
|
-
return _set_value key, nil
|
13
|
-
else
|
14
|
-
super
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def _deferment_auto?(options)
|
19
|
-
options[:defer] == :auto
|
20
|
-
end
|
21
|
-
|
22
|
-
def _deferment_enabled?(options)
|
23
|
-
ACTIVE_MODES.include?(options[:defer]) && (@search_path.nil? || @search_path.size == 0)
|
24
|
-
end
|
25
|
-
|
26
|
-
def _set_request_url(request_path)
|
27
|
-
@request_path = request_path
|
28
|
-
end
|
29
|
-
|
30
|
-
def _deferment_options?(options)
|
31
|
-
::Hash === options && options.key?(:defer)
|
32
|
-
end
|
33
|
-
|
34
|
-
def _mapping_element(element, options)
|
35
|
-
if _deferment_enabled? options
|
36
|
-
if options.has_key? :key
|
37
|
-
id_name = options[:key]
|
38
|
-
id_val = element[id_name]
|
39
|
-
::Hash[id_name, id_val]
|
40
|
-
else
|
41
|
-
nil
|
42
|
-
end
|
43
|
-
else
|
44
|
-
super
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
# This was taken from jbuilder
|
2
|
-
|
3
|
-
dependency_tracker = false
|
4
|
-
|
5
|
-
begin
|
6
|
-
require 'action_view'
|
7
|
-
require 'action_view/dependency_tracker'
|
8
|
-
dependency_tracker = ::ActionView::DependencyTracker
|
9
|
-
rescue LoadError
|
10
|
-
begin
|
11
|
-
require 'cache_digests'
|
12
|
-
dependency_tracker = ::CacheDigests::DependencyTracker
|
13
|
-
rescue LoadError
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
if dependency_tracker
|
18
|
-
class BreezyTemplate::Template
|
19
|
-
module DependencyTrackerMethods
|
20
|
-
# Matches:
|
21
|
-
# json.partial! partial: "comments/comment"
|
22
|
-
# json.comments @post.comments, partial: "comments/comment", as: :comment
|
23
|
-
# json.array! @posts, partial: "posts/post", as: :post
|
24
|
-
# = render partial: "account"
|
25
|
-
#
|
26
|
-
INDIRECT_RENDERS = /
|
27
|
-
(?::partial\s*=>|partial:) # partial: or :partial =>
|
28
|
-
\s* # optional whitespace
|
29
|
-
(['"])([^'"]+)\1 # quoted value
|
30
|
-
/x
|
31
|
-
|
32
|
-
def dependencies
|
33
|
-
indirect_dependencies + explicit_dependencies
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
def indirect_dependencies
|
39
|
-
source.scan(INDIRECT_RENDERS).map(&:second)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
::BreezyTemplate::DependencyTracker = Class.new(dependency_tracker::ERBTracker)
|
45
|
-
::BreezyTemplate::DependencyTracker.send :include, ::BreezyTemplate::Template::DependencyTrackerMethods
|
46
|
-
dependency_tracker.register_tracker :breezy, ::BreezyTemplate::DependencyTracker
|
47
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'action_view'
|
2
|
-
require 'action_view/digestor'
|
3
|
-
|
4
|
-
module BreezyTemplate
|
5
|
-
module PartialDigestor
|
6
|
-
if ::Rails.version >= '5.0'
|
7
|
-
def _partial_digestor(options)
|
8
|
-
name = options[:name]
|
9
|
-
finder = options[:finder]
|
10
|
-
::ActionView::Digestor.digest(name: name, finder: finder)
|
11
|
-
end
|
12
|
-
elsif ::Rails.version >= '4.1'
|
13
|
-
def _partial_digestor(options)
|
14
|
-
name = options[:name]
|
15
|
-
finder = options[:finder]
|
16
|
-
::ActionView::PartialDigestor.new(name: name, finder: finder).digest
|
17
|
-
end
|
18
|
-
elsif ::Rails.version >= '4.0'
|
19
|
-
def _partial_digestor(options={})
|
20
|
-
name = options[:name]
|
21
|
-
finder = options[:finder]
|
22
|
-
::ActionView::PartialDigestor.new(name, finder.formats.last, finder).digest
|
23
|
-
end
|
24
|
-
else
|
25
|
-
def _partial_digestor(options)
|
26
|
-
options[:name]
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|