##// END OF EJS Templates
Fixes unhandled case in json builder....
Jean-Philippe Lang -
r4350:88e593ee027b
parent child
Show More
@@ -1,74 +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 @struct.last << args.first
39 @struct.last << args.first unless block
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 @struct << {}
53 @struct << (args.first.is_a?(Hash) ? args.first : {})
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 59 if @struct.last.has_key?(sym) && @struct.last[sym].is_a?(Hash)
60 60 @struct.last[sym].merge! ret
61 61 else
62 62 @struct.last[sym] = ret
63 63 end
64 64 end
65 65 end
66 66 end
67 67
68 68 def output
69 69 raise "Need to implement #{self.class.name}#output"
70 70 end
71 71 end
72 72 end
73 73 end
74 74 end
@@ -1,70 +1,81
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 38
39 39 assert_json_output({'person' => {'id' => 1, 'name' => 'Ryan', 'birth' => {'city' => 'London', 'country' => 'UK'}}}) do |b|
40 40 b.person :id => 1 do
41 41 b.name 'Ryan'
42 42 b.birth :city => 'London', :country => 'UK'
43 43 end
44 44 end
45 45 end
46 46
47 47 def test_array
48 48 assert_json_output({'books' => [{'title' => 'Book 1', 'author' => 'B. Smith'}, {'title' => 'Book 2', 'author' => 'G. Cooper'}]}) do |b|
49 49 b.array :books do |b|
50 50 b.book :title => 'Book 1', :author => 'B. Smith'
51 51 b.book :title => 'Book 2', :author => 'G. Cooper'
52 52 end
53 53 end
54
55 assert_json_output({'books' => [{'title' => 'Book 1', 'author' => 'B. Smith'}, {'title' => 'Book 2', 'author' => 'G. Cooper'}]}) do |b|
56 b.array :books do |b|
57 b.book :title => 'Book 1' do
58 b.author 'B. Smith'
59 end
60 b.book :title => 'Book 2' do
61 b.author 'G. Cooper'
62 end
63 end
64 end
54 65 end
55 66
56 67 def test_array_with_content_tags
57 68 assert_json_output({'books' => [{'value' => 'Book 1', 'author' => 'B. Smith'}, {'value' => 'Book 2', 'author' => 'G. Cooper'}]}) do |b|
58 69 b.array :books do |b|
59 70 b.book 'Book 1', :author => 'B. Smith'
60 71 b.book 'Book 2', :author => 'G. Cooper'
61 72 end
62 73 end
63 74 end
64 75
65 76 def assert_json_output(expected, &block)
66 77 builder = Redmine::Views::Builders::Json.new
67 78 block.call(builder)
68 79 assert_equal(expected, ActiveSupport::JSON.decode(builder.output))
69 80 end
70 81 end
General Comments 0
You need to be logged in to leave comments. Login now