rats 0.2.3 → 0.3.1
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/LICENSE +1 -1
- data/README.rdoc +26 -1
- data/VERSION +1 -1
- data/lib/rats/base.rb +68 -6
- data/lib/rats/data/quarter.rb +33 -6
- data/rats.gemspec +4 -4
- data/spec/data/quarter_spec.rb +12 -0
- data/spec/rats_spec.rb +72 -0
- metadata +6 -4
data/LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -59,6 +59,14 @@ There can be up to a maximum of 36 Sections in a township. The number starts wi
|
|
59
59
|
North of number 6 and counts up West-to-East until the number 12. It snakes back
|
60
60
|
and forth until it finishes at number 36 in the North-East corner.
|
61
61
|
|
62
|
+
=== Half
|
63
|
+
a.k.a. Half Section
|
64
|
+
|
65
|
+
from above example: [= N or = North]
|
66
|
+
|
67
|
+
The Half Section represents a 1/2 x 1 mile area within the 1x1 mile Section.
|
68
|
+
They are identified by "N", "E", "S" and "W".
|
69
|
+
|
62
70
|
=== Quarter
|
63
71
|
a.k.a. Quarter Section
|
64
72
|
|
@@ -91,6 +99,16 @@ fields from multiple string representations of the location.
|
|
91
99
|
For example, NE 1-2-3 W4 and 40300201NE are both recognized and parsed, representing
|
92
100
|
the same location.
|
93
101
|
|
102
|
+
=== Expansion/Division
|
103
|
+
|
104
|
+
Townships, Sections and Half Sections can be divided into multiple Quarter Sections.
|
105
|
+
1 Half Section = 2 Quarter Sections
|
106
|
+
1 Section = 4 Quarter Sections
|
107
|
+
1 Township = 144 Quarter Sections
|
108
|
+
|
109
|
+
For example, the Half Section N 1-2-3 W4 has the Quarter Sections NE 1-2-3 W4 and
|
110
|
+
NW 1-2-3 W4.
|
111
|
+
|
94
112
|
=== Display
|
95
113
|
|
96
114
|
Included is string creation that can create common representations of the
|
@@ -113,6 +131,13 @@ Read the attributes
|
|
113
131
|
quarter_section.township
|
114
132
|
quarter_section.range
|
115
133
|
quarter_section.meridian
|
134
|
+
|
135
|
+
Divide into multiple Quarter Sections
|
136
|
+
|
137
|
+
half_section = Rats.new("N 1-2-3 W4")
|
138
|
+
half_section.is_divisible?
|
139
|
+
quarter_sections = half_section.divide
|
140
|
+
# quarter_sections == [Rats.new("NE 1-2-3 W4"), Rats.new("NW 1-2-3 W4")]
|
116
141
|
|
117
142
|
= Information
|
118
143
|
|
@@ -143,7 +168,7 @@ cases this assumption breaks down.
|
|
143
168
|
== Environment
|
144
169
|
|
145
170
|
This gem was created using:
|
146
|
-
- ruby 1.9.1-p378, 1.9.2-
|
171
|
+
- ruby 1.9.1-p378, 1.9.2-p0
|
147
172
|
- rspec 1.3.0
|
148
173
|
- rake 0.8.7
|
149
174
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.1
|
data/lib/rats/base.rb
CHANGED
@@ -70,7 +70,11 @@ module Rats
|
|
70
70
|
if self.meridian && self.range && self.township
|
71
71
|
if self.section
|
72
72
|
if self.quarter
|
73
|
-
|
73
|
+
if Rats::Quarter.half?(self.quarter)
|
74
|
+
:half
|
75
|
+
else
|
76
|
+
:quarter
|
77
|
+
end
|
74
78
|
else
|
75
79
|
:section
|
76
80
|
end
|
@@ -143,7 +147,62 @@ module Rats
|
|
143
147
|
def to_a
|
144
148
|
[self.quarter, self.section, self.township, self.range, self.meridian].compact
|
145
149
|
end
|
146
|
-
|
150
|
+
|
151
|
+
# can this location be broken down into quarter sections?
|
152
|
+
#
|
153
|
+
def is_divisible?
|
154
|
+
[:half, :section, :township].include?(self.scope)
|
155
|
+
end
|
156
|
+
|
157
|
+
# returns individual quarter sections for a :half_section, :section or :township
|
158
|
+
#
|
159
|
+
def divide
|
160
|
+
return unless self.is_divisible?
|
161
|
+
case self.scope
|
162
|
+
when :half
|
163
|
+
self.divide_half
|
164
|
+
when :section
|
165
|
+
self.divide_section
|
166
|
+
when :township
|
167
|
+
self.divide_township
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def divide_half
|
172
|
+
quarters = []
|
173
|
+
case self.quarter.to_s.downcase
|
174
|
+
when 'n'
|
175
|
+
quarters << Rats.new(self.meridian, self.range, self.township, self.section, 'NE')
|
176
|
+
quarters << Rats.new(self.meridian, self.range, self.township, self.section, 'NW')
|
177
|
+
when 's'
|
178
|
+
quarters << Rats.new(self.meridian, self.range, self.township, self.section, 'SE')
|
179
|
+
quarters << Rats.new(self.meridian, self.range, self.township, self.section, 'SW')
|
180
|
+
when 'e'
|
181
|
+
quarters << Rats.new(self.meridian, self.range, self.township, self.section, 'NE')
|
182
|
+
quarters << Rats.new(self.meridian, self.range, self.township, self.section, 'SE')
|
183
|
+
when 'w'
|
184
|
+
quarters << Rats.new(self.meridian, self.range, self.township, self.section, 'NW')
|
185
|
+
quarters << Rats.new(self.meridian, self.range, self.township, self.section, 'SW')
|
186
|
+
end
|
187
|
+
quarters
|
188
|
+
end
|
189
|
+
|
190
|
+
def divide_section(section=nil)
|
191
|
+
quarters = []
|
192
|
+
['NE', 'NW', 'SE', 'SW'].each do |quarter|
|
193
|
+
quarters << Rats.new(self.meridian, self.range, self.township, section || self.section, quarter)
|
194
|
+
end
|
195
|
+
quarters
|
196
|
+
end
|
197
|
+
|
198
|
+
def divide_township
|
199
|
+
quarters = []
|
200
|
+
(1..36).each do |section|
|
201
|
+
quarters += divide_section(section)
|
202
|
+
end
|
203
|
+
quarters
|
204
|
+
end
|
205
|
+
|
147
206
|
private
|
148
207
|
|
149
208
|
def parse_string(location)
|
@@ -162,8 +221,11 @@ module Rats
|
|
162
221
|
end
|
163
222
|
|
164
223
|
def parse_description(description)
|
165
|
-
|
166
|
-
|
224
|
+
# just skip the case of only a meridian ie: 'W4'
|
225
|
+
unless description.to_s.match(/^w\d{1,3}$/i)
|
226
|
+
quarter = description.to_s.scan(/^north|^south|^east|^west|^ne|^nw|^se|^sw|^n|^e|^s|^w/i)
|
227
|
+
self.quarter = Rats::Quarter.transform(quarter[0]) if quarter && quarter.size > 0
|
228
|
+
end
|
167
229
|
|
168
230
|
numbers = description.to_s.scan(/\d{1,3}/)
|
169
231
|
if numbers
|
@@ -176,14 +238,14 @@ module Rats
|
|
176
238
|
end
|
177
239
|
|
178
240
|
def parse_parcel_id(parcel_id)
|
179
|
-
result = parcel_id.to_s.scan(/^(\d{1})(\d{2})(\d{3})(\d{2})(\D{2})?/)
|
241
|
+
result = parcel_id.to_s.scan(/^(\d{1})(\d{2})(\d{3})(\d{2})(\D{1,2})?/)
|
180
242
|
return unless result && result.size > 0
|
181
243
|
numbers = result.pop.compact
|
182
244
|
self.meridian = numbers.shift.to_i if numbers.size > 0
|
183
245
|
self.range = numbers.shift.to_i if numbers.size > 0
|
184
246
|
self.township = numbers.shift.to_i if numbers.size > 0
|
185
247
|
self.section = numbers.shift.to_i if numbers.size > 0
|
186
|
-
self.quarter = numbers.shift.to_s if numbers.size > 0
|
248
|
+
self.quarter = numbers.shift.to_s.strip if numbers.size > 0
|
187
249
|
true
|
188
250
|
end
|
189
251
|
|
data/lib/rats/data/quarter.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Rats
|
2
2
|
class Quarter < Data
|
3
3
|
|
4
|
-
VALID_QUARTERS = [:ne, :nw, :se, :sw]
|
4
|
+
VALID_QUARTERS = [:ne, :nw, :se, :sw, :n, :e, :s, :w]
|
5
5
|
|
6
6
|
def self.padding_width; 2; end
|
7
7
|
def self.padding_value; " "; end
|
@@ -12,21 +12,48 @@ module Rats
|
|
12
12
|
|
13
13
|
def fullname
|
14
14
|
return "" unless self.value
|
15
|
-
template = "the %s
|
15
|
+
template = "the %s %s"
|
16
16
|
case self.value.to_s.downcase.to_sym
|
17
17
|
when :ne
|
18
|
-
sprintf(template, 'Northeast')
|
18
|
+
sprintf(template, 'Northeast', 'Quarter')
|
19
19
|
when :se
|
20
|
-
sprintf(template, 'Southeast')
|
20
|
+
sprintf(template, 'Southeast', 'Quarter')
|
21
21
|
when :nw
|
22
|
-
sprintf(template, 'Northwest')
|
22
|
+
sprintf(template, 'Northwest', 'Quarter')
|
23
23
|
when :sw
|
24
|
-
sprintf(template, 'Southwest')
|
24
|
+
sprintf(template, 'Southwest', 'Quarter')
|
25
|
+
when :n
|
26
|
+
sprintf(template, 'North', 'Half')
|
27
|
+
when :e
|
28
|
+
sprintf(template, 'East', 'Half')
|
29
|
+
when :s
|
30
|
+
sprintf(template, 'South', 'Half')
|
31
|
+
when :w
|
32
|
+
sprintf(template, 'West', 'Half')
|
25
33
|
else
|
26
34
|
''
|
27
35
|
end
|
28
36
|
end
|
29
37
|
|
38
|
+
def self.half?(value)
|
39
|
+
%w(north n south s east e west w).include?(value.to_s.downcase)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.transform(value)
|
43
|
+
v = value.to_s.upcase.strip
|
44
|
+
case v
|
45
|
+
when 'NORTH'
|
46
|
+
v = 'N'
|
47
|
+
when 'SOUTH'
|
48
|
+
v = 'S'
|
49
|
+
when 'EAST'
|
50
|
+
v = 'E'
|
51
|
+
when 'WEST'
|
52
|
+
v = 'W'
|
53
|
+
end
|
54
|
+
v
|
55
|
+
end
|
56
|
+
|
30
57
|
private
|
31
58
|
|
32
59
|
def validate!
|
data/rats.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rats}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Mark G"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-09-10}
|
13
13
|
s.description = %q{A ruby class to help with using the Alberta Township System}
|
14
14
|
s.email = %q{rats@attackcorp.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -47,7 +47,7 @@ Gem::Specification.new do |s|
|
|
47
47
|
s.homepage = %q{http://github.com/attack/rats}
|
48
48
|
s.rdoc_options = ["--charset=UTF-8"]
|
49
49
|
s.require_paths = ["lib"]
|
50
|
-
s.rubygems_version = %q{1.3.
|
50
|
+
s.rubygems_version = %q{1.3.7}
|
51
51
|
s.summary = %q{A ruby class to help with using the Alberta Township System}
|
52
52
|
s.test_files = [
|
53
53
|
"spec/data/data_spec.rb",
|
@@ -64,7 +64,7 @@ Gem::Specification.new do |s|
|
|
64
64
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
65
65
|
s.specification_version = 3
|
66
66
|
|
67
|
-
if Gem::Version.new(Gem::
|
67
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
68
68
|
else
|
69
69
|
end
|
70
70
|
else
|
data/spec/data/quarter_spec.rb
CHANGED
@@ -12,6 +12,18 @@ describe Rats::Quarter do
|
|
12
12
|
data.fullname.should == "the Northeast Quarter"
|
13
13
|
end
|
14
14
|
|
15
|
+
it "detects half" do
|
16
|
+
Rats::Quarter.half?('NE').should be_false
|
17
|
+
Rats::Quarter.half?('N').should be_true
|
18
|
+
Rats::Quarter.half?('North').should be_true
|
19
|
+
end
|
20
|
+
|
21
|
+
it "transform input" do
|
22
|
+
Rats::Quarter.transform('ne').should == 'NE'
|
23
|
+
Rats::Quarter.transform('north').should == 'N'
|
24
|
+
Rats::Quarter.transform('n').should == 'N'
|
25
|
+
end
|
26
|
+
|
15
27
|
describe "boundaries" do
|
16
28
|
|
17
29
|
it "knows valid data" do
|
data/spec/rats_spec.rb
CHANGED
@@ -96,6 +96,26 @@ describe "Rats" do
|
|
96
96
|
land.scope.should == :quarter
|
97
97
|
end
|
98
98
|
|
99
|
+
it "understands N 1-2-3 W4" do
|
100
|
+
land = Rats.new("N 1-2-3 W4")
|
101
|
+
land.quarter.should == "N"
|
102
|
+
land.section.should == 1
|
103
|
+
land.township.should == 2
|
104
|
+
land.range.should == 3
|
105
|
+
land.meridian.should == 4
|
106
|
+
land.scope.should == :half
|
107
|
+
end
|
108
|
+
|
109
|
+
it "understands North 1-2-3 W4" do
|
110
|
+
land = Rats.new("North 1-2-3 W4")
|
111
|
+
land.quarter.should == "N"
|
112
|
+
land.section.should == 1
|
113
|
+
land.township.should == 2
|
114
|
+
land.range.should == 3
|
115
|
+
land.meridian.should == 4
|
116
|
+
land.scope.should == :half
|
117
|
+
end
|
118
|
+
|
99
119
|
it "understands 40300201NE" do
|
100
120
|
land = Rats.new("40300201NE")
|
101
121
|
land.quarter.should == "NE"
|
@@ -329,6 +349,11 @@ describe "Rats" do
|
|
329
349
|
land.location(:long).should == "the Northeast Quarter of Section 1, Township 2, Range 3, West of the Fourth Meridian"
|
330
350
|
end
|
331
351
|
|
352
|
+
it "returns the long version with Half" do
|
353
|
+
land = Rats.new("N 1-2-3 W4")
|
354
|
+
land.location(:long).should == "the North Half of Section 1, Township 2, Range 3, West of the Fourth Meridian"
|
355
|
+
end
|
356
|
+
|
332
357
|
it "returns the long version with Section" do
|
333
358
|
land = Rats.new("1-2-3 W4")
|
334
359
|
#puts land.inspect
|
@@ -352,6 +377,16 @@ describe "Rats" do
|
|
352
377
|
land.scope.should == :quarter
|
353
378
|
end
|
354
379
|
|
380
|
+
it "knows half" do
|
381
|
+
land = Rats.new("E 1-2-3 W4")
|
382
|
+
land.scope.should == :half
|
383
|
+
end
|
384
|
+
|
385
|
+
it "knows half" do
|
386
|
+
land = Rats.new("East 1-2-3 W4")
|
387
|
+
land.scope.should == :half
|
388
|
+
end
|
389
|
+
|
355
390
|
it "knows section" do
|
356
391
|
land = Rats.new("1-2-3 W4")
|
357
392
|
land.scope.should == :section
|
@@ -398,6 +433,43 @@ describe "Rats" do
|
|
398
433
|
land = Rats.new("1-2-3 W4")
|
399
434
|
land.to_a.should == [1, 2, 3, 4]
|
400
435
|
end
|
436
|
+
|
437
|
+
describe "expansion" do
|
438
|
+
|
439
|
+
it "is divisible" do
|
440
|
+
Rats.new("N 1-2-3 W4").is_divisible?.should be_true
|
441
|
+
Rats.new("1-2-3 W4").is_divisible?.should be_true
|
442
|
+
Rats.new("2-3 W4").is_divisible?.should be_true
|
443
|
+
end
|
444
|
+
|
445
|
+
it "is not divisible" do
|
446
|
+
Rats.new("NE 1-2-3 W4").is_divisible?.should be_false
|
447
|
+
Rats.new("3 W4").is_divisible?.should be_false
|
448
|
+
Rats.new("W4").is_divisible?.should be_false
|
449
|
+
end
|
450
|
+
|
451
|
+
describe "half -> 2 quarters" do
|
452
|
+
quarters = Rats.new("N 1-2-3 W4").divide
|
453
|
+
quarters.size.should == 2
|
454
|
+
quarters.first.quarter.should == 'NE'
|
455
|
+
quarters.last.quarter.should == 'NW'
|
456
|
+
end
|
457
|
+
|
458
|
+
describe "section -> 4 quarters" do
|
459
|
+
quarters = Rats.new("1-2-3 W4").divide
|
460
|
+
quarters.size.should == 4
|
461
|
+
quarters[0].quarter.should == 'NE'
|
462
|
+
quarters[1].quarter.should == 'NW'
|
463
|
+
quarters[2].quarter.should == 'SE'
|
464
|
+
quarters[3].quarter.should == 'SW'
|
465
|
+
end
|
466
|
+
|
467
|
+
describe "township -> 144 quarters" do
|
468
|
+
quarters = Rats.new("2-3 W4").divide
|
469
|
+
quarters.size.should == 144
|
470
|
+
end
|
471
|
+
|
472
|
+
end
|
401
473
|
|
402
474
|
end
|
403
475
|
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
- 2
|
8
7
|
- 3
|
9
|
-
|
8
|
+
- 1
|
9
|
+
version: 0.3.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Mark G
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-09-10 00:00:00 -06:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
@@ -64,6 +64,7 @@ rdoc_options:
|
|
64
64
|
require_paths:
|
65
65
|
- lib
|
66
66
|
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
67
68
|
requirements:
|
68
69
|
- - ">="
|
69
70
|
- !ruby/object:Gem::Version
|
@@ -71,6 +72,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
71
72
|
- 0
|
72
73
|
version: "0"
|
73
74
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
74
76
|
requirements:
|
75
77
|
- - ">="
|
76
78
|
- !ruby/object:Gem::Version
|
@@ -80,7 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
82
|
requirements: []
|
81
83
|
|
82
84
|
rubyforge_project:
|
83
|
-
rubygems_version: 1.3.
|
85
|
+
rubygems_version: 1.3.7
|
84
86
|
signing_key:
|
85
87
|
specification_version: 3
|
86
88
|
summary: A ruby class to help with using the Alberta Township System
|