jactive_support 1.0.0-universal-java-1.6
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.
- data/.gitignore +4 -0
- data/.rvmrc +63 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +20 -0
- data/Rakefile +45 -0
- data/jactive_support.gemspec +25 -0
- data/lib/jactive_support/constantize.rb +19 -0
- data/lib/jactive_support/core_ext/enum.rb +43 -0
- data/lib/jactive_support/core_ext/hash/assert_valid_params.rb +19 -0
- data/lib/jactive_support/core_ext/hash/with_keys_values.rb +9 -0
- data/lib/jactive_support/core_ext/hash.rb +2 -0
- data/lib/jactive_support/core_ext/locale.rb +28 -0
- data/lib/jactive_support/core_ext/module.rb +9 -0
- data/lib/jactive_support/core_ext/numeric.rb +7 -0
- data/lib/jactive_support/core_ext/ordering.rb +17 -0
- data/lib/jactive_support/core_ext/to_java.rb +9 -0
- data/lib/jactive_support/core_ext/to_java_date.rb +25 -0
- data/lib/jactive_support/core_ext/to_java_list.rb +11 -0
- data/lib/jactive_support/core_ext/to_java_map.rb +11 -0
- data/lib/jactive_support/core_ext.rb +4 -0
- data/lib/jactive_support/java_ext/date/calculations.rb +43 -0
- data/lib/jactive_support/java_ext/date/conversions.rb +135 -0
- data/lib/jactive_support/java_ext/date.rb +37 -0
- data/lib/jactive_support/java_ext/enum.rb +19 -0
- data/lib/jactive_support/java_ext/iterable.rb +74 -0
- data/lib/jactive_support/java_ext/iterator.rb +8 -0
- data/lib/jactive_support/java_ext/list.rb +65 -0
- data/lib/jactive_support/java_ext/list_iterator.rb +8 -0
- data/lib/jactive_support/java_ext/locale.rb +32 -0
- data/lib/jactive_support/java_ext/map/constructor.rb +35 -0
- data/lib/jactive_support/java_ext/map/hash.rb +166 -0
- data/lib/jactive_support/java_ext/map.rb +6 -0
- data/lib/jactive_support/java_ext/number.rb +91 -0
- data/lib/jactive_support/java_ext/sql_date/conversions.rb +33 -0
- data/lib/jactive_support/java_ext/sql_date.rb +7 -0
- data/lib/jactive_support/java_ext.rb +4 -0
- data/lib/jactive_support/json/encoders/collection.rb +12 -0
- data/lib/jactive_support/json/encoders/locale.rb +6 -0
- data/lib/jactive_support/json/encoders/map.rb +55 -0
- data/lib/jactive_support/json/encoding.rb +5 -0
- data/lib/jactive_support/json.rb +1 -0
- data/lib/jactive_support/rescuable.rb +62 -0
- data/lib/jactive_support/version.rb +3 -0
- data/lib/jactive_support.rb +5 -0
- data/spec/constantize_spec.rb +57 -0
- data/spec/core_ext/hash_spec.rb +34 -0
- data/spec/core_ext/module_spec.rb +19 -0
- data/spec/core_ext/ordering_spec.rb +12 -0
- data/spec/enum_spec.rb +67 -0
- data/spec/java_ext/iterable/clear_spec.rb +56 -0
- data/spec/java_ext/iterable/delete_if_spec.rb +71 -0
- data/spec/java_ext/iterable/empty_spec.rb +10 -0
- data/spec/java_ext/iterable/reject_spec.rb +76 -0
- data/spec/java_ext/iterable/shared/enumeratorize.rb +12 -0
- data/spec/java_ext/iterable/shared/fixtures.rb +90 -0
- data/spec/java_ext/iterable/shift_spec.rb +160 -0
- data/spec/java_ext/list/clear_spec.rb +56 -0
- data/spec/java_ext/list/collect_spec.rb +11 -0
- data/spec/java_ext/list/last_spec.rb +87 -0
- data/spec/java_ext/list/map_spec.rb +11 -0
- data/spec/java_ext/list/push_spec.rb +44 -0
- data/spec/java_ext/list/shared/collect.rb +133 -0
- data/spec/java_ext/list/shared/fixtures.rb +34 -0
- data/spec/java_ext/map/assoc_spec.rb +43 -0
- data/spec/java_ext/map/clear_spec.rb +49 -0
- data/spec/java_ext/map/clone_spec.rb +13 -0
- data/spec/java_ext/map/compare_by_identity_spec.rb +111 -0
- data/spec/java_ext/map/constructor_spec.rb +54 -0
- data/spec/java_ext/map/delete_if_spec.rb +54 -0
- data/spec/java_ext/map/delete_spec.rb +38 -0
- data/spec/java_ext/map/each_key_spec.rb +29 -0
- data/spec/java_ext/map/each_pair_spec.rb +38 -0
- data/spec/java_ext/map/each_spec.rb +9 -0
- data/spec/java_ext/map/each_value_spec.rb +28 -0
- data/spec/java_ext/map/element_reference_spec.rb +119 -0
- data/spec/java_ext/map/element_set_spec.rb +7 -0
- data/spec/java_ext/map/empty_spec.rb +15 -0
- data/spec/java_ext/map/eql_spec.rb +19 -0
- data/spec/java_ext/map/equal_value_spec.rb +18 -0
- data/spec/java_ext/map/fetch_spec.rb +35 -0
- data/spec/java_ext/map/fixtures/classes.rb +36 -0
- data/spec/java_ext/map/flatten_spec.rb +64 -0
- data/spec/java_ext/map/has_key_spec.rb +8 -0
- data/spec/java_ext/map/has_value_spec.rb +8 -0
- data/spec/java_ext/map/hash_spec.rb +53 -0
- data/spec/java_ext/map/include_spec.rb +7 -0
- data/spec/java_ext/map/index_spec.rb +7 -0
- data/spec/java_ext/map/indexes_spec.rb +9 -0
- data/spec/java_ext/map/indices_spec.rb +9 -0
- data/spec/java_ext/map/initialize_copy_spec.rb +13 -0
- data/spec/java_ext/map/initialize_spec.rb +64 -0
- data/spec/java_ext/map/inspect_spec.rb +9 -0
- data/spec/java_ext/map/invert_spec.rb +27 -0
- data/spec/java_ext/map/keep_if_spec.rb +33 -0
- data/spec/java_ext/map/key_spec.rb +14 -0
- data/spec/java_ext/map/keys_spec.rb +39 -0
- data/spec/java_ext/map/length_spec.rb +7 -0
- data/spec/java_ext/map/member_spec.rb +7 -0
- data/spec/java_ext/map/merge_spec.rb +69 -0
- data/spec/java_ext/map/rassoc_spec.rb +39 -0
- data/spec/java_ext/map/reject_spec.rb +123 -0
- data/spec/java_ext/map/replace_spec.rb +7 -0
- data/spec/java_ext/map/select_spec.rb +98 -0
- data/spec/java_ext/map/shared/each.rb +77 -0
- data/spec/java_ext/map/shared/eql.rb +224 -0
- data/spec/java_ext/map/shared/equal.rb +94 -0
- data/spec/java_ext/map/shared/index.rb +29 -0
- data/spec/java_ext/map/shared/iteration.rb +28 -0
- data/spec/java_ext/map/shared/key.rb +43 -0
- data/spec/java_ext/map/shared/length.rb +12 -0
- data/spec/java_ext/map/shared/replace.rb +82 -0
- data/spec/java_ext/map/shared/store.rb +68 -0
- data/spec/java_ext/map/shared/to_s.rb +68 -0
- data/spec/java_ext/map/shared/update.rb +95 -0
- data/spec/java_ext/map/shared/value.rb +16 -0
- data/spec/java_ext/map/shared/values_at.rb +12 -0
- data/spec/java_ext/map/shift_spec.rb +44 -0
- data/spec/java_ext/map/size_spec.rb +7 -0
- data/spec/java_ext/map/sort_spec.rb +17 -0
- data/spec/java_ext/map/store_spec.rb +7 -0
- data/spec/java_ext/map/to_a_spec.rb +29 -0
- data/spec/java_ext/map/to_hash_spec.rb +11 -0
- data/spec/java_ext/map/to_s_spec.rb +20 -0
- data/spec/java_ext/map/try_convert_spec.rb +32 -0
- data/spec/java_ext/map/update_spec.rb +7 -0
- data/spec/java_ext/map/value_spec.rb +8 -0
- data/spec/java_ext/map/values_at_spec.rb +7 -0
- data/spec/java_ext/map/values_spec.rb +10 -0
- data/spec/locale_spec.rb +77 -0
- data/spec/shared/fixtures.rb +7 -0
- data/spec/shared/version.rb +123 -0
- data/spec/spec_helper.rb +50 -0
- metadata +332 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
shared_examples_for :hash_update do |method|
|
|
2
|
+
before { @method = method }
|
|
3
|
+
|
|
4
|
+
=begin self
|
|
5
|
+
it "returns self" do
|
|
6
|
+
h = new_hash(:_1 => 'a', :_2 => '3')
|
|
7
|
+
h.send(@method, :_1 => '9', :_9 => 2).should equal(h)
|
|
8
|
+
end
|
|
9
|
+
=end
|
|
10
|
+
|
|
11
|
+
it "adds the entries from other, overwriting duplicate keys" do
|
|
12
|
+
h = new_hash(:_1 => 'a', :_2 => '3')
|
|
13
|
+
h.send(@method, :_1 => '9', :_9 => 2)
|
|
14
|
+
h.should == new_hash(:_1 => "9", :_2 => "3", :_9 => 2)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
=begin self
|
|
18
|
+
it "returns self with block" do
|
|
19
|
+
h1 = new_hash(:a => 2, :b => -1)
|
|
20
|
+
h2 = new_hash(:a => -2, :c => 1)
|
|
21
|
+
h1.send(@method, h2) { |k,x,y| 3.14 }.should equal(h1)
|
|
22
|
+
end
|
|
23
|
+
=end
|
|
24
|
+
|
|
25
|
+
=begin nil
|
|
26
|
+
it "sets any duplicate key to the value of block if passed a block" do
|
|
27
|
+
h1 = new_hash(:a => 2, :b => -1)
|
|
28
|
+
h2 = new_hash(:a => -2, :c => 1)
|
|
29
|
+
h1.send(@method, h2) { |k,x,y| 3.14 }
|
|
30
|
+
h1.should == new_hash(:c => 1, :b => -1, :a => 3.14)
|
|
31
|
+
|
|
32
|
+
h1.send(@method, h1) { nil }
|
|
33
|
+
h1.should == new_hash(:a => nil, :b => nil, :c => nil)
|
|
34
|
+
end
|
|
35
|
+
=end
|
|
36
|
+
|
|
37
|
+
it "tries to convert the passed argument to a hash using #to_hash" do
|
|
38
|
+
obj = mock('{1=>2}')
|
|
39
|
+
obj.should_receive(:to_hash).and_return(new_hash(1 => 2).to_hash)
|
|
40
|
+
new_hash(3 => 4).send(@method, obj).should == new_hash(1 => 2, 3 => 4)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "does not call to_hash on hash subclasses" do
|
|
44
|
+
new_hash(3 => 4).send(@method, ToHashHash[1 => 2]).should == new_hash(1 => 2, 3 => 4)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
=begin nil
|
|
48
|
+
it "processes entries with same order as merge()" do
|
|
49
|
+
h = new_hash(1 => 2, 3 => 4, 5 => 6, "x" => nil, nil => 5, [] => [])
|
|
50
|
+
merge_bang_pairs = []
|
|
51
|
+
merge_pairs = []
|
|
52
|
+
h.merge(h) { |*arg| merge_pairs << arg }
|
|
53
|
+
h.send(@method, h) { |*arg| merge_bang_pairs << arg }
|
|
54
|
+
merge_bang_pairs.should == merge_pairs
|
|
55
|
+
end
|
|
56
|
+
=end
|
|
57
|
+
|
|
58
|
+
=begin frozen
|
|
59
|
+
ruby_version_is ""..."1.9" do
|
|
60
|
+
it "raises a TypeError if called on a non-empty, frozen instance" do
|
|
61
|
+
lambda { HashSpecs.frozen_hash.send(@method, 1 => 2) }.should raise_error(TypeError)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "does not raise an exception on a frozen instance that would not be modified" do
|
|
65
|
+
hash = HashSpecs.frozen_hash.send(@method, HashSpecs.empty_frozen_hash)
|
|
66
|
+
hash.should == HashSpecs.frozen_hash
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
ruby_version_is "1.9" do
|
|
71
|
+
it "raises a RuntimeError on a frozen instance that is modified" do
|
|
72
|
+
lambda do
|
|
73
|
+
HashSpecs.frozen_hash.send(@method, 1 => 2)
|
|
74
|
+
end.should raise_error(RuntimeError)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "checks frozen status before coercing an object with #to_hash" do
|
|
78
|
+
obj = mock("to_hash frozen")
|
|
79
|
+
# This is necessary because mock cleanup code cannot run on the frozen
|
|
80
|
+
# object.
|
|
81
|
+
def obj.to_hash() raise Exception, "should not receive #to_hash" end
|
|
82
|
+
obj.freeze
|
|
83
|
+
|
|
84
|
+
lambda { HashSpecs.frozen_hash.send(@method, obj) }.should raise_error(RuntimeError)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# see redmine #1571
|
|
88
|
+
it "raises a RuntimeError on a frozen instance that would not be modified" do
|
|
89
|
+
lambda do
|
|
90
|
+
HashSpecs.frozen_hash.send(@method, HashSpecs.empty_frozen_hash)
|
|
91
|
+
end.should raise_error(RuntimeError)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
=end
|
|
95
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
shared_examples_for :hash_value_p do |method|
|
|
2
|
+
before { @method = method }
|
|
3
|
+
|
|
4
|
+
it "returns true if the value exists in the hash" do
|
|
5
|
+
new_hash(:a => :b).send(@method, :a).should == false
|
|
6
|
+
new_hash(1 => 2).send(@method, 2).should == true
|
|
7
|
+
h = new_hash 5
|
|
8
|
+
h.send(@method, 5).should == false
|
|
9
|
+
h = new_hash { 5 }
|
|
10
|
+
h.send(@method, 5).should == false
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "uses == semantics for comparing values" do
|
|
14
|
+
new_hash(5 => 2.0).send(@method, 2).should == true
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
shared_examples_for :hash_values_at do |method|
|
|
2
|
+
before { @method = method }
|
|
3
|
+
|
|
4
|
+
it "returns an array of values for the given keys" do
|
|
5
|
+
h = new_hash(:a => 9, :b => 'a', :c => -10, :d => nil)
|
|
6
|
+
h.send(@method).should be_kind_of(Array)
|
|
7
|
+
h.send(@method).should == []
|
|
8
|
+
h.send(@method, :a, :d, :b).should be_kind_of(Array)
|
|
9
|
+
h.send(@method, :a, :d, :b).should == [9, nil, 'a']
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
|
3
|
+
|
|
4
|
+
describe "Hash#shift" do
|
|
5
|
+
=begin shift
|
|
6
|
+
it "removes a pair from hash and return it" do
|
|
7
|
+
h = new_hash(:a => 1, :b => 2, "c" => 3, nil => 4, [] => 5)
|
|
8
|
+
h2 = h.dup
|
|
9
|
+
|
|
10
|
+
h.size.times do |i|
|
|
11
|
+
r = h.shift
|
|
12
|
+
r.should be_kind_of(Array)
|
|
13
|
+
h2[r.first].should == r.last
|
|
14
|
+
h.size.should == h2.size - i - 1
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
h.should == new_hash
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "returns nil from an empty hash " do
|
|
21
|
+
new_hash.shift.should == nil
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "returns (computed) default for empty hashes" do
|
|
25
|
+
new_hash(5).shift.should == 5
|
|
26
|
+
h = new_hash { |*args| args }
|
|
27
|
+
h.shift.should == [h, nil]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
ruby_version_is "" ... "1.9" do
|
|
31
|
+
it "raises a TypeError if called on a frozen instance" do
|
|
32
|
+
lambda { HashSpecs.frozen_hash.shift }.should raise_error(TypeError)
|
|
33
|
+
lambda { HashSpecs.empty_frozen_hash.shift }.should raise_error(TypeError)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
ruby_version_is "1.9" do
|
|
38
|
+
it "raises a RuntimeError if called on a frozen instance" do
|
|
39
|
+
lambda { HashSpecs.frozen_hash.shift }.should raise_error(RuntimeError)
|
|
40
|
+
lambda { HashSpecs.empty_frozen_hash.shift }.should raise_error(RuntimeError)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
=end
|
|
44
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
|
3
|
+
|
|
4
|
+
describe "Hash#sort" do
|
|
5
|
+
it "converts self to a nested array of [key, value] arrays and sort with Array#sort" do
|
|
6
|
+
new_hash('a' => 'b', '1' => '2', 'b' => 'a').sort.should ==
|
|
7
|
+
[["1", "2"], ["a", "b"], ["b", "a"]]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "works when some of the keys are themselves arrays" do
|
|
11
|
+
new_hash([1,2] => 5, [1,1] => 5).sort.should == [[[1,1],5], [[1,2],5]]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "uses block to sort array if passed a block" do
|
|
15
|
+
new_hash(1 => 2, 2 => 9, 3 => 4).sort { |a,b| b <=> a }.should == [[3, 4], [2, 9], [1, 2]]
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
|
3
|
+
|
|
4
|
+
describe "Hash#to_a" do
|
|
5
|
+
it "returns a list of [key, value] pairs with same order as each()" do
|
|
6
|
+
h = new_hash(:a => 1, 1 => :a, 3 => :b, :b => 5)
|
|
7
|
+
pairs = []
|
|
8
|
+
|
|
9
|
+
h.each_pair do |key, value|
|
|
10
|
+
pairs << [key, value]
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
h.to_a.should be_kind_of(Array)
|
|
14
|
+
h.to_a.should == pairs
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "is called for Enumerable#entries" do
|
|
18
|
+
h = new_hash(:a => 1, 1 => :a, 3 => :b, :b => 5)
|
|
19
|
+
pairs = []
|
|
20
|
+
|
|
21
|
+
h.each_pair do |key, value|
|
|
22
|
+
pairs << [key, value]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
ent = h.entries
|
|
26
|
+
ent.should be_kind_of(Array)
|
|
27
|
+
ent.should == pairs
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
|
3
|
+
require File.expand_path('../shared/to_s', __FILE__)
|
|
4
|
+
|
|
5
|
+
describe "Hash#to_s" do
|
|
6
|
+
|
|
7
|
+
ruby_version_is "1.9" do
|
|
8
|
+
it_behaves_like :to_s, :to_s
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
ruby_version_is ""..."1.9" do
|
|
12
|
+
it "returns a string by calling Hash#to_a and using Array#join with default separator" do
|
|
13
|
+
h = new_hash(:fun => 'x', 1 => 3, nil => "ok", [] => :y)
|
|
14
|
+
h.to_a.to_s.should == h.to_s
|
|
15
|
+
old, $, = $,, ':'
|
|
16
|
+
h.to_a.to_s.should == h.to_s
|
|
17
|
+
$, = old
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
ruby_version_is "1.8.8" do
|
|
4
|
+
describe "Hash.try_convert" do
|
|
5
|
+
it "returns the argument if passed a Hash" do
|
|
6
|
+
h = {:foo => :glark}
|
|
7
|
+
Hash.try_convert(h).should == h
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "returns nil if the argument can't be coerced into a Hash" do
|
|
11
|
+
Hash.try_convert(Object.new).should be_nil
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "does not rescue exceptions raised by #to_hash" do
|
|
15
|
+
obj = mock("to_hash raises")
|
|
16
|
+
obj.should_receive(:to_hash).and_raise(RuntimeError)
|
|
17
|
+
lambda { Hash.try_convert obj }.should raise_error(RuntimeError)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "coerces the argument with #to_hash" do
|
|
21
|
+
obj = mock('to_hash')
|
|
22
|
+
obj.should_receive(:to_hash).and_return({:foo => :bar})
|
|
23
|
+
Hash.try_convert(obj).should == {:foo => :bar}
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "raises a TypeError if #to_hash does not return a Hash" do
|
|
27
|
+
obj = mock("to_hash invalid")
|
|
28
|
+
obj.should_receive(:to_hash).and_return(:invalid_to_hash)
|
|
29
|
+
lambda { Hash.try_convert obj }.should raise_error(TypeError)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
|
2
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
|
3
|
+
|
|
4
|
+
describe "Hash#values" do
|
|
5
|
+
it "returns an array of values" do
|
|
6
|
+
h = new_hash(1 => :a, 'a' => :a, 'the' => 'lang')
|
|
7
|
+
h.values.to_a.should be_kind_of(Array)
|
|
8
|
+
h.values.sort {|a, b| a.to_s <=> b.to_s}.should == [:a, :a, 'lang']
|
|
9
|
+
end
|
|
10
|
+
end
|
data/spec/locale_spec.rb
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
require 'jactive_support/core_ext/locale'
|
|
2
|
+
|
|
3
|
+
describe Locale do
|
|
4
|
+
before {java::util::Locale.setDefault(java::util::Locale.new('en'))}
|
|
5
|
+
subject {Locale.new('en', 'UK')}
|
|
6
|
+
|
|
7
|
+
it { Locale.should be(java.util.Locale) }
|
|
8
|
+
|
|
9
|
+
it "should have a current locale" do
|
|
10
|
+
Locale.current_locale.should be(Locale.getDefault)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "has a human name" do
|
|
14
|
+
subject.human_name.should eq('English (UK)')
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "supports inspect" do
|
|
18
|
+
subject.inspect.should eq('Locale[English (UK)]')
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "supports to_s" do
|
|
22
|
+
subject.to_s.should eq('en_UK')
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "supports to_str" do
|
|
26
|
+
subject.to_str.should eq('en_UK')
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "supports to_sym" do
|
|
30
|
+
subject.to_sym.should eq(:en_UK)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "can convert string to locale" do
|
|
34
|
+
"en".to_locale.should eq(Locale.new('en'))
|
|
35
|
+
"en_UK".to_locale.should eq(Locale.new('en', 'UK'))
|
|
36
|
+
"en-UK".to_locale.should eq(Locale.new('en', 'UK'))
|
|
37
|
+
"en_UK_Ireland".to_locale.should eq(Locale.new('en', 'UK', 'Ireland'))
|
|
38
|
+
"en-UK-Ireland".to_locale.should eq(Locale.new('en', 'UK', 'Ireland'))
|
|
39
|
+
"en_UK-Ireland".to_locale.should eq(Locale.new('en', 'UK', 'Ireland'))
|
|
40
|
+
"en-UK_Ireland".to_locale.should eq(Locale.new('en', 'UK', 'Ireland'))
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "can convert symbol to locale" do
|
|
44
|
+
:en.to_locale.should eq(Locale.new('en'))
|
|
45
|
+
:en_UK.to_locale.should eq(Locale.new('en', 'UK'))
|
|
46
|
+
:'en-UK'.to_locale.should eq(Locale.new('en', 'UK'))
|
|
47
|
+
:en_UK_Ireland.to_locale.should eq(Locale.new('en', 'UK', 'Ireland'))
|
|
48
|
+
:'en-UK-Ireland'.to_locale.should eq(Locale.new('en', 'UK', 'Ireland'))
|
|
49
|
+
:'en_UK-Ireland'.to_locale.should eq(Locale.new('en', 'UK', 'Ireland'))
|
|
50
|
+
:'en-UK_Ireland'.to_locale.should eq(Locale.new('en', 'UK', 'Ireland'))
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "converting nil to a locale is the same as the default locale" do
|
|
54
|
+
nil.to_locale.should be(Locale.current_locale)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "can set current locale" do
|
|
58
|
+
Locale.current_locale = Locale.new('en')
|
|
59
|
+
Locale.current_locale.should eq(:en.to_locale)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "can set current locale to a string" do
|
|
63
|
+
Locale.current_locale = 'en'
|
|
64
|
+
Locale.current_locale.should eq(:en.to_locale)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "can set current locale to a symbol" do
|
|
68
|
+
Locale.current_locale = :en
|
|
69
|
+
Locale.current_locale.should eq(:en.to_locale)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it "can set current locale to nil and it has no effect" do
|
|
73
|
+
old = Locale.current_locale
|
|
74
|
+
Locale.current_locale = nil
|
|
75
|
+
Locale.current_locale.should eq(old)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
class SpecVersion
|
|
2
|
+
# If beginning implementations have a problem with this include, we can
|
|
3
|
+
# manually implement the relational operators that are needed.
|
|
4
|
+
include Comparable
|
|
5
|
+
|
|
6
|
+
# SpecVersion handles comparison correctly for the context by filling in
|
|
7
|
+
# missing version parts according to the value of +ceil+. If +ceil+ is
|
|
8
|
+
# +false+, 0 digits fill in missing version parts. If +ceil+ is +true+, 9
|
|
9
|
+
# digits fill in missing parts. (See e.g. VersionGuard and BugGuard.)
|
|
10
|
+
def initialize(version, ceil = false)
|
|
11
|
+
@version = version
|
|
12
|
+
@ceil = ceil
|
|
13
|
+
@integer = nil
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def to_s
|
|
17
|
+
@version
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def to_str
|
|
21
|
+
to_s
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Converts a string representation of a version major.minor.tiny.patchlevel
|
|
25
|
+
# to an integer representation so that comparisons can be made. For example,
|
|
26
|
+
# "1.8.6.77" < "1.8.6.123" would be false if compared as strings.
|
|
27
|
+
def to_i
|
|
28
|
+
unless @integer
|
|
29
|
+
major, minor, tiny, patch = @version.split "."
|
|
30
|
+
if @ceil
|
|
31
|
+
tiny = 99 unless tiny
|
|
32
|
+
patch = 9999 unless patch
|
|
33
|
+
end
|
|
34
|
+
parts = [major, minor, tiny, patch].map { |x| x.to_i }
|
|
35
|
+
@integer = ("1%02d%02d%02d%04d" % parts).to_i
|
|
36
|
+
end
|
|
37
|
+
@integer
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def to_int
|
|
41
|
+
to_i
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def <=>(other)
|
|
45
|
+
if other.respond_to? :to_int
|
|
46
|
+
other = Integer other
|
|
47
|
+
else
|
|
48
|
+
other = SpecVersion.new(String(other)).to_i
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
self.to_i <=> other
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
class VersionGuard
|
|
56
|
+
@@ruby_version_override = nil
|
|
57
|
+
|
|
58
|
+
def self.ruby_version_override=(version)
|
|
59
|
+
@@ruby_version_override = version
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def self.ruby_version_override
|
|
63
|
+
@@ruby_version_override
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Returns a partial Ruby version string based on +which+. For example,
|
|
67
|
+
# if RUBY_VERSION = 8.2.3 and RUBY_PATCHLEVEL = 71:
|
|
68
|
+
#
|
|
69
|
+
# :major => "8"
|
|
70
|
+
# :minor => "8.2"
|
|
71
|
+
# :tiny => "8.2.3"
|
|
72
|
+
# :teeny => "8.2.3"
|
|
73
|
+
# :full => "8.2.3.71"
|
|
74
|
+
def self.ruby_version(which = :minor)
|
|
75
|
+
case which
|
|
76
|
+
when :major
|
|
77
|
+
n = 1
|
|
78
|
+
when :minor
|
|
79
|
+
n = 2
|
|
80
|
+
when :tiny, :teeny
|
|
81
|
+
n = 3
|
|
82
|
+
else
|
|
83
|
+
n = 4
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
patch = RUBY_PATCHLEVEL.to_i
|
|
87
|
+
patch = 0 if patch < 0
|
|
88
|
+
version = "#{ruby_version_override || RUBY_VERSION}.#{patch}"
|
|
89
|
+
version.split('.')[0,n].join('.')
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def initialize(version)
|
|
93
|
+
case version
|
|
94
|
+
when String
|
|
95
|
+
@version = SpecVersion.new version
|
|
96
|
+
when Range
|
|
97
|
+
a = SpecVersion.new version.first
|
|
98
|
+
b = SpecVersion.new version.last
|
|
99
|
+
@version = version.exclude_end? ? a...b : a..b
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def ruby_version
|
|
104
|
+
@ruby_version ||= SpecVersion.new self.class.ruby_version(:full)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def match?
|
|
108
|
+
if Range === @version
|
|
109
|
+
@version.include? ruby_version
|
|
110
|
+
else
|
|
111
|
+
ruby_version >= @version
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
class Object
|
|
117
|
+
def ruby_version_is(*args)
|
|
118
|
+
g = VersionGuard.new(*args)
|
|
119
|
+
yield if g.match?
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
puts "Ruby is " + VersionGuard.ruby_version(:full)
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'java'
|
|
2
|
+
require File.expand_path('../shared/version', __FILE__)
|
|
3
|
+
require File.expand_path('../shared/fixtures', __FILE__)
|
|
4
|
+
|
|
5
|
+
require 'jactive_support/java_ext/map/constructor'
|
|
6
|
+
class java::util::HashMap
|
|
7
|
+
include JactiveSupport::JavaExtensions::Map::Constructor
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class Object
|
|
11
|
+
# The following helpers provide a level of indirection for running the specs
|
|
12
|
+
# against a Hash implementation that has a different name than Hash.
|
|
13
|
+
|
|
14
|
+
# Returns the Hash class.
|
|
15
|
+
unless method_defined?(:hash_class)
|
|
16
|
+
def hash_class
|
|
17
|
+
java::util::LinkedHashMap
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
unless method_defined?(:ruby_hash_class)
|
|
22
|
+
def ruby_hash_class
|
|
23
|
+
Hash
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Returns a new instance of hash_class.
|
|
28
|
+
def new_hash(*args, &block)
|
|
29
|
+
if block
|
|
30
|
+
r = hash_class.new
|
|
31
|
+
r.default = block
|
|
32
|
+
r
|
|
33
|
+
elsif args.size == 1
|
|
34
|
+
value = args.first
|
|
35
|
+
if value.is_a?(Hash) or value.is_a?(hash_class)
|
|
36
|
+
r = hash_class.new
|
|
37
|
+
r.putAll(value)
|
|
38
|
+
r
|
|
39
|
+
else
|
|
40
|
+
r = hash_class.new
|
|
41
|
+
r.default = value
|
|
42
|
+
r
|
|
43
|
+
end
|
|
44
|
+
else
|
|
45
|
+
r = hash_class.new
|
|
46
|
+
args.each_slice(2) {|key,val| r.put(key,val)}
|
|
47
|
+
r
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|