breezy_template 0.5.4 → 0.5.5

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
  SHA1:
3
- metadata.gz: 194841224366e609e53fb0321ab3dc578436f60a
4
- data.tar.gz: d9122125e4b9f272f23449f1165ed2b79c4aa1b6
3
+ metadata.gz: 64f7958f565f036dc57e27e520c791e7b16e5f0d
4
+ data.tar.gz: 5d1ef989831b31f354b3d1e578a6be2cc757da3f
5
5
  SHA512:
6
- metadata.gz: 118d61420698fdbed96028190d7909990be69e7b82415d7029892ad457462c6bbd1eb3da296de8979cea4ecd175f6c0148714618106761bd55c5b9c6d6df617c
7
- data.tar.gz: cccf65ab229f63c4c97011194188518bc9aceb5f1c45735f22400f2e9e0609c956d3eb195d1e82a81ad9015559a68b70e898f0a50f5c529ef68d50c2b456e3bb
6
+ metadata.gz: ef5697134625758c22427708e99e5b8eb707b2af94414b52c98b88a3ebd98c493f8f8756306135f0df3a80ae1fc029ee2006ebccd484394538eb9ca7c6076dff
7
+ data.tar.gz: 939b5591aa0d9c6062228708e893d8cfa5be07252d50a280401d7044cb9df382fe20108c9fdfb65821cee1295b554e6b31d251eb9e35b31b604d1fcf89a1aa43
@@ -2,7 +2,6 @@ require 'breezy_template/breezy_template'
2
2
 
3
3
  require 'breezy_template/blank'
4
4
  require 'breezy_template/var'
5
- require 'breezy_template/key_formatter'
6
5
  require 'breezy_template/errors'
7
6
 
8
7
  require 'breezy_template/active_support'
@@ -34,7 +33,6 @@ class BreezyTemplate
34
33
 
35
34
  self.template_lookup_options = { handlers: [:breezy, :props] }
36
35
 
37
- @@key_formatter = nil
38
36
  @@ignore_nil = false
39
37
 
40
38
  def initialize(context, options = {})
@@ -44,7 +42,6 @@ class BreezyTemplate
44
42
  @joints = {}
45
43
 
46
44
  @attributes = {}
47
- @key_formatter = options.fetch(:key_formatter){ @@key_formatter ? @@key_formatter.clone : nil}
48
45
  @ignore_nil = options.fetch(:ignore_nil, @@ignore_nil)
49
46
 
50
47
  yield self if ::Kernel.block_given?
@@ -106,15 +103,6 @@ class BreezyTemplate
106
103
  @path.pop
107
104
  end
108
105
 
109
- def key_format!(*args)
110
- @key_formatter = KeyFormatter.new(*args)
111
- end
112
-
113
- # Same as the instance method key_format! except sets the default.
114
- def self.key_format(*args)
115
- @@key_formatter = KeyFormatter.new(*args)
116
- end
117
-
118
106
  def empty!
119
107
  attributes = @attributes
120
108
  @attributes = {}
@@ -135,24 +123,21 @@ class BreezyTemplate
135
123
  @attributes << _scope{ yield self }
136
124
  end
137
125
 
138
-
139
- def array!(collection = [], *attributes)
126
+ def array!(collection, *attributes)
140
127
  options = attributes.first || {}
141
128
 
142
- collection = [] if collection.nil?
129
+ if !collection.respond_to? :member_by
130
+ raise ::NotImplementedError, 'collection must implement member_by(attr, value)'
131
+ end
132
+
133
+ if !collection.respond_to? :member_at
134
+ raise ::NotImplementedError, 'collection must implement member_at(index)'
135
+ end
136
+
137
+
143
138
  collection = _prepare_collection_for_map(collection)
144
139
  array = if ::Kernel.block_given?
145
140
  _map_collection(collection, options, &::Proc.new)
146
- # elsif attributes.any?
147
- # if (!attributes.last.is_a? ::Hash)
148
- # _map_collection(collection) { |element|
149
- # extract! element, *attributes
150
- # }
151
- # else
152
- # _map_collection(collection, options) { |element|
153
- # extract! element, *attributes
154
- # }
155
- # end
156
141
  else
157
142
  collection.to_a
158
143
  end
@@ -226,7 +211,7 @@ class BreezyTemplate
226
211
  end
227
212
 
228
213
  def _key(key)
229
- @key_formatter ? @key_formatter.format(key) : key.to_s
214
+ key.to_s
230
215
  end
231
216
 
232
217
  def _set_value(key, value)
@@ -264,12 +249,12 @@ class BreezyTemplate
264
249
  end
265
250
 
266
251
  def _scope
267
- parent_attributes, parent_formatter = @attributes, @key_formatter
252
+ parent_attributes = @attributes
268
253
  @attributes = BLANK
269
254
  yield
270
255
  @attributes
271
256
  ensure
272
- @attributes, @key_formatter = parent_attributes, parent_formatter
257
+ @attributes = parent_attributes
273
258
  end
274
259
 
275
260
  def _is_collection?(object)
@@ -0,0 +1,20 @@
1
+ class BreezyTemplate
2
+ module Extensions
3
+ module Array
4
+ module Member
5
+ def member_at(index)
6
+ at(index)
7
+ end
8
+
9
+ def member_by(attribute, value)
10
+ raise NotImplementedError, 'Implement member_by(attr, value) in your own delegate'
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ class Array
18
+ include BreezyTemplate::Extensions::Array::Member
19
+ end
20
+
@@ -21,4 +21,11 @@ class BreezyTemplate
21
21
  new(message)
22
22
  end
23
23
  end
24
+
25
+ class NotFoundError < ::StandardError
26
+ def self.build(search_path)
27
+ message = "Could not find node at #{search_path}"
28
+ new(message)
29
+ end
30
+ end
24
31
  end
@@ -9,8 +9,7 @@ class BreezyTemplate
9
9
  # this juggling is required to keep line numbers right in the error
10
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}
11
11
  if !(__already_defined && __already_defined != "method")
12
- json.merge!({data: json.found! || json.empty! })
13
- json.key_format! :downcase
12
+ json.merge!({data: json._found! || json.empty! })
14
13
  if defined?(breezy) && breezy
15
14
  breezy.each do |k, v|
16
15
  json.set! k, v
@@ -2,10 +2,14 @@ require 'breezy_template/breezy_template'
2
2
 
3
3
  class BreezyTemplate
4
4
  module SearchExtension
5
- def found!
5
+ def _found!
6
+ if !@search_path.nil? && @found.nil?
7
+ ::Kernel.raise NotFoundError.build(@search_path)
8
+ end
9
+
6
10
  found = @found
7
11
  @found = nil
8
- @search_path = []
12
+ @search_path = nil
9
13
  found
10
14
  end
11
15
 
@@ -36,31 +40,15 @@ class BreezyTemplate
36
40
  if @search_path && !@search_path.empty?
37
41
  id_name, id_val = @search_path.first.split('=')
38
42
 
39
- if (defined? ::ActiveRecord) && collection.is_a?(::ActiveRecord::Relation)
40
- if id_val
41
- id_val = id_val.to_i
42
- collection = collection.where(::Hash[id_name, id_val])
43
- else
44
- index = id_name.to_i
45
- collection = collection.offset(index).limit(1)
46
- end
43
+ if id_val
44
+ id_val = id_val.to_i
45
+ found = collection.member_by(id_name, id_val)
47
46
  else
48
- if id_val
49
- id_val = id_val.to_i
50
- found = collection.find do |ele|
51
- ele[id_name] == id_val || ele[id_name.to_sym] == id_val
52
- end
53
- else
54
- index = id_name.to_i
55
- found = collection[index]
56
- end
57
-
58
- if found
59
- collection = [found]
60
- else
61
- collection = []
62
- end
47
+ index = id_name.to_i
48
+ found = collection.member_at(index)
63
49
  end
50
+
51
+ found ? [found] : []
64
52
  else
65
53
  super
66
54
  end
@@ -1,6 +1,6 @@
1
1
  require "test_helper"
2
2
  require "mocha"
3
-
3
+ require 'delegate'
4
4
  require "action_view"
5
5
  require "action_view/testing/resolvers"
6
6
  require "breezy_template"
@@ -106,7 +106,9 @@ class BreezyTemplateTest < ActionView::TestCase
106
106
  end
107
107
 
108
108
  def action_controller_test_request
109
- if ::Rails.version.start_with?('5.1')
109
+ if ::Rails.version.start_with?('5.2')
110
+ ::ActionController::TestRequest.create({})
111
+ elsif ::Rails.version.start_with?('5.1')
110
112
  ::ActionController::TestRequest.create({})
111
113
  elsif ::Rails.version.start_with?('5')
112
114
  ::ActionController::TestRequest.create
@@ -263,48 +265,6 @@ class BreezyTemplateTest < ActionView::TestCase
263
265
  assert_equal expected, result
264
266
  end
265
267
 
266
- test "key_format! with parameter" do
267
- result = jbuild(<<-JBUILDER)
268
- json.key_format! camelize: [:lower]
269
- json.camel_style "for JS"
270
- JBUILDER
271
-
272
- expected = strip_format(<<-JS)
273
- (function(){
274
- var joints={};
275
- var cache={};
276
- var defers=[];
277
- return ({"data":{"camelStyle":"for JS"},"joints":joints,"defers":defers});
278
- })()
279
- JS
280
-
281
- assert_equal expected, result
282
- end
283
-
284
- test "key_format! propagates to child elements" do
285
- result = jbuild(<<-JBUILDER)
286
- json.key_format! :upcase
287
- json.level1 "one"
288
- json.level2 do
289
- json.value "two"
290
- end
291
- JBUILDER
292
-
293
- expected = strip_format(<<-JS)
294
- (function(){
295
- var joints={};
296
- var cache={};
297
- var defers=[];
298
- return ({"data":{
299
- "LEVEL1":"one",
300
- "LEVEL2":{"VALUE":"two"}
301
- },"joints":joints,"defers":defers});
302
- })()
303
- JS
304
-
305
- assert_equal expected, result
306
- end
307
-
308
268
  test "renders partial via the option through set!" do
309
269
  @post = BLOG_POST_COLLECTION.first
310
270
  Rails.cache.clear
@@ -517,9 +477,9 @@ class BreezyTemplateTest < ActionView::TestCase
517
477
  assert_equal expected, result
518
478
  end
519
479
 
520
- test "renders array of partials as empty array with nil-collection" do
480
+ test "renders array of partials as empty array with an empty collection" do
521
481
  result = jbuild(<<-JBUILDER)
522
- json.array! nil, partial: ["blog_post", as: :blog_post]
482
+ json.array! [], partial: ["blog_post", as: :blog_post]
523
483
  JBUILDER
524
484
 
525
485
  expected = strip_format(<<-JS)
@@ -935,6 +895,23 @@ class BreezyTemplateTest < ActionView::TestCase
935
895
  assert_equal expected, result
936
896
  end
937
897
 
898
+ test "filtering for a nonexistant node in the tree" do
899
+ begin
900
+ jbuild(<<-JBUILDER)
901
+ json._filter_by_path('miss.miss.miss.miss')
902
+ json.hit do
903
+ json.hit2 do
904
+ json.greeting 'hello world'
905
+ end
906
+ end
907
+ JBUILDER
908
+ rescue => e
909
+ assert_equal e.cause.class, BreezyTemplate::NotFoundError
910
+ assert_equal e.message, 'Could not find node at ["miss", "miss", "miss", "miss"]'
911
+ end
912
+
913
+ Rails.cache.clear
914
+ end
938
915
  test "filtering for a raw value is also possble" do
939
916
  result = jbuild(<<-JBUILDER, breezy_filter: 'hit.hit2')
940
917
  json.hit do
@@ -1041,84 +1018,12 @@ class BreezyTemplateTest < ActionView::TestCase
1041
1018
  assert_equal expected, result
1042
1019
  end
1043
1020
 
1044
- test "filtering for a node of a AR relation in a tree by id via an appended where clause" do
1045
- Post.delete_all
1046
- Note.delete_all
1047
-
1048
- post = Post.create
1049
- first_note = post.notes.create(title: 'first')
1050
- post.notes.create(title: 'second')
1051
-
1052
- result = jbuild(<<-JBUILDER, breezy_filter: "hit.hit2.id=#{first_note.id}")
1053
- post = Post.first
1054
- first_note = Note.where(title: 'first').first
1055
- post.notes.expects(:where).once().with('id'=>first_note.id).returns([{id: first_note.id, title: 'first'}])
1056
-
1057
- json.hit do
1058
- json.hit2 do
1059
- json.array! post.notes do |x|
1060
- raise 'this should be be called' if x[:title] == 'second'
1061
- json.title x[:title]
1062
- end
1063
- end
1064
- end
1065
- JBUILDER
1066
-
1067
- Rails.cache.clear
1068
- id = Note.where(title: 'first').first.id
1069
- expected = strip_format(<<-JS)
1070
- (function(){
1071
- var joints={};
1072
- var cache={};
1073
- var defers=[];
1074
- return (
1075
- {"data":{"title":"first"},"action":"graft","path":"hit.hit2.id=#{id}","joints":joints,"defers":defers}
1076
- );
1077
- })()
1078
- JS
1079
- assert_equal expected, result
1080
- end
1081
-
1082
-
1083
- test "filtering for a node of a AR relation in a tree by index via an appended where clause" do
1084
- result = jbuild(<<-JBUILDER, breezy_filter: 'hit.hit2.0')
1085
- post = Post.create
1086
- post.notes.create title: 'first'
1087
- post.notes.create title: 'second'
1088
-
1089
- offset = post.notes.offset(0)
1090
- post.notes.expects(:offset).once().with(0).returns(offset)
1091
-
1092
- json.hit do
1093
- json.hit2 do
1094
- json.array! post.notes do |x|
1095
- raise 'this should be be called' if x[:title] == 'second'
1096
- json.title x[:title]
1097
- end
1098
- end
1099
- end
1100
- JBUILDER
1101
-
1102
- Rails.cache.clear
1103
-
1104
- expected = strip_format(<<-JS)
1105
- (function(){
1106
- var joints={};
1107
- var cache={};
1108
- var defers=[];
1109
- return (
1110
- {"data":{"title":"first"},"action":"graft","path":"hit.hit2.0","joints":joints,"defers":defers}
1111
- );
1112
- })()
1113
- JS
1114
- assert_equal expected, result
1115
- end
1116
-
1117
1021
  test "filtering for a node in an array of a tree by id" do
1118
1022
  result = jbuild(<<-JBUILDER, breezy_filter: 'hit.hit2.id=1')
1119
1023
  json.hit do
1120
1024
  json.hit2 do
1121
- json.array! [{id: 1, name: 'hit' }, {id:2, name: 'miss'}] do |x|
1025
+ data = ObjectCollection.new([{id: 1, name: 'hit' }, {id:2, name: 'miss'}])
1026
+ json.array! data do |x|
1122
1027
  raise 'this should be be called' if x[:name] == 'miss'
1123
1028
  json.name x[:name]
1124
1029
  end
@@ -1143,9 +1048,10 @@ class BreezyTemplateTest < ActionView::TestCase
1143
1048
 
1144
1049
  test "filtering for a node in an array of a tree by index" do
1145
1050
  result = jbuild(<<-JBUILDER, breezy_filter: 'hit.hit2.0')
1051
+ data = [{id: 1, name: 'hit' }, {id:2, name: 'miss'}]
1146
1052
  json.hit do
1147
1053
  json.hit2 do
1148
- json.array! [{id: 1, name: 'hit' }, {id:2, name: 'miss'}] do |x|
1054
+ json.array! data do |x|
1149
1055
  raise 'this should be be called' if x[:name] == 'miss'
1150
1056
  json.name x[:name]
1151
1057
  end
@@ -15,13 +15,29 @@ class NonEnumerable
15
15
  end
16
16
 
17
17
  delegate :map, :count, to: :@collection
18
+
19
+ def member_at(index)
20
+ @collection[index]
21
+ end
22
+
23
+ def member_by(attribute, value)
24
+ raise NotImplementedError
25
+ end
18
26
  end
19
27
 
20
- class VeryBasicWrapper < BasicObject
28
+ class VeryBasicWrapper
21
29
  def initialize(thing)
22
30
  @thing = thing
23
31
  end
24
32
 
33
+ def member_at(index)
34
+ @thing[index]
35
+ end
36
+
37
+ def member_by(attribute, value)
38
+ raise NotImplementedError
39
+ end
40
+
25
41
  def method_missing(name, *args, &block)
26
42
  @thing.send name, *args, &block
27
43
  end
@@ -50,10 +66,6 @@ end
50
66
 
51
67
 
52
68
  class TemplateTest < ActiveSupport::TestCase
53
- setup do
54
- BreezyTemplate.send :class_variable_set, '@@key_formatter', nil
55
- end
56
-
57
69
  test 'single key' do
58
70
  result = jbuild do |json|
59
71
  json.content 'hello'
@@ -260,7 +272,7 @@ class TemplateTest < ActiveSupport::TestCase
260
272
  # assert_equal [], result['comments']
261
273
  # end
262
274
 
263
- test 'nesting multiple children from a non-Enumerable that responds to #map' do
275
+ test 'nesting multiple children from a non-Enumerable that responds to #map, #members_at, #members_by' do
264
276
  comments = NonEnumerable.new([ Comment.new('hello', 1), Comment.new('world', 2) ])
265
277
 
266
278
  result = jbuild do |json|
@@ -292,7 +304,6 @@ class TemplateTest < ActiveSupport::TestCase
292
304
 
293
305
  test 'array! casts array-like objects to array before merging' do
294
306
  wrapped_array = VeryBasicWrapper.new(%w[foo bar])
295
-
296
307
  result = jbuild do |json|
297
308
  json.array! wrapped_array
298
309
  end
@@ -481,98 +492,6 @@ class TemplateTest < ActiveSupport::TestCase
481
492
  # assert_equal 50, result['relations'][1]['age']
482
493
  # end
483
494
 
484
- # reconsider
485
- # test 'initialize via options hash' do
486
- # jbuilder = Jbuilder.new(key_formatter: 1, ignore_nil: 2)
487
- # assert_equal 1, jbuilder.instance_eval{ @key_formatter }
488
- # assert_equal 2, jbuilder.instance_eval{ @ignore_nil }
489
- # end
490
-
491
- test 'key_format! with parameter' do
492
- result = jbuild do |json|
493
- json.key_format! camelize: [:lower]
494
- json.camel_style 'for JS'
495
- end
496
-
497
- assert_equal ['camelStyle'], result.keys
498
- end
499
-
500
- test 'key_format! with parameter not as an array' do
501
- result = jbuild do |json|
502
- json.key_format! :camelize => :lower
503
- json.camel_style 'for JS'
504
- end
505
-
506
- assert_equal ['camelStyle'], result.keys
507
- end
508
-
509
- test 'key_format! propagates to child elements' do
510
- result = jbuild do |json|
511
- json.key_format! :upcase
512
- json.level1 'one'
513
- json.level2 do
514
- json.value 'two'
515
- end
516
- end
517
-
518
- assert_equal 'one', result['LEVEL1']
519
- assert_equal 'two', result['LEVEL2']['VALUE']
520
- end
521
-
522
- test 'key_format! resets after child element' do
523
- result = jbuild do |json|
524
- json.level2 do
525
- json.key_format! :upcase
526
- json.value 'two'
527
- end
528
- json.level1 'one'
529
- end
530
-
531
- assert_equal 'two', result['level2']['VALUE']
532
- assert_equal 'one', result['level1']
533
- end
534
-
535
- test 'key_format! with no parameter' do
536
- result = jbuild do |json|
537
- json.key_format! :upcase
538
- json.lower 'Value'
539
- end
540
-
541
- assert_equal ['LOWER'], result.keys
542
- end
543
-
544
- test 'key_format! with multiple steps' do
545
- result = jbuild do |json|
546
- json.key_format! :upcase, :pluralize
547
- json.pill 'foo'
548
- end
549
-
550
- assert_equal ['PILLs'], result.keys
551
- end
552
-
553
- test 'key_format! with lambda/proc' do
554
- result = jbuild do |json|
555
- json.key_format! ->(key){ key + ' and friends' }
556
- json.oats 'foo'
557
- end
558
-
559
- assert_equal ['oats and friends'], result.keys
560
- end
561
-
562
- test 'default key_format!' do
563
- BreezyTemplate.key_format camelize: :lower
564
- result = jbuild{ |json| json.camel_style 'for JS' }
565
- assert_equal ['camelStyle'], result.keys
566
- end
567
- #
568
- test 'do not use default key formatter directly' do
569
- BreezyTemplate.key_format
570
- jbuild{ |json| json.key 'value' }
571
- formatter = BreezyTemplate.send(:class_variable_get, '@@key_formatter')
572
- cache = formatter.instance_variable_get('@cache')
573
- assert_empty cache
574
- end
575
-
576
495
  test 'ignore_nil! without a parameter' do
577
496
  result = jbuild do |json|
578
497
  json.ignore_nil!
data/test/test_helper.rb CHANGED
@@ -11,6 +11,17 @@ ActiveSupport::TestCase.test_order = :random if ActiveSupport::TestCase.respond_
11
11
  ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
12
12
  Rails.cache = ActiveSupport::Cache::MemoryStore.new
13
13
 
14
- load File.dirname(__FILE__) + '/support/schema.rb'
15
- require 'support/models'
14
+ class ObjectCollection < SimpleDelegator
15
+ def member_at(index)
16
+ at(index)
17
+ end
16
18
 
19
+ def member_by(key, val)
20
+ find do |ele|
21
+ ele[key] == val || ele[key.to_sym] == val
22
+ end
23
+ end
24
+ end
25
+
26
+
27
+ require 'breezy_template/core_ext'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: breezy_template
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 0.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Johny Ho
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-10 00:00:00.000000000 Z
11
+ date: 2018-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack
@@ -92,12 +92,12 @@ files:
92
92
  - lib/breezy_template/breezy_template.rb
93
93
  - lib/breezy_template/cache_extension.rb
94
94
  - lib/breezy_template/configuration.rb
95
+ - lib/breezy_template/core_ext.rb
95
96
  - lib/breezy_template/deferment_extension.rb
96
97
  - lib/breezy_template/dependency_tracker.rb
97
98
  - lib/breezy_template/digestor.rb
98
99
  - lib/breezy_template/errors.rb
99
100
  - lib/breezy_template/handler.rb
100
- - lib/breezy_template/key_formatter.rb
101
101
  - lib/breezy_template/partial_extension.rb
102
102
  - lib/breezy_template/search_extension.rb
103
103
  - lib/breezy_template/var.rb
@@ -1,34 +0,0 @@
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