breezy_template 0.5.4 → 0.5.5

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 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