merb-core 0.9.2 → 0.9.3

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.
Files changed (104) hide show
  1. data/Rakefile +61 -11
  2. data/bin/merb +5 -1
  3. data/lib/merb-core.rb +202 -25
  4. data/lib/merb-core/autoload.rb +19 -17
  5. data/lib/merb-core/bootloader.rb +84 -71
  6. data/lib/merb-core/config.rb +19 -14
  7. data/lib/merb-core/controller/abstract_controller.rb +16 -17
  8. data/lib/merb-core/controller/exceptions.rb +115 -70
  9. data/lib/merb-core/controller/merb_controller.rb +62 -38
  10. data/lib/merb-core/controller/mime.rb +1 -1
  11. data/lib/merb-core/controller/mixins/authentication.rb +87 -0
  12. data/lib/merb-core/controller/mixins/controller.rb +16 -15
  13. data/lib/merb-core/controller/mixins/render.rb +113 -19
  14. data/lib/merb-core/controller/mixins/responder.rb +8 -2
  15. data/lib/merb-core/controller/template.rb +1 -1
  16. data/lib/merb-core/core_ext.rb +1 -0
  17. data/lib/merb-core/core_ext/class.rb +113 -6
  18. data/lib/merb-core/core_ext/hash.rb +43 -39
  19. data/lib/merb-core/core_ext/kernel.rb +75 -38
  20. data/lib/merb-core/core_ext/mash.rb +4 -4
  21. data/lib/merb-core/core_ext/object.rb +18 -7
  22. data/lib/merb-core/core_ext/set.rb +9 -4
  23. data/lib/merb-core/core_ext/string.rb +29 -9
  24. data/lib/merb-core/core_ext/time.rb +13 -0
  25. data/lib/merb-core/dispatch/cookies.rb +1 -2
  26. data/lib/merb-core/dispatch/dispatcher.rb +18 -10
  27. data/lib/merb-core/dispatch/exceptions.html.erb +1 -1
  28. data/lib/merb-core/dispatch/request.rb +3 -0
  29. data/lib/merb-core/dispatch/router.rb +10 -7
  30. data/lib/merb-core/dispatch/router/behavior.rb +36 -27
  31. data/lib/merb-core/dispatch/router/route.rb +7 -2
  32. data/lib/merb-core/dispatch/session/cookie.rb +4 -4
  33. data/lib/merb-core/dispatch/session/memcached.rb +17 -5
  34. data/lib/merb-core/logger.rb +2 -2
  35. data/lib/merb-core/plugins.rb +16 -4
  36. data/lib/merb-core/rack/adapter/ebb.rb +4 -1
  37. data/lib/merb-core/rack/adapter/evented_mongrel.rb +2 -0
  38. data/lib/merb-core/rack/adapter/fcgi.rb +1 -0
  39. data/lib/merb-core/rack/adapter/mongrel.rb +1 -0
  40. data/lib/merb-core/rack/adapter/runner.rb +1 -0
  41. data/lib/merb-core/rack/adapter/thin.rb +3 -1
  42. data/lib/merb-core/rack/adapter/webrick.rb +1 -0
  43. data/lib/merb-core/rack/application.rb +17 -1
  44. data/lib/merb-core/server.rb +78 -28
  45. data/lib/merb-core/test/helpers/multipart_request_helper.rb +3 -3
  46. data/lib/merb-core/test/helpers/request_helper.rb +81 -27
  47. data/lib/merb-core/test/helpers/view_helper.rb +1 -1
  48. data/lib/merb-core/test/matchers/controller_matchers.rb +55 -5
  49. data/lib/merb-core/test/matchers/route_matchers.rb +8 -17
  50. data/lib/merb-core/test/matchers/view_matchers.rb +53 -11
  51. data/lib/merb-core/test/run_specs.rb +22 -14
  52. data/lib/merb-core/test/tasks/spectasks.rb +54 -33
  53. data/lib/merb-core/vendor/facets/inflect.rb +91 -2
  54. data/lib/merb-core/version.rb +2 -2
  55. data/spec/private/config/config_spec.rb +54 -26
  56. data/spec/private/core_ext/class_spec.rb +22 -0
  57. data/spec/private/core_ext/hash_spec.rb +70 -54
  58. data/spec/private/core_ext/kernel_spec.rb +149 -14
  59. data/spec/private/core_ext/object_spec.rb +92 -10
  60. data/spec/private/core_ext/string_spec.rb +162 -4
  61. data/spec/private/core_ext/time_spec.rb +16 -0
  62. data/spec/private/dispatch/bootloader_spec.rb +24 -0
  63. data/spec/private/dispatch/fixture/app/views/exeptions/client_error.html.erb +1 -1
  64. data/spec/private/dispatch/fixture/app/views/exeptions/internal_server_error.html.erb +1 -1
  65. data/spec/private/dispatch/fixture/app/views/exeptions/not_acceptable.html.erb +1 -1
  66. data/spec/private/dispatch/fixture/app/views/exeptions/not_found.html.erb +1 -1
  67. data/spec/private/dispatch/fixture/config/black_hole.rb +12 -0
  68. data/spec/private/dispatch/fixture/log/merb_test.log +138 -0
  69. data/spec/private/plugins/plugin_spec.rb +79 -8
  70. data/spec/private/rack/application_spec.rb +1 -1
  71. data/spec/public/abstract_controller/controllers/filters.rb +26 -0
  72. data/spec/public/abstract_controller/controllers/helpers.rb +2 -2
  73. data/spec/public/abstract_controller/controllers/partial.rb +2 -2
  74. data/spec/public/abstract_controller/controllers/render.rb +16 -4
  75. data/spec/public/abstract_controller/filter_spec.rb +8 -0
  76. data/spec/public/abstract_controller/render_spec.rb +12 -0
  77. data/spec/public/controller/authentication_spec.rb +103 -0
  78. data/spec/public/controller/base_spec.rb +4 -3
  79. data/spec/public/controller/controllers/authentication.rb +47 -0
  80. data/spec/public/controller/controllers/base.rb +1 -0
  81. data/spec/public/controller/controllers/display.rb +30 -0
  82. data/spec/public/controller/controllers/views/layout/custom_arg.html.erb +1 -0
  83. data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template_argument/index.html.erb +1 -0
  84. data/spec/public/controller/display_spec.rb +17 -0
  85. data/spec/public/controller/spec_helper.rb +1 -0
  86. data/spec/public/controller/url_spec.rb +25 -7
  87. data/spec/public/core/merb_core_spec.rb +34 -0
  88. data/spec/public/directory_structure/directory/app/controllers/custom.rb +2 -2
  89. data/spec/public/directory_structure/directory/log/merb_test.log +48 -0
  90. data/spec/public/logger/logger_spec.rb +10 -4
  91. data/spec/public/reloading/directory/app/controllers/reload.rb +1 -1
  92. data/spec/public/reloading/directory/log/merb_test.log +13 -0
  93. data/spec/public/reloading/reload_spec.rb +23 -22
  94. data/spec/public/request/request_spec.rb +2 -0
  95. data/spec/public/router/nested_resources_spec.rb +7 -0
  96. data/spec/public/router/resources_spec.rb +46 -1
  97. data/spec/public/router/special_spec.rb +5 -1
  98. data/spec/public/test/controller_matchers_spec.rb +25 -1
  99. data/spec/public/test/controllers/spec_helper_controller.rb +8 -0
  100. data/spec/public/test/request_helper_spec.rb +52 -1
  101. data/spec/public/test/route_matchers_spec.rb +27 -25
  102. data/spec/public/test/view_helper_spec.rb +1 -1
  103. data/spec/public/test/view_matchers_spec.rb +148 -72
  104. metadata +23 -3
@@ -1,5 +1,5 @@
1
1
  module Merb
2
- VERSION = '0.9.2' unless defined?(Merb::VERSION)
2
+ VERSION = '0.9.3' unless defined?(Merb::VERSION)
3
3
 
4
4
  # Merb::RELEASE meanings:
5
5
  # 'dev' : unreleased
@@ -7,5 +7,5 @@ module Merb
7
7
  # nil : released
8
8
  # You should never check in to trunk with this changed. It should
9
9
  # stay 'dev'. Change it to nil in release tags.
10
- RELEASE = nil unless defined?(Merb::RELEASE)
10
+ RELEASE = '' unless defined?(Merb::RELEASE)
11
11
  end
@@ -4,29 +4,29 @@ describe Merb::Config do
4
4
  before do
5
5
  Merb::Config.setup
6
6
  end
7
-
7
+
8
8
  it "should be able to yield the configuration via #use" do
9
9
  res = nil
10
10
  Merb::Config.use {|c| res = c}
11
11
  res.should == Merb::Config.defaults
12
12
  end
13
-
13
+
14
14
  it "should be able to get a configuration key" do
15
15
  Merb::Config[:host].should == "0.0.0.0"
16
16
  end
17
-
17
+
18
18
  it "should be able to set a configuration key" do
19
19
  Merb::Config[:bar] = "Hello"
20
20
  Merb::Config[:bar].should == "Hello"
21
21
  end
22
-
22
+
23
23
  it "should be able to #delete a configuration key" do
24
- Merb::Config[:bar] = "Hello"
25
- Merb::Config[:bar].should == "Hello"
24
+ Merb::Config[:bar] = "Hello"
25
+ Merb::Config[:bar].should == "Hello"
26
26
  Merb::Config.delete(:bar)
27
- Merb::Config[:bar].should == nil
27
+ Merb::Config[:bar].should == nil
28
28
  end
29
-
29
+
30
30
  it "should be able to #fetch a key that does exist" do
31
31
  Merb::Config.fetch(:host, "192.168.2.1").should == "0.0.0.0"
32
32
  end
@@ -43,68 +43,96 @@ describe Merb::Config do
43
43
  Merb::Config.parse_args(["-u", "tester"])
44
44
  Merb::Config[:user].should == "tester"
45
45
  end
46
-
46
+
47
47
  it "should support -G to set the group to run Merb as" do
48
48
  Merb::Config.parse_args(["-G", "tester"])
49
- Merb::Config[:group].should == "tester"
49
+ Merb::Config[:group].should == "tester"
50
50
  end
51
51
 
52
52
  it "should support -f to set the filename to run Merb as" do
53
53
  Merb::Config.parse_args(["-d"])
54
54
  Merb::Config[:daemonize].should == true
55
55
  end
56
-
56
+
57
57
  it "should support -c to set the number of cluster nodes" do
58
58
  Merb::Config.parse_args(["-c", "4"])
59
59
  Merb::Config[:cluster].should == "4"
60
60
  end
61
-
61
+
62
62
  it "should support -p to set the port number" do
63
63
  Merb::Config.parse_args(["-p", "6000"])
64
- Merb::Config[:port].should == "6000"
64
+ Merb::Config[:port].should == "6000"
65
65
  end
66
-
66
+
67
67
  it "should support -P to set the PIDfile" do
68
68
  Merb::Config.parse_args(["-P", "pidfile"])
69
69
  Merb::Config[:pid_file].should == "pidfile"
70
70
  end
71
71
 
72
+ it "should have server return PIDfile setting as is with no cluster nodes" do
73
+ Merb::Config.parse_args(["-P", "pidfile", "-p", "6000"])
74
+ Merb::Server.pid_file(6000).should == "pidfile"
75
+ Merb::Server.pid_files.should == ["pidfile"]
76
+ end
77
+
78
+ it "should support setting of PIDfile with cluster nodes" do
79
+ Merb::Config.parse_args(["-P", "/tmp/merb.pidfile", "-c", "2", "-p", "6000"])
80
+ Merb::Server.pid_file(6000).should == "/tmp/merb.6000.pidfile"
81
+ Merb::Server.pid_file(6001).should == "/tmp/merb.6001.pidfile"
82
+
83
+ Dir.should_receive(:[]).with("/tmp/merb.*.pidfile")
84
+ Merb::Server.pid_files
85
+ end
86
+
87
+ it "should support default PIDfile setting" do
88
+ Merb::Config.parse_args(["-p", "6000"])
89
+ Merb::Server.pid_file(6000).should == Merb.log_path / "merb.6000.pid"
90
+
91
+ Dir.should_receive(:[]).with(Merb.log_path / "merb.*.pid")
92
+ Merb::Server.pid_files
93
+ end
94
+
72
95
  it "should support -h to set the hostname" do
73
96
  Merb::Config.parse_args(["-h", "hostname"])
74
97
  Merb::Config[:host].should == "hostname"
75
98
  end
76
-
99
+
77
100
  it "should support -i to specify loading IRB" do
78
101
  Merb::Config.parse_args(["-i"])
79
102
  Merb::Config[:adapter].should == "irb"
80
103
  end
81
-
104
+
82
105
  it "should support -l to specify the log level" do
83
106
  Merb::Config.parse_args(["-l", "debug"])
84
107
  Merb::Config[:log_level].should == :debug
85
108
  end
86
-
109
+
87
110
  it "should support -L to specify the location of the log file" do
88
111
  Merb::Config.parse_args(["-L", "log_file"])
89
112
  Merb::Config[:log_file].should == "log_file"
90
113
  end
91
-
114
+
92
115
  it "should support -r to specify a runner" do
93
116
  Merb::Config.parse_args(["-r", "foo_runner"])
94
117
  Merb::Config[:runner_code].should == "foo_runner"
95
118
  Merb::Config[:adapter].should == "runner"
96
119
  end
97
-
120
+
121
+ it "should support -R to specify a rackup file" do
122
+ Merb::Config.parse_args(["-R", "config.ru"])
123
+ Merb::Config[:rackup].should == "config.ru"
124
+ end
125
+
98
126
  it "should support -K for a graceful kill" do
99
127
  Merb::Server.should_receive(:kill).with("all", 1)
100
- Merb::Config.parse_args(["-K", "all"])
128
+ Merb.start(["-K", "all"])
101
129
  end
102
130
 
103
131
  it "should support -k for a hard kill" do
104
132
  Merb::Server.should_receive(:kill).with("all", 9)
105
- Merb::Config.parse_args(["-k", "all"])
133
+ Merb.start(["-k", "all"])
106
134
  end
107
-
135
+
108
136
  it "should support -X off to turn off the mutex" do
109
137
  Merb::Config.parse_args(["-X", "off"])
110
138
  Merb::Config[:use_mutex].should == false
@@ -114,7 +142,7 @@ describe Merb::Config do
114
142
  Merb::Config.parse_args(["-X", "on"])
115
143
  Merb::Config[:use_mutex].should == true
116
144
  end
117
-
145
+
118
146
  it "should take Merb.disable into account" do
119
147
  Merb::Config[:disabled_components].should == []
120
148
  Merb::Config[:disabled_components] << :foo
@@ -124,7 +152,7 @@ describe Merb::Config do
124
152
  Merb.disabled?(:foo).should == true
125
153
  Merb.disabled?(:foo, :buz).should == true
126
154
  end
127
-
155
+
128
156
  it "should take Merb.testing? into account" do
129
157
  $TESTING.should == true
130
158
  Merb::Config[:testing].should be_nil
@@ -135,5 +163,5 @@ describe Merb::Config do
135
163
  Merb.should be_testing
136
164
  $TESTING = true; Merb::Config[:testing] = false # reset
137
165
  end
138
-
139
- end
166
+
167
+ end
@@ -0,0 +1,22 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ class ProphecyOfSmalltalk
4
+ end
5
+
6
+ describe Class, "#reset_inheritable_attributes" do
7
+ it "resets @inheritable_attributes to empty Hash unless EMPTY_INHERITABLE_ATTRIBUTES constant is defined" do
8
+ ProphecyOfSmalltalk.reset_inheritable_attributes
9
+
10
+ ProphecyOfSmalltalk.instance_variable_get("@inheritable_attributes").should == {}
11
+ end
12
+
13
+ it "resets @inheritable_attributes to whatever Class::EMPTY_INHERITABLE_ATTRIBUTES is" do
14
+ class Class
15
+ EMPTY_INHERITABLE_ATTRIBUTES = { :patience => "Is a virtue" }
16
+ end
17
+
18
+ ProphecyOfSmalltalk.reset_inheritable_attributes
19
+
20
+ ProphecyOfSmalltalk.instance_variable_get("@inheritable_attributes")[:patience].should == "Is a virtue"
21
+ end
22
+ end
@@ -7,40 +7,43 @@ describe Hash, "environmentize_keys!" do
7
7
  { :test_1 => 'test', 'test_2' => 'test', 1 => 'test' }.environmentize_keys!.should ==
8
8
  { 'TEST_1' => 'test', 'TEST_2' => 'test', '1' => 'test' }
9
9
  end
10
-
10
+
11
11
  it "should only transform one level of keys" do
12
- { :test_1 => { :test2 => 'test'} }.environmentize_keys!.should ==
12
+ { :test_1 => { :test2 => 'test'} }.environmentize_keys!.should ==
13
13
  { 'TEST_1' => { :test2 => 'test'} }
14
14
  end
15
15
  end
16
16
 
17
+
17
18
  describe Hash, "only" do
18
19
  before do
19
20
  @hash = { :one => 'ONE', 'two' => 'TWO', 3 => 'THREE' }
20
21
  end
21
-
22
+
22
23
  it "should return a hash with only the given key(s)" do
23
24
  @hash.only(:one).should == { :one => 'ONE' }
24
25
  @hash.only(:one, 3).should == { :one => 'ONE', 3 => 'THREE' }
25
26
  end
26
27
  end
27
28
 
29
+
28
30
  describe Hash, "except" do
29
31
  before do
30
32
  @hash = { :one => 'ONE', 'two' => 'TWO', 3 => 'THREE' }
31
33
  end
32
-
34
+
33
35
  it "should return a hash without only the given key(s)" do
34
36
  @hash.except(:one).should == { 'two' => 'TWO', 3 => 'THREE' }
35
37
  @hash.except(:one, 3).should == { 'two' => 'TWO' }
36
38
  end
37
39
  end
38
40
 
41
+
39
42
  describe Hash, "to_xml_attributes" do
40
43
  before do
41
44
  @hash = { :one => "ONE", "two" => "TWO" }
42
45
  end
43
-
46
+
44
47
  it "should turn the hash into xml attributes" do
45
48
  attrs = @hash.to_xml_attributes
46
49
  attrs.should match(/one="ONE"/m)
@@ -48,12 +51,13 @@ describe Hash, "to_xml_attributes" do
48
51
  end
49
52
  end
50
53
 
54
+
51
55
  describe Hash, "from_xml" do
52
56
  it "should transform a simple tag with content" do
53
57
  xml = "<tag>This is the contents</tag>"
54
58
  Hash.from_xml(xml).should == { 'tag' => 'This is the contents' }
55
59
  end
56
-
60
+
57
61
  it "should work with cdata tags" do
58
62
  xml = <<-END
59
63
  <tag>
@@ -64,13 +68,13 @@ describe Hash, "from_xml" do
64
68
  END
65
69
  Hash.from_xml(xml)["tag"].strip.should == "text inside cdata"
66
70
  end
67
-
71
+
68
72
  it "should transform a simple tag with attributes" do
69
73
  xml = "<tag attr1='1' attr2='2'></tag>"
70
74
  hash = { 'tag' => { 'attr1' => '1', 'attr2' => '2' } }
71
75
  Hash.from_xml(xml).should == hash
72
- end
73
-
76
+ end
77
+
74
78
  it "should transform repeating siblings into an array" do
75
79
  xml =<<-XML
76
80
  <opt>
@@ -78,9 +82,9 @@ describe Hash, "from_xml" do
78
82
  <user login="stty" fullname="Simon T Tyson" />
79
83
  </opt>
80
84
  XML
81
-
85
+
82
86
  Hash.from_xml(xml)['opt']['user'].should be_an_instance_of(Array)
83
-
87
+
84
88
  hash = {
85
89
  'opt' => {
86
90
  'user' => [{
@@ -92,57 +96,57 @@ describe Hash, "from_xml" do
92
96
  }]
93
97
  }
94
98
  }
95
-
99
+
96
100
  Hash.from_xml(xml).should == hash
97
101
  end
98
-
102
+
99
103
  it "should not transform non-repeating siblings into an array" do
100
104
  xml =<<-XML
101
105
  <opt>
102
106
  <user login="grep" fullname="Gary R Epstein" />
103
107
  </opt>
104
108
  XML
105
-
109
+
106
110
  Hash.from_xml(xml)['opt']['user'].should be_an_instance_of(Hash)
107
-
111
+
108
112
  hash = {
109
- 'opt' => {
110
- 'user' => {
111
- 'login' => 'grep',
113
+ 'opt' => {
114
+ 'user' => {
115
+ 'login' => 'grep',
112
116
  'fullname' => 'Gary R Epstein'
113
117
  }
114
118
  }
115
119
  }
116
-
120
+
117
121
  Hash.from_xml(xml).should == hash
118
122
  end
119
-
123
+
120
124
  it "should typecast an integer" do
121
125
  xml = "<tag type='integer'>10</tag>"
122
126
  Hash.from_xml(xml)['tag'].should == 10
123
127
  end
124
-
128
+
125
129
  it "should typecast a true boolean" do
126
130
  xml = "<tag type='boolean'>true</tag>"
127
131
  Hash.from_xml(xml)['tag'].should be_true
128
132
  end
129
-
133
+
130
134
  it "should typecast a false boolean" do
131
135
  ["false"].each do |w|
132
136
  Hash.from_xml("<tag type='boolean'>#{w}</tag>")['tag'].should be_false
133
137
  end
134
138
  end
135
-
139
+
136
140
  it "should typecast a datetime" do
137
141
  xml = "<tag type='datetime'>2007-12-31 10:32</tag>"
138
142
  Hash.from_xml(xml)['tag'].should == Time.parse( '2007-12-31 10:32' ).utc
139
143
  end
140
-
144
+
141
145
  it "should typecast a date" do
142
146
  xml = "<tag type='date'>2007-12-31</tag>"
143
147
  Hash.from_xml(xml)['tag'].should == Date.parse('2007-12-31')
144
148
  end
145
-
149
+
146
150
  it "should unescape html entities" do
147
151
  values = {
148
152
  "<" => "&lt;",
@@ -156,43 +160,43 @@ describe Hash, "from_xml" do
156
160
  Hash.from_xml(xml)['tag'].should match(Regexp.new(k))
157
161
  end
158
162
  end
159
-
163
+
160
164
  it "should undasherize keys as tags" do
161
165
  xml = "<tag-1>Stuff</tag-1>"
162
166
  Hash.from_xml(xml).keys.should include( 'tag_1' )
163
167
  end
164
-
168
+
165
169
  it "should undasherize keys as attributes" do
166
170
  xml = "<tag1 attr-1='1'></tag1>"
167
171
  Hash.from_xml(xml)['tag1'].keys.should include( 'attr_1')
168
172
  end
169
-
173
+
170
174
  it "should undasherize keys as tags and attributes" do
171
175
  xml = "<tag-1 attr-1='1'></tag-1>"
172
176
  Hash.from_xml(xml).keys.should include( 'tag_1' )
173
177
  Hash.from_xml(xml)['tag_1'].keys.should include( 'attr_1')
174
178
  end
175
-
179
+
176
180
  it "should render nested content correctly" do
177
181
  xml = "<root><tag1>Tag1 Content <em><strong>This is strong</strong></em></tag1></root>"
178
182
  Hash.from_xml(xml)['root']['tag1'].should == "Tag1 Content <em><strong>This is strong</strong></em>"
179
183
  end
180
-
184
+
181
185
  it "should render nested content with split text nodes correctly" do
182
186
  xml = "<root>Tag1 Content<em>Stuff</em> Hi There</root>"
183
187
  Hash.from_xml(xml)['root'].should == "Tag1 Content<em>Stuff</em> Hi There"
184
188
  end
185
-
189
+
186
190
  it "should ignore attributes when a child is a text node" do
187
191
  xml = "<root attr1='1'>Stuff</root>"
188
192
  Hash.from_xml(xml).should == { "root" => "Stuff" }
189
193
  end
190
-
194
+
191
195
  it "should ignore attributes when any child is a text node" do
192
196
  xml = "<root attr1='1'>Stuff <em>in italics</em></root>"
193
197
  Hash.from_xml(xml).should == { "root" => "Stuff <em>in italics</em>" }
194
198
  end
195
-
199
+
196
200
  it "should correctly transform multiple children" do
197
201
  xml = <<-XML
198
202
  <user gender='m'>
@@ -203,7 +207,7 @@ describe Hash, "from_xml" do
203
207
  <is-cool type='boolean'>true</is-cool>
204
208
  </user>
205
209
  XML
206
-
210
+
207
211
  hash = {
208
212
  "user" => {
209
213
  "gender" => "m",
@@ -214,10 +218,10 @@ describe Hash, "from_xml" do
214
218
  "is_cool" => true
215
219
  }
216
220
  }
217
-
221
+
218
222
  Hash.from_xml(xml).should == hash
219
223
  end
220
-
224
+
221
225
  it "should properly handle nil values (ActiveSupport Compatible)" do
222
226
  topic_xml = <<-EOT
223
227
  <topic>
@@ -232,15 +236,15 @@ describe Hash, "from_xml" do
232
236
  EOT
233
237
 
234
238
  expected_topic_hash = {
235
- 'title' => nil,
239
+ 'title' => nil,
236
240
  'id' => nil,
237
241
  'approved' => nil,
238
242
  'written_on' => nil,
239
243
  'viewed_at' => nil,
240
- 'content' => nil,
244
+ 'content' => nil,
241
245
  'parent_id' => nil
242
246
  }
243
- Hash.from_xml(topic_xml)["topic"].should == expected_topic_hash
247
+ Hash.from_xml(topic_xml)["topic"].should == expected_topic_hash
244
248
  end
245
249
 
246
250
  it "should handle a single record from xml (ActiveSupport Compatible)" do
@@ -362,7 +366,7 @@ describe Hash, "from_xml" do
362
366
  v.should == expected_topic_hash[k]
363
367
  end
364
368
  end
365
-
369
+
366
370
  it "should handle an emtpy array (ActiveSupport Compatible)" do
367
371
  blog_xml = <<-XML
368
372
  <blog>
@@ -406,7 +410,7 @@ describe Hash, "from_xml" do
406
410
  </blog>
407
411
  XML
408
412
  expected_blog_hash = {"blog" => {"posts" => ["a post", "another post"]}}
409
- Hash.from_xml(blog_xml).should == expected_blog_hash
413
+ Hash.from_xml(blog_xml).should == expected_blog_hash
410
414
  end
411
415
 
412
416
  it "should handle file types (ActiveSupport Compatible)" do
@@ -419,10 +423,10 @@ describe Hash, "from_xml" do
419
423
  hash = Hash.from_xml(blog_xml)
420
424
  hash.should have_key('blog')
421
425
  hash['blog'].should have_key('logo')
422
-
426
+
423
427
  file = hash['blog']['logo']
424
428
  file.original_filename.should == 'logo.png'
425
- file.content_type.should == 'image/png'
429
+ file.content_type.should == 'image/png'
426
430
  end
427
431
 
428
432
  it "should handle file from xml with defaults (ActiveSupport Compatible)" do
@@ -434,7 +438,7 @@ describe Hash, "from_xml" do
434
438
  XML
435
439
  file = Hash.from_xml(blog_xml)['blog']['logo']
436
440
  file.original_filename.should == 'untitled'
437
- file.content_type.should == 'application/octet-stream'
441
+ file.content_type.should == 'application/octet-stream'
438
442
  end
439
443
 
440
444
  it "should handle xsd like types from xml (ActiveSupport Compatible)" do
@@ -466,7 +470,7 @@ describe Hash, "from_xml" do
466
470
  <product>
467
471
  <weight type="double">0.5</weight>
468
472
  <image type="ProductImage"><filename>image.gif</filename></image>
469
-
473
+
470
474
  </product>
471
475
  EOT
472
476
 
@@ -474,33 +478,45 @@ describe Hash, "from_xml" do
474
478
  'weight' => 0.5,
475
479
  'image' => {'type' => 'ProductImage', 'filename' => 'image.gif' },
476
480
  }
477
-
481
+
478
482
  Hash.from_xml(product_xml)["product"].should == expected_product_hash
479
483
  end
480
484
 
481
485
  it "should handle unescaping from xml (ActiveResource Compatible)" do
482
486
  xml_string = '<person><bare-string>First &amp; Last Name</bare-string><pre-escaped-string>First &amp;amp; Last Name</pre-escaped-string></person>'
483
- expected_hash = {
484
- 'bare_string' => 'First & Last Name',
487
+ expected_hash = {
488
+ 'bare_string' => 'First & Last Name',
485
489
  'pre_escaped_string' => 'First &amp; Last Name'
486
490
  }
487
-
488
- Hash.from_xml(xml_string)['person'].should == expected_hash
489
- end
490
491
 
492
+ Hash.from_xml(xml_string)['person'].should == expected_hash
493
+ end
491
494
  end
492
495
 
496
+
493
497
  describe Hash, 'to_params' do
494
498
  before do
495
499
  @hash = { :name => 'Bob', :address => { :street => '111 Ruby Ave.', :city => 'Ruby Central', :phones => ['111-111-1111', '222-222-2222'] } }
496
500
  end
497
-
501
+
498
502
  it 'should convert correctly into query parameters' do
499
503
  @hash.to_params.split('&').sort.should ==
500
504
  'name=Bob&address[city]=Ruby Central&address[phones]=111-111-1111222-222-2222&address[street]=111 Ruby Ave.'.split('&').sort
501
505
  end
502
-
506
+
503
507
  it 'should not leave a trailing &' do
504
508
  @hash.to_params.should_not match(/&$/)
505
509
  end
506
- end
510
+ end
511
+
512
+
513
+ describe Hash, 'to_mash' do
514
+ before :each do
515
+ @hash = Hash.new(10)
516
+ end
517
+
518
+ it "copies default Hash value to Mash" do
519
+ @mash = @hash.to_mash
520
+ @mash[:merb].should == 10
521
+ end
522
+ end