area_cn 0.0.3 → 0.0.5

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/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