##// END OF EJS Templates
Fixes unhandled case in json builder....
Jean-Philippe Lang -
r4349:558a951ed64a
parent child
Show More
@@ -1,70 +1,74
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2010 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require 'blankslate'
19 19
20 20 module Redmine
21 21 module Views
22 22 module Builders
23 23 class Structure < BlankSlate
24 24 def initialize
25 25 @struct = [{}]
26 26 end
27 27
28 28 def array(tag, &block)
29 29 @struct << []
30 30 block.call(self)
31 31 ret = @struct.pop
32 32 @struct.last[tag] = ret
33 33 end
34 34
35 35 def method_missing(sym, *args, &block)
36 36 if args.any?
37 37 if args.first.is_a?(Hash)
38 38 if @struct.last.is_a?(Array)
39 39 @struct.last << args.first
40 40 else
41 41 @struct.last[sym] = args.first
42 42 end
43 43 else
44 44 if @struct.last.is_a?(Array)
45 45 @struct.last << (args.last || {}).merge(:value => args.first)
46 46 else
47 47 @struct.last[sym] = args.first
48 48 end
49 49 end
50 50 end
51 51
52 52 if block
53 53 @struct << {}
54 54 block.call(self)
55 55 ret = @struct.pop
56 56 if @struct.last.is_a?(Array)
57 57 @struct.last << ret
58 58 else
59 @struct.last[sym] = ret
59 if @struct.last.has_key?(sym) && @struct.last[sym].is_a?(Hash)
60 @struct.last[sym].merge! ret
61 else
62 @struct.last[sym] = ret
63 end
60 64 end
61 65 end
62 66 end
63 67
64 68 def output
65 69 raise "Need to implement #{self.class.name}#output"
66 70 end
67 71 end
68 72 end
69 73 end
70 74 end
@@ -1,63 +1,70
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2010 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require File.dirname(__FILE__) + '/../../../../../test_helper'
19 19
20 20 class Redmine::Views::Builders::JsonTest < HelperTestCase
21 21
22 22 def test_hash
23 23 assert_json_output({'person' => {'name' => 'Ryan', 'age' => 32}}) do |b|
24 24 b.person do
25 25 b.name 'Ryan'
26 26 b.age 32
27 27 end
28 28 end
29 29 end
30 30
31 31 def test_hash_hash
32 32 assert_json_output({'person' => {'name' => 'Ryan', 'birth' => {'city' => 'London', 'country' => 'UK'}}}) do |b|
33 33 b.person do
34 34 b.name 'Ryan'
35 35 b.birth :city => 'London', :country => 'UK'
36 36 end
37 37 end
38
39 assert_json_output({'person' => {'id' => 1, 'name' => 'Ryan', 'birth' => {'city' => 'London', 'country' => 'UK'}}}) do |b|
40 b.person :id => 1 do
41 b.name 'Ryan'
42 b.birth :city => 'London', :country => 'UK'
43 end
44 end
38 45 end
39 46
40 47 def test_array
41 48 assert_json_output({'books' => [{'title' => 'Book 1', 'author' => 'B. Smith'}, {'title' => 'Book 2', 'author' => 'G. Cooper'}]}) do |b|
42 49 b.array :books do |b|
43 50 b.book :title => 'Book 1', :author => 'B. Smith'
44 51 b.book :title => 'Book 2', :author => 'G. Cooper'
45 52 end
46 53 end
47 54 end
48 55
49 56 def test_array_with_content_tags
50 57 assert_json_output({'books' => [{'value' => 'Book 1', 'author' => 'B. Smith'}, {'value' => 'Book 2', 'author' => 'G. Cooper'}]}) do |b|
51 58 b.array :books do |b|
52 59 b.book 'Book 1', :author => 'B. Smith'
53 60 b.book 'Book 2', :author => 'G. Cooper'
54 61 end
55 62 end
56 63 end
57 64
58 65 def assert_json_output(expected, &block)
59 66 builder = Redmine::Views::Builders::Json.new
60 67 block.call(builder)
61 68 assert_equal(expected, ActiveSupport::JSON.decode(builder.output))
62 69 end
63 70 end
General Comments 0
You need to be logged in to leave comments. Login now