area_cn 0.0.3 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -18,15 +18,30 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
+ # Find by name or code
22
+
21
23
  zhejiang = AreaCN.areas.find_by_name("浙江省")
22
24
  zhejiang.code # => "330000"
23
- zhejiang.children == zhejiang.cities # => ["杭州市", "...", "..."]
25
+ zhejiang.children == zhejiang.cities # => [{:name => "杭州市", :code => "330100"}, {}, {}, ...]
24
26
 
25
27
 
26
- hangzhou = AreaCN.areas.find_by_name("杭州市")
28
+ hangzhou = AreaCN.areas.find_by_code("330100")
27
29
  hangzhou.code # => "330100"
28
- hangzhou.children == hangzhou.districts # => ["滨江区", "...", "..."]
30
+ hangzhou.name # => "杭州市"
31
+ hangzhou.children == hangzhou.districts # => [{:name => "滨江区", :code => "330108"}, {}, {}, ...]
32
+
33
+ # Return all provinces
34
+
35
+ AreaCN.provinces
36
+ AreaCN.areas.provinces
37
+
38
+ # Code methods
39
+
40
+ zhejiang.code.prefix # => return '33'
41
+ hangzhou.code.parent # => return '330000'
29
42
 
43
+ zhejiang.ancestor?(hangzhou) # => return true
44
+ hangzhou.child?(zhejiang) # => return true
30
45
 
31
46
 
32
47
  ## Contributing
data/lib/area_cn/area.rb CHANGED
@@ -4,7 +4,7 @@ module AreaCN
4
4
  class Area
5
5
  include Comparable
6
6
 
7
- attr_reader :name, :children
7
+ attr_reader :name, :code, :children
8
8
  attr_accessor :parent
9
9
 
10
10
  # area is a json area from areas.json file
@@ -14,12 +14,8 @@ module AreaCN
14
14
  @children = []
15
15
  end
16
16
 
17
- def code
18
- @code.value
19
- end
20
-
21
17
  def parent_code
22
- @code.parent.code
18
+ @code.parent
23
19
  end
24
20
 
25
21
  def children_names
@@ -27,7 +23,7 @@ module AreaCN
27
23
  end
28
24
 
29
25
  def children_codes
30
- @children_codes ||= children.map { |child| child.code }
26
+ @children_codes ||= children.map(&:code)
31
27
  end
32
28
 
33
29
  def province?
@@ -54,6 +50,9 @@ module AreaCN
54
50
  to_hash.to_json(*args)
55
51
  end
56
52
 
53
+ def inspect
54
+ to_hash
55
+ end
57
56
  end
58
57
 
59
58
  class Province < Area
data/lib/area_cn/areas.rb CHANGED
@@ -29,9 +29,9 @@ module AreaCN
29
29
 
30
30
  def find_by_code(code, area_level = nil)
31
31
  scope = area_level ? instance_variable_get("@#{area_level.to_s.pluralize}") : all
32
- code_value = code.is_a?(Code) ? code.value : code
33
- scope.detect { |area| area.code == code_value }
32
+ scope.detect { |area| area.code == code }
34
33
  end
34
+ alias_method :get, :find_by_code
35
35
 
36
36
  def match(name, area_level = nil)
37
37
  scope = area_level ? instance_variable_get("@#{area_level.to_s.pluralize}") : all
data/lib/area_cn/code.rb CHANGED
@@ -1,13 +1,12 @@
1
1
  module AreaCN
2
- class Code
3
- include Comparable
4
-
2
+ class Code < String
5
3
  ROOT = "000000"
6
4
 
7
- attr_accessor :code
5
+ attr_reader :code
8
6
 
9
7
  def initialize(code)
10
8
  @code = code
9
+ super(code)
11
10
  end
12
11
 
13
12
  def value
@@ -17,10 +16,10 @@ module AreaCN
17
16
  def prefix
18
17
  return if code == ROOT
19
18
  return @prefix if @prefix
20
- code_prefix = code.sub(/0{2,4}$/, '')
21
- code_prefix << '0' if code_prefix.length.odd?
19
+ @prefix = code.sub(/0{2,4}$/, '')
20
+ @prefix << '0' if @prefix.length.odd?
22
21
 
23
- code_prefix
22
+ @prefix
24
23
  end
25
24
 
26
25
  def parent
@@ -31,10 +30,10 @@ module AreaCN
31
30
  def ancestors
32
31
  return @ancestors if @ancestors
33
32
  child = self
34
- ancestors = [self]
35
- ancestors << child while child = child.parent
33
+ @ancestors = [self]
34
+ @ancestors << child while child = child.parent
36
35
 
37
- ancestors
36
+ @ancestors
38
37
  end
39
38
 
40
39
  def ancestor?(other)
@@ -43,20 +42,7 @@ module AreaCN
43
42
  end
44
43
 
45
44
  def child?(other)
46
- other = Code.new(other) unless other.is_a?(Code)
47
- other.ancestor?(self)
48
- end
49
-
50
- def <=>(other)
51
- self.code <=> other.code
52
- end
53
-
54
- def inspect
55
- @code
56
- end
57
-
58
- def to_s
59
- @code
45
+ self.ancestors.include?(other)
60
46
  end
61
47
  end
62
48
  end
@@ -1,3 +1,3 @@
1
1
  module AreaCN
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.5"
3
3
  end
data/lib/area_cn.rb CHANGED
@@ -23,5 +23,21 @@ module AreaCN
23
23
  def match(name, area_level = nil)
24
24
  areas.match(name, area_level)
25
25
  end
26
+
27
+ def provinces
28
+ areas.provinces
29
+ end
30
+
31
+ def cities
32
+ areas.cities
33
+ end
34
+
35
+ def districts
36
+ areas.districts
37
+ end
38
+
39
+ def all
40
+ areas.all
41
+ end
26
42
  end
27
43
  end
data/spec/area_cn_spec.rb CHANGED
@@ -49,7 +49,21 @@ describe AreaCN, "中国地区数据" do
49
49
  end
50
50
 
51
51
  describe AreaCN::Code do
52
- it "code.prefix should return code's prefix" do
52
+ let(:code) { code = AreaCN::Code.new('110100') }
53
+
54
+ it "code should behave like string" do
55
+ code.should == '110100'
56
+
57
+ code.should > '110000'
58
+
59
+ "code: #{code}".should == "code: 110100"
60
+ end
61
+
62
+ it "#value should return raw code string" do
63
+ code.value.should == '110100'
64
+ end
65
+
66
+ it "#prefix should return code's prefix" do
53
67
  code = AreaCN::Code.new("110000")
54
68
  code.prefix.should == '11'
55
69
 
@@ -63,26 +77,57 @@ describe AreaCN, "中国地区数据" do
63
77
  code.prefix.should == '1101'
64
78
  end
65
79
 
66
- it "code parent" do
80
+ it "#parent should return parent code instance" do
67
81
  code = AreaCN::Code.new("110000")
82
+ code.parent.should == "000000"
68
83
  code.parent.should == AreaCN::Code.new("000000")
69
84
 
70
85
  AreaCN::Code.new("000000").parent.should == nil
71
86
  end
72
87
 
73
- it "code ancestor" do
88
+ it "#ancestors" do
89
+ code.ancestors.should include("110100")
90
+ code.ancestors.should == ['110100', '110000', '000000']
91
+ end
92
+
93
+ it "code ancestor?" do
94
+ raw_code1 = '330101'
95
+ raw_code2 = '330100'
96
+ raw_code3 = '330000'
97
+
74
98
  code1 = AreaCN::Code.new("330101")
75
99
  code2 = AreaCN::Code.new("330100")
76
100
  code3 = AreaCN::Code.new("330000")
77
101
 
78
102
  code2.ancestor?(code1).should be_true
103
+ code2.ancestor?(raw_code1).should be_true
104
+
79
105
  code3.ancestor?(code2).should be_true
106
+ code3.ancestor?(raw_code2).should be_true
107
+
80
108
  code3.ancestor?(code1).should be_true
109
+ code3.ancestor?(raw_code1).should be_true
81
110
 
82
111
  code1.child?(code2).should be_true
83
112
  code1.child?(code3).should be_true
84
113
  end
85
114
 
115
+ it "#child" do
116
+ raw_code1 = '330101'
117
+ raw_code2 = '330100'
118
+ raw_code3 = '330000'
119
+
120
+ code1 = AreaCN::Code.new("330101")
121
+ code2 = AreaCN::Code.new("330100")
122
+ code3 = AreaCN::Code.new("330000")
123
+
124
+ code1.child?(code2).should be_true
125
+ code1.child?(raw_code2).should be_true
126
+
127
+ code1.child?(code3).should be_true
128
+ code1.child?(raw_code3).should be_true
129
+ end
130
+
86
131
  it "code should can be compare" do
87
132
  AreaCN::Code.new("330101").should == AreaCN::Code.new("330101")
88
133
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: area_cn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-23 00:00:00.000000000 Z
12
+ date: 2012-10-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec