rats 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -5,7 +5,7 @@ a.k.a. Ruby Alberta Township System
5
5
  A ruby class to help with using the Alberta Township System. This class will allow
6
6
  you to create and represent townships, sections and quarter sections.
7
7
 
8
- You may find it amusing that Alberta was Rat-free ... until now.
8
+ You may find it amusing that Alberta is Rat-free ... until now.
9
9
 
10
10
  == ATS
11
11
 
@@ -18,7 +18,7 @@ Which can be broken down as follows ...
18
18
 
19
19
  === Meridian
20
20
 
21
- from above example: [W4] West of the 4th Meridian
21
+ from above example: [= W4] or West of the 4th Meridian
22
22
 
23
23
  The Meridian is a constant line running perpendicular to the line of longitude,
24
24
  and increments approx. every 4th line of longitude, from East to West.
@@ -28,7 +28,7 @@ Alberta contains 3 of these Meridians, W4 through W6.
28
28
  === Range
29
29
  a.k.a Range Lines
30
30
 
31
- from above example: [3]
31
+ from above example: [= 3]
32
32
 
33
33
  The Range is the x-axis within the given Meridian. It increases East to West and
34
34
  resets at the next Meridian. Each increase is approx. every 6 miles.
@@ -39,9 +39,9 @@ you go North, there is less Ranges from East to West.
39
39
  === Township
40
40
  a.k.a. Township Lines
41
41
 
42
- from above example: [2]
42
+ from above example: [= 2]
43
43
 
44
- The Township is the y-axis with the Meridian. It increases South to North and
44
+ The Township is the y-axis within the Meridian. It increases South to North and
45
45
  never resets, running from the Alberta-US border to the Northern border of Alberta.
46
46
  Each increase is approx. every 6 miles.
47
47
 
@@ -49,16 +49,11 @@ NOTE: The 6x6 mile "square" indicated by the Township (line) + Range (line) +
49
49
  Meridian is confusingly called a Township. So you have the Township line and
50
50
  the 6x6 mile Township "square".
51
51
 
52
- NOTE: Due to the longitude lines getting closer as you go North, there are small
53
- correction made South to North which results in a non-uniform stacking of Townships.
54
- Therefore you can not assume that going straight North from one Township to another
55
- will result in a Township with the same Township-line number.
56
-
57
52
  === Section
58
53
 
59
- from above example: [1]
54
+ from above example: [= 1]
60
55
 
61
- The Section represents a number 1x1 miles "square" within the 6x6 mile Township.
56
+ The Section represents a 1x1 mile "square" within the 6x6 mile Township.
62
57
  There can be up to a maximum of 36 Sections in a township. The number starts with
63
58
  1 in the South-East corner and travels West to number 6. It then increases to 7
64
59
  North of number 6 and counts up West-to-East until the number 12. It snakes back
@@ -67,7 +62,7 @@ and forth until it finishes at number 36 in the North-East corner.
67
62
  === Quarter
68
63
  a.k.a. Quarter Section
69
64
 
70
- from above example: [NE]
65
+ from above example: [= NE]
71
66
 
72
67
  The Quarter represents a 1/2 x 1/2 mile square within the 1x1 mile Section.
73
68
  There can be 4 Quarters in a Section. They are identified by "NE", "NW", "SE"
@@ -81,16 +76,20 @@ the Alberta Township System, at the Quarter, Section or Township level.
81
76
  === Validation
82
77
 
83
78
  Included is validations, only allowing you to describe locations that actually
84
- exist.
79
+ exist.
85
80
 
86
81
  For example, Range-line 30 is valid for Township-lines 1-18, but not 18-126.
87
82
 
83
+ NOTE: At the moment, invalid quarters within valid sections are not currently
84
+ identified.
85
+
88
86
  === Parsing
89
87
 
90
88
  Included is string parsing, allowing you to extract and separate the different
91
89
  fields from multiple string representations of the location.
92
90
 
93
- For example, NE 1-2-3 W4 and 40300201NE are both recognized and parsed.
91
+ For example, NE 1-2-3 W4 and 40300201NE are both recognized and parsed, representing
92
+ the same location.
94
93
 
95
94
  === Display
96
95
 
@@ -99,18 +98,21 @@ location.
99
98
 
100
99
  = Usage
101
100
 
102
- # parse a location
103
- quarter_section = Rats.new("NE 1-2-3 W4")
101
+ Parse a location
102
+
103
+ quarter_section = Rats.new("NE 1-2-3 W4")
104
+
105
+ Print the location
106
+
107
+ quarter_section.location
104
108
 
105
- # print the location
106
- quarter_section.location
109
+ Read the attributes
107
110
 
108
- # read the attributes
109
- quarter_section.quarter
110
- quarter_section.section
111
- quarter_section.township
112
- quarter_section.range
113
- quarter_section.meridian
111
+ quarter_section.quarter
112
+ quarter_section.section
113
+ quarter_section.township
114
+ quarter_section.range
115
+ quarter_section.meridian
114
116
 
115
117
  = Information
116
118
 
@@ -135,7 +137,8 @@ Currently this point has not been reached and this gem is still in development.
135
137
  == Assumptions
136
138
 
137
139
  As currently written, I assume that within every valid section, all four quarters
138
- are valid. I know this to be incorrect.
140
+ are valid. I know this to be incorrect, but I can not correct this until I know which
141
+ cases this assumption breaks down.
139
142
 
140
143
  == Environment
141
144
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.1
data/lib/rats/base.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  module Rats
2
2
  class Base
3
3
 
4
+ attr_accessor :errors
5
+
4
6
  def initialize(*args)
5
7
  return unless args.flatten!
6
8
  @quarter = Rats::Quarter.new
@@ -8,6 +10,7 @@ module Rats
8
10
  @township = Rats::Township.new
9
11
  @range = Rats::Range.new
10
12
  @meridian = Rats::Meridian.new
13
+ @errors = {}
11
14
  if args.size == 1
12
15
  parse_string(args.pop)
13
16
  else
@@ -39,14 +42,14 @@ module Rats
39
42
  def range=(v); @range.v = v; end
40
43
  def meridian=(v); @meridian.v = v; end
41
44
 
42
- def location(format = :long)
45
+ def location(format = :default)
43
46
  case format
44
47
  when :short
45
48
  short_location
46
49
  when :long
47
50
  long_location
48
51
  else
49
- long_location
52
+ default_location
50
53
  end
51
54
  end
52
55
 
@@ -60,7 +63,7 @@ module Rats
60
63
  end
61
64
 
62
65
  def to_s
63
- long_location
66
+ default_location
64
67
  end
65
68
 
66
69
  def scope
@@ -79,21 +82,40 @@ module Rats
79
82
  end
80
83
  end
81
84
 
82
- def valid?
83
- self.meridian && self.range && self.township && self.exists?
85
+ def valid?
86
+ # check each data field individually
87
+ [:meridian, :range, :township, :section, :quarter].each do |data|
88
+ valid = self.send(data.to_s.slice(0)).valid?
89
+ add_error(data, self.send(data.to_s.slice(0)).error) unless valid
90
+ end
91
+
92
+ # check each field as it relates to others
93
+ self.exists? unless self.errors.size > 0
94
+
95
+ # are we valid?
96
+ self.errors.size == 0
84
97
  end
85
98
 
86
99
  # test that a location actually exists
87
100
  #
88
101
  def exists?
89
102
  # make sure meridian exists
90
- return false unless TOWNSHIPS_BY_RANGE_AND_MERIDIAN[self.meridian]
103
+ unless TOWNSHIPS_BY_RANGE_AND_MERIDIAN[self.meridian]
104
+ add_error(:land, 'does not exist')
105
+ return false
106
+ end
91
107
 
92
108
  # make sure range exists
93
- return false unless TOWNSHIPS_BY_RANGE_AND_MERIDIAN[self.meridian][self.range]
109
+ unless TOWNSHIPS_BY_RANGE_AND_MERIDIAN[self.meridian][self.range]
110
+ add_error(:land, 'does not exist')
111
+ return false
112
+ end
94
113
 
95
114
  # make sure township exists
96
- return false unless TOWNSHIPS_BY_RANGE_AND_MERIDIAN[self.meridian][self.range][:townships].include?(self.township)
115
+ unless TOWNSHIPS_BY_RANGE_AND_MERIDIAN[self.meridian][self.range][:townships].include?(self.township)
116
+ add_error(:land, 'does not exist')
117
+ return false
118
+ end
97
119
 
98
120
  # make sure section exists
99
121
 
@@ -102,7 +124,12 @@ module Rats
102
124
  # NO, now see if this township has valid sections
103
125
  if TOWNSHIPS_BY_RANGE_AND_MERIDIAN[self.meridian][self.range][:sections].has_key?(self.township)
104
126
  # YES, check further to see that this section is listed
105
- return TOWNSHIPS_BY_RANGE_AND_MERIDIAN[self.meridian][self.range][:sections][self.township].include?(self.section)
127
+ unless TOWNSHIPS_BY_RANGE_AND_MERIDIAN[self.meridian][self.range][:sections][self.township].include?(self.section)
128
+ add_error(:land, 'does not exist')
129
+ return false
130
+ else
131
+ return true
132
+ end
106
133
  else
107
134
  # the township isn't listed, therefore it has all sections
108
135
  return true
@@ -169,7 +196,7 @@ module Rats
169
196
  end
170
197
 
171
198
 
172
- def long_location
199
+ def default_location
173
200
  if self.quarter
174
201
  "#{@quarter.to_s} #{[@section.to_s,@township.to_s,@range.to_s].compact.join('-')} #{@meridian.to_s}".strip
175
202
  else
@@ -181,5 +208,22 @@ module Rats
181
208
  [@quarter.to_p,@section.to_p,@township.to_p,@range.to_p,@meridian.to_p].compact.join('').strip
182
209
  end
183
210
 
211
+ def long_location
212
+ quarter_section = []
213
+ quarter_section << self.q.fullname if self.q && self.q.fullname.size > 0
214
+ quarter_section << self.s.fullname if self.s && self.s.fullname.size > 0
215
+ parts = []
216
+ parts << quarter_section.compact.join(' of ') if quarter_section && quarter_section.size > 0
217
+ parts << self.t.fullname
218
+ parts << self.r.fullname
219
+ parts << self.m.fullname
220
+ parts.compact.join(', ')
221
+ end
222
+
223
+ def add_error(index, the_error)
224
+ @errors[index] = [] unless @errors.has_key?(index)
225
+ @errors[index] << the_error
226
+ end
227
+
184
228
  end
185
229
  end
@@ -1,13 +1,17 @@
1
1
  module Rats
2
2
  class Data
3
3
 
4
- attr_accessor :value
4
+ ERROR = "not allowed"
5
+ attr_accessor :value, :raise_errors, :error
5
6
 
6
- def initialize(value=nil)
7
+ def initialize(value=nil, raise_errors=false)
7
8
  self.value = value
9
+ self.raise_errors = raise_errors
8
10
  end
9
11
 
10
12
  def nil!; @value = nil; end
13
+ def raise_errors!; @raise_errors = true; end
14
+ def raise_errors?; @raise_errors == true; end
11
15
 
12
16
  #
13
17
  # READ & WRITE
@@ -16,7 +20,7 @@ module Rats
16
20
  def value=(value)
17
21
  return unless value
18
22
  @value = self.class.transform(value)
19
- raise ArgumentError unless self.valid?
23
+ raise ArgumentError if self.raise_errors? && !self.valid?
20
24
  end
21
25
  alias v= value=
22
26
  alias v value
@@ -51,6 +55,18 @@ module Rats
51
55
  #
52
56
 
53
57
  def valid?
58
+ set_error! unless valid = validate!
59
+ valid
60
+ end
61
+
62
+
63
+ private
64
+
65
+ def set_error!
66
+ self.error = ERROR
67
+ end
68
+
69
+ def validate!
54
70
  true
55
71
  end
56
72
 
@@ -12,11 +12,27 @@ module Rats
12
12
  value.to_i > 0 ? value.to_i : nil
13
13
  end
14
14
 
15
- def valid?
16
- VALID_MERIDIANS.include?(self.value.to_i)
15
+ def to_s; "W" + self.value.to_s; end
16
+
17
+ def fullname
18
+ template = "West of the %s Meridian"
19
+ case @value.to_i
20
+ when 4
21
+ sprintf(template, 'Fourth')
22
+ when 5
23
+ sprintf(template, 'Fifth')
24
+ when 6
25
+ sprintf(template, 'Sixth')
26
+ else
27
+ ''
28
+ end
17
29
  end
18
30
 
19
- def to_s; "W" + self.value.to_s; end
31
+ private
32
+
33
+ def validate!
34
+ VALID_MERIDIANS.include?(self.value.to_i)
35
+ end
20
36
 
21
37
  end
22
38
  end
@@ -10,7 +10,25 @@ module Rats
10
10
  value.to_s.upcase if value
11
11
  end
12
12
 
13
- def valid?
13
+ def fullname
14
+ template = "the %s Quarter"
15
+ case self.value.to_s.downcase.to_sym
16
+ when :ne
17
+ sprintf(template, 'Northeast')
18
+ when :se
19
+ sprintf(template, 'Southeast')
20
+ when :nw
21
+ sprintf(template, 'Northwest')
22
+ when :sw
23
+ sprintf(template, 'Southwest')
24
+ else
25
+ ''
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def validate!
14
32
  VALID_QUARTERS.include?(self.value.to_s.downcase.to_sym)
15
33
  end
16
34
 
@@ -11,12 +11,18 @@ module Rats
11
11
  value.to_i > 0 ? value.to_i : nil
12
12
  end
13
13
 
14
+ def fullname
15
+ "Range #{@value}"
16
+ end
17
+
18
+ private
19
+
14
20
  # NOTE: this does not take into consideration that some ranges do not
15
21
  # exist for some meridians and township (y-axis) values ... but we
16
22
  # would need to know those values, and that is outside the scope
17
23
  # of the Range class.
18
24
  #
19
- def valid?
25
+ def validate!
20
26
  VALID_RANGES.include?(self.value.to_i)
21
27
  end
22
28
 
@@ -11,7 +11,13 @@ module Rats
11
11
  value.to_i > 0 ? value.to_i : nil
12
12
  end
13
13
 
14
- def valid?
14
+ def fullname
15
+ @value && @value.to_i > 0 ? "Section #{@value}" : ''
16
+ end
17
+
18
+ private
19
+
20
+ def validate!
15
21
  VALID_SECTIONS.include?(self.value.to_i)
16
22
  end
17
23
 
@@ -11,12 +11,18 @@ module Rats
11
11
  value.to_i > 0 ? value.to_i : nil
12
12
  end
13
13
 
14
+ def fullname
15
+ "Township #{@value}"
16
+ end
17
+
18
+ private
19
+
14
20
  # NOTE: this does not take into consideration that some townships do not
15
21
  # exist for some meridians and ranges (x-axis) values ... but we
16
22
  # would need to know those values, and that is outside the scope
17
23
  # of the Township class.
18
24
  #
19
- def valid?
25
+ def validate!
20
26
  VALID_TOWNSHIPS.include?(self.value.to_i)
21
27
  end
22
28
 
data/rats.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rats}
8
- s.version = "0.2.0"
8
+ s.version = "0.2.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"]
@@ -36,7 +36,6 @@ describe Rats::Data do
36
36
  @data.v.should == 1
37
37
  @data.value.should == 1
38
38
  end
39
-
40
39
  end
41
40
 
42
41
  end
@@ -48,6 +47,11 @@ describe Rats::Data do
48
47
  data.valid?.should be_true
49
48
  end
50
49
 
50
+ it "responds to error" do
51
+ data = Rats::Data.new
52
+ data.respond_to?('error').should be_true
53
+ end
54
+
51
55
  end
52
56
 
53
57
  describe "methods" do
@@ -79,4 +83,28 @@ describe Rats::Data do
79
83
 
80
84
  end
81
85
 
86
+ describe "errors" do
87
+
88
+ it "responds to raise_errors!" do
89
+ data = Rats::Data.new
90
+ data.respond_to?('raise_errors!').should be_true
91
+ end
92
+
93
+ it "responds to raise_errors?" do
94
+ data = Rats::Data.new
95
+ data.respond_to?('raise_errors?').should be_true
96
+ end
97
+
98
+ it "doesn't initially raise errors" do
99
+ data = Rats::Data.new
100
+ data.raise_errors?.should be_false
101
+ end
102
+
103
+ it "will raise errors if set" do
104
+ data = Rats::Data.new(nil, true)
105
+ data.raise_errors?.should be_true
106
+ end
107
+
108
+ end
109
+
82
110
  end
@@ -9,13 +9,20 @@ describe Rats::Meridian do
9
9
 
10
10
  describe "boundaries" do
11
11
 
12
- it "allows valid data" do
12
+ it "knows valid data" do
13
13
  data = Rats::Meridian.new(6)
14
14
  data.valid?.should be_true
15
15
  end
16
16
 
17
- it "doesn't allow bad data" do
17
+ it "knows invalid data" do
18
+ data = Rats::Meridian.new(3)
19
+ data.valid?.should be_false
20
+ data.error.should == "not allowed"
21
+ end
22
+
23
+ it "raises error with invalid data" do
18
24
  data = Rats::Meridian.new
25
+ data.raise_errors!
19
26
  lambda { data.value = 3 }.should raise_error(ArgumentError)
20
27
  end
21
28
 
@@ -43,6 +50,11 @@ describe Rats::Meridian do
43
50
  data.v.should == 4
44
51
  end
45
52
 
53
+ it "writes the fullname" do
54
+ data = Rats::Meridian.new('W4')
55
+ data.fullname.should == 'West of the Fourth Meridian'
56
+ end
57
+
46
58
  describe "transforming" do
47
59
 
48
60
  it "accepts integers" do
@@ -7,16 +7,23 @@ describe Rats::Quarter do
7
7
  data.is_a?(Rats::Quarter).should be_true
8
8
  end
9
9
 
10
+ it "returns the full_name" do
11
+ data = Rats::Quarter.new('NE')
12
+ data.fullname.should == "the Northeast Quarter"
13
+ end
14
+
10
15
  describe "boundaries" do
11
16
 
12
- it "allows valid data" do
13
- data = Rats::Quarter.new("NE")
17
+ it "knows valid data" do
18
+ data = Rats::Quarter.new('NE')
14
19
  data.valid?.should be_true
20
+ data.error.should be_nil
15
21
  end
16
22
 
17
- it "doesn't allow bad data" do
18
- data = Rats::Quarter.new
19
- lambda { data.value = "bad" }.should raise_error(ArgumentError)
23
+ it "knows invalid data" do
24
+ data = Rats::Quarter.new('bad')
25
+ data.valid?.should be_false
26
+ data.error.should == "not allowed"
20
27
  end
21
28
 
22
29
  end
@@ -9,14 +9,16 @@ describe Rats::Range do
9
9
 
10
10
  describe "boundaries" do
11
11
 
12
- it "allows valid data" do
12
+ it "knows valid data" do
13
13
  data = Rats::Range.new(6)
14
14
  data.valid?.should be_true
15
+ data.error.should be_nil
15
16
  end
16
17
 
17
- it "doesn't allow bad data" do
18
- data = Rats::Range.new
19
- lambda { data.value = 31 }.should raise_error(ArgumentError)
18
+ it "knows invalid data" do
19
+ data = Rats::Range.new(31)
20
+ data.valid?.should be_false
21
+ data.error.should == "not allowed"
20
22
  end
21
23
 
22
24
  end
@@ -38,6 +40,11 @@ describe Rats::Range do
38
40
  data.to_s.should == '4'
39
41
  end
40
42
 
43
+ it "writes the fullname" do
44
+ data = Rats::Range.new('4')
45
+ data.fullname.should == 'Range 4'
46
+ end
47
+
41
48
  describe "transforming" do
42
49
 
43
50
  it "accepts integers" do
@@ -9,14 +9,16 @@ describe Rats::Section do
9
9
 
10
10
  describe "boundaries" do
11
11
 
12
- it "allows valid data" do
12
+ it "knows valid data" do
13
13
  data = Rats::Section.new(6)
14
14
  data.valid?.should be_true
15
+ data.error.should be_nil
15
16
  end
16
17
 
17
- it "doesn't allow bad data" do
18
- data = Rats::Section.new
19
- lambda { data.value = 37 }.should raise_error(ArgumentError)
18
+ it "knows invalid data" do
19
+ data = Rats::Section.new(37)
20
+ data.valid?.should be_false
21
+ data.error.should == "not allowed"
20
22
  end
21
23
 
22
24
  end
@@ -38,6 +40,11 @@ describe Rats::Section do
38
40
  data.to_s.should == '4'
39
41
  end
40
42
 
43
+ it "writes the fullname" do
44
+ data = Rats::Section.new('4')
45
+ data.fullname.should == 'Section 4'
46
+ end
47
+
41
48
  describe "transforming" do
42
49
 
43
50
  it "accepts integers" do
@@ -9,14 +9,16 @@ describe Rats::Township do
9
9
 
10
10
  describe "boundaries" do
11
11
 
12
- it "allows valid data" do
12
+ it "knows valid data" do
13
13
  data = Rats::Township.new(6)
14
14
  data.valid?.should be_true
15
+ data.error.should be_nil
15
16
  end
16
17
 
17
- it "doesn't allow bad data" do
18
- data = Rats::Township.new
19
- lambda { data.value = 130 }.should raise_error(ArgumentError)
18
+ it "knows invalid data" do
19
+ data = Rats::Township.new(130)
20
+ data.valid?.should be_false
21
+ data.error.should == "not allowed"
20
22
  end
21
23
 
22
24
  end
@@ -38,6 +40,11 @@ describe Rats::Township do
38
40
  data.to_s.should == '4'
39
41
  end
40
42
 
43
+ it "writes the fullname" do
44
+ data = Rats::Township.new('4')
45
+ data.fullname.should == 'Township 4'
46
+ end
47
+
41
48
  describe "transforming" do
42
49
 
43
50
  it "accepts integers" do
data/spec/rats_spec.rb CHANGED
@@ -37,7 +37,6 @@ describe "Rats" do
37
37
 
38
38
  it "writes meridian" do
39
39
  @land.meridian = 4
40
- #@land.meridian.should == "W4"
41
40
  @land.meridian.should == 4
42
41
  end
43
42
 
@@ -53,7 +52,6 @@ describe "Rats" do
53
52
  land.section.should == 1
54
53
  land.township.should == 2
55
54
  land.range.should == 3
56
- #land.meridian.should == "W4"
57
55
  land.meridian.should == 4
58
56
  end
59
57
 
@@ -63,7 +61,6 @@ describe "Rats" do
63
61
  land.section.should == 1
64
62
  land.township.should == 2
65
63
  land.range.should == 3
66
- #land.meridian.should == "W4"
67
64
  land.meridian.should == 4
68
65
  end
69
66
 
@@ -73,7 +70,6 @@ describe "Rats" do
73
70
  land.section.should == 1
74
71
  land.township.should == 2
75
72
  land.range.should == 3
76
- #land.meridian.should == "W4"
77
73
  land.meridian.should == 4
78
74
  end
79
75
 
@@ -83,27 +79,15 @@ describe "Rats" do
83
79
  land.section.should == 1
84
80
  land.township.should == 2
85
81
  land.range.should == 3
86
- #land.meridian.should == "W4"
87
82
  land.meridian.should == 4
88
83
  end
89
84
 
90
- # NOT SURE THIS IS USEFUL
91
- # it "understands NE01002034" do
92
- # land = Rats.new("NE01002034")
93
- # land.quarter.should == "NE"
94
- # land.section.should == 1
95
- # land.township.should == 2
96
- # land.range.should == 3
97
- # land.meridian.should == "W4"
98
- # end
99
-
100
85
  it "understands 1-2-3 W4" do
101
86
  land = Rats.new("1-2-3 W4")
102
87
  land.quarter.should be_nil
103
88
  land.section.should == 1
104
89
  land.township.should == 2
105
90
  land.range.should == 3
106
- #land.meridian.should == "W4"
107
91
  land.meridian.should == 4
108
92
  end
109
93
 
@@ -113,7 +97,6 @@ describe "Rats" do
113
97
  land.section.should be_nil
114
98
  land.township.should == 2
115
99
  land.range.should == 3
116
- #land.meridian.should == "W4"
117
100
  land.meridian.should == 4
118
101
  end
119
102
 
@@ -123,7 +106,6 @@ describe "Rats" do
123
106
  land.section.should be_nil
124
107
  land.township.should be_nil
125
108
  land.range.should == 3
126
- #land.meridian.should == "W4"
127
109
  land.meridian.should == 4
128
110
  end
129
111
 
@@ -133,18 +115,15 @@ describe "Rats" do
133
115
  land.section.should be_nil
134
116
  land.township.should be_nil
135
117
  land.range.should be_nil
136
- #land.meridian.should == "W4"
137
118
  land.meridian.should == 4
138
119
  end
139
120
 
140
121
  it "understands individual values" do
141
- #land = Rats.new("NE", 1, 2, 3, 4)
142
122
  land = Rats.new(4, 3, 2, 1, "NE")
143
123
  land.quarter.should == "NE"
144
124
  land.section.should == 1
145
125
  land.township.should == 2
146
126
  land.range.should == 3
147
- #land.meridian.should == "W4"
148
127
  land.meridian.should == 4
149
128
  end
150
129
 
@@ -154,7 +133,6 @@ describe "Rats" do
154
133
  land.section.should == 1
155
134
  land.township.should == 119
156
135
  land.range.should == 24
157
- #land.meridian.should == "W4"
158
136
  land.meridian.should == 4
159
137
  end
160
138
 
@@ -167,20 +145,17 @@ describe "Rats" do
167
145
  land.section.should == 1
168
146
  land.township.should == 2
169
147
  land.range.should == 3
170
- #land.meridian.should == "W4"
171
148
  land.meridian.should == 4
172
149
  end
173
150
 
174
151
  it "using location and individual values" do
175
152
  land = Rats.new
176
- #land.location = ["NE", 1, 2, 3, 4]
177
153
  land.location = [4, 3, 2, 1, "NE"]
178
154
  land.quarter.should == "NE"
179
155
  land.section.should == 1
180
156
  land.township.should == 2
181
157
  land.range.should == 3
182
158
  land.meridian.should == 4
183
- #land.meridian.to_s.should == "W4"
184
159
  end
185
160
 
186
161
  end
@@ -223,22 +198,53 @@ describe "Rats" do
223
198
  describe "boundaries" do
224
199
 
225
200
  it "knows when a township is North of Alberta" do
226
- lambda { Rats.new("SE 1-127-1 W4") }.should raise_error(ArgumentError)
201
+ land = Rats.new("SE 1-127-1 W4")
202
+ land.valid?.should be_false
203
+ land.errors.size.should == 1
204
+ land.errors.has_key?(:township).should be_true
205
+ land.errors[:township].first.should == 'not allowed'
227
206
  end
228
207
 
229
208
  it "knows when a township is East of Alberta" do
230
- lambda { Rats.new("SE 1-1-1 W3") }.should raise_error(ArgumentError)
209
+ land = Rats.new("SE 1-1-1 W3")
210
+ land.valid?.should be_false
211
+ land.errors.size.should == 1
212
+ land.errors.has_key?(:meridian).should be_true
213
+ land.errors[:meridian].first.should == 'not allowed'
231
214
  end
232
215
 
233
216
  it "knows when a township is West of Alberta" do
234
- lambda { Rats.new("SE 1-1-1 W7") }.should raise_error(ArgumentError)
217
+ land = Rats.new("SE 1-1-1 W7")
218
+ land.valid?.should be_false
219
+ land.errors.size.should == 1
220
+ land.errors.has_key?(:meridian).should be_true
221
+ land.errors[:meridian].first.should == 'not allowed'
222
+ end
223
+
224
+ it "knows when a township has been squeezed out" do
225
+ land = Rats.new("SE 1-126-25 W4")
226
+ land.valid?.should be_false
227
+ land.errors.size.should == 1
228
+ land.errors.has_key?(:land).should be_true
229
+ land.errors[:land].first.should == 'does not exist'
230
+ end
231
+
232
+ it "knows when a section has been squeezed out" do
233
+ land = Rats.new("SE 6-119-24 W4")
234
+ land.valid?.should be_false
235
+ land.errors.size.should == 1
236
+ land.errors.has_key?(:land).should be_true
237
+ land.errors[:land].first.should == 'does not exist'
235
238
  end
236
239
 
240
+ # it "knows when a quarter has been squeezed out" do
241
+ # end
242
+
237
243
  end
238
244
 
239
245
  describe "formatting" do
240
246
 
241
- describe ":long" do
247
+ describe ":default" do
242
248
 
243
249
  it "returns NE 1-2-3 W4" do
244
250
  land = Rats.new("NE 1-2-3 W4")
@@ -276,6 +282,25 @@ describe "Rats" do
276
282
 
277
283
  end
278
284
 
285
+ describe ":long" do
286
+
287
+ it "returns the long version with Quarter" do
288
+ land = Rats.new("NE 1-2-3 W4")
289
+ land.location(:long).should == "the Northeast Quarter of Section 1, Township 2, Range 3, West of the Fourth Meridian"
290
+ end
291
+
292
+ it "returns the long version with Section" do
293
+ land = Rats.new("1-2-3 W4")
294
+ land.location(:long).should == "Section 1, Township 2, Range 3, West of the Fourth Meridian"
295
+ end
296
+
297
+ it "returns the long version with Township" do
298
+ land = Rats.new("2-3 W4")
299
+ land.location(:long).should == "Township 2, Range 3, West of the Fourth Meridian"
300
+ end
301
+
302
+ end
303
+
279
304
  end
280
305
 
281
306
  describe "scope" do
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 0
9
- version: 0.2.0
8
+ - 1
9
+ version: 0.2.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Mark G