grid_square 0.0.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/.rspec +1 -0
- data/.rvmrc +1 -0
- data/.travis.yml +9 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +21 -0
- data/README.md +75 -0
- data/Rakefile +1 -0
- data/grid_square.gemspec +19 -0
- data/lib/grid_square/version.rb +3 -0
- data/lib/grid_square.rb +76 -0
- data/lib/location.rb +24 -0
- data/lib/radix_enumerator.rb +12 -0
- data/lib/string_ext.rb +9 -0
- data/spec/lib/grid_square_spec.rb +118 -0
- data/spec/lib/location_spec.rb +39 -0
- data/spec/lib/radix_enumerator_spec.rb +32 -0
- data/spec/lib/string_ext_spec.rb +30 -0
- data/spec/spec_helper.rb +1 -0
- metadata +69 -0
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm gemset use ruby-1.9.3@grid_square --create
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
diff-lcs (1.1.3)
|
5
|
+
rspec (2.11.0)
|
6
|
+
rspec-core (~> 2.11.0)
|
7
|
+
rspec-expectations (~> 2.11.0)
|
8
|
+
rspec-mocks (~> 2.11.0)
|
9
|
+
rspec-core (2.11.1)
|
10
|
+
rspec-expectations (2.11.2)
|
11
|
+
diff-lcs (~> 1.1.3)
|
12
|
+
rspec-given (1.5.1)
|
13
|
+
rspec (> 1.2.8)
|
14
|
+
rspec-mocks (2.11.2)
|
15
|
+
|
16
|
+
PLATFORMS
|
17
|
+
ruby
|
18
|
+
|
19
|
+
DEPENDENCIES
|
20
|
+
rspec
|
21
|
+
rspec-given
|
data/README.md
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
# GridSquare
|
2
|
+
|
3
|
+
Calculate between GridSquare references and latitude/longitude.
|
4
|
+
|
5
|
+
```
|
6
|
+
grid = GridSquare.new "DN40bi"
|
7
|
+
|
8
|
+
grid.center
|
9
|
+
# => #<Location:0x000001008514d8 @longitude=-109.20833333333333, @latitude=41.6875>
|
10
|
+
|
11
|
+
grid.width
|
12
|
+
# => 0.08333333333333333
|
13
|
+
|
14
|
+
grid.height
|
15
|
+
# => 0.041666666666666664
|
16
|
+
|
17
|
+
GridSquare.encode(-111.866785, 40.363840).subsquare
|
18
|
+
# => "DN40bi"
|
19
|
+
|
20
|
+
# With arbitrary precision: specify the number of fields
|
21
|
+
GridSquare.encode(-111.866785, 40.363840, 10).grid_reference
|
22
|
+
# => "DN40BI57XH67OE24bd98"
|
23
|
+
```
|
24
|
+
|
25
|
+
|
26
|
+
# How the US GridSquare System Works
|
27
|
+
|
28
|
+
Okay in theory the GridSquare system is really complicated. But in
|
29
|
+
practice is just base conversion to a number that has a changing
|
30
|
+
radix. The first pair of digits are base 18, and the following pairs
|
31
|
+
alternate between base 10 and base 24.
|
32
|
+
|
33
|
+
Here's how it works:
|
34
|
+
|
35
|
+
The first two letters of a grid reference express the longitude and
|
36
|
+
latitude in base 18 (A through R). This pair of letters divides up the
|
37
|
+
whole planet into 18 equal "fields", each field being 10 degrees high
|
38
|
+
(latitude) and 20 degrees wide (longitude).
|
39
|
+
|
40
|
+
The next two digits are decimals that divide up each field into 10x10
|
41
|
+
"squares" (that's their name; they're obviously not square or even
|
42
|
+
rectangular). Squares are 2 degrees wide and 1 degree tall.
|
43
|
+
|
44
|
+
The next two letters are base 24 (A through X) and divide each square
|
45
|
+
into 24x24 "subsquares". Each subsquare is 5 minutes wide and 2.5
|
46
|
+
minutes tall.
|
47
|
+
|
48
|
+
The next two digits are decimals. The official spec calls this the
|
49
|
+
"extended subsquare".
|
50
|
+
|
51
|
+
Officially the locator system stops at extended subsquares (8 digits)
|
52
|
+
but unofficially it can be extended by repeating the base 10, base 24
|
53
|
+
pairs indefinitely to give precision to the subatomic level and
|
54
|
+
beyond. This is of course quite silly as the whole system is based on
|
55
|
+
the notion of a spherical earth and the point of the system is to
|
56
|
+
economically tell a complete stranger approximately where in the world
|
57
|
+
the person they are talking to is located.
|
58
|
+
|
59
|
+
By convention, the code is capitalized except for the last 2 letters,
|
60
|
+
though the first two characters are always capitalized.
|
61
|
+
|
62
|
+
|
63
|
+
# Who Uses this Crap?
|
64
|
+
|
65
|
+
Ham Radio operators use them to quickly exchange approximate location.
|
66
|
+
By convention, shortwave operators give their location in squares
|
67
|
+
while VHF and UHF operators give their location in subsquares. A
|
68
|
+
square has a precision of about 280km; subsquares give a location to
|
69
|
+
within 12km.
|
70
|
+
|
71
|
+
|
72
|
+
# Really?
|
73
|
+
|
74
|
+
Yes. It even has an amusing name, the Maidenhead Locator System:
|
75
|
+
http://en.wikipedia.org/wiki/Maidenhead_Locator_System
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/grid_square.gemspec
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'grid_square/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "grid_square"
|
8
|
+
gem.version = GridSquare::VERSION
|
9
|
+
gem.authors = ["Graham McIntire", "David Brady"]
|
10
|
+
gem.email = ["gmcintire@gmail.com"]
|
11
|
+
gem.description = %q{Encode/decode between lat/lng locations and US GridSquare references}
|
12
|
+
gem.summary = %q{Encode/decode between lat/lng locations and US GridSquare references}
|
13
|
+
gem.homepage = "https://github.com/gmcintire/grid_square"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
end
|
data/lib/grid_square.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
#require 'location'
|
2
|
+
#require 'radix_enumerator'
|
3
|
+
#require 'string_ext'
|
4
|
+
|
5
|
+
class GridSquare
|
6
|
+
attr_reader :grid_reference, :origin
|
7
|
+
|
8
|
+
# location can be a string containing a GS reference or a pair
|
9
|
+
# containing longitude and latitude.
|
10
|
+
def initialize(grid_reference)
|
11
|
+
@grid_reference = grid_reference
|
12
|
+
decode
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.encode(longitude, latitude, precision=4 )
|
16
|
+
longitude += 180
|
17
|
+
latitude += 90
|
18
|
+
radixes = RadixEnumerator.new
|
19
|
+
grid_reference = ''
|
20
|
+
size = Location.new(360.0, 180.0)
|
21
|
+
precision.times do
|
22
|
+
zero,radix = *radixes.next
|
23
|
+
|
24
|
+
lng = (radix * longitude / size.longitude).floor
|
25
|
+
lat = (radix * latitude / size.latitude).floor
|
26
|
+
|
27
|
+
grid_reference += "%s%s" % [(zero + lng).chr, (zero + lat).chr]
|
28
|
+
size /= radix
|
29
|
+
longitude -= lng * size.longitude
|
30
|
+
latitude -= lat * size.latitude
|
31
|
+
end
|
32
|
+
|
33
|
+
new grid_reference.downcase_last
|
34
|
+
end
|
35
|
+
|
36
|
+
# Maidenhead locator names
|
37
|
+
def field; precision 1; end
|
38
|
+
def square; precision 2; end
|
39
|
+
def subsquare; precision 3; end
|
40
|
+
def extended_subsquare; precision 4; end
|
41
|
+
|
42
|
+
# Return code to a given number of 2-digit fields
|
43
|
+
def precision(num_fields)
|
44
|
+
raise IndexError.new "GridSquare.square: insufficient precision to index #{num_fields} fields" unless grid_reference.length >= num_fields * 2
|
45
|
+
grid_reference[0...num_fields*2].downcase_last
|
46
|
+
end
|
47
|
+
|
48
|
+
def decode
|
49
|
+
radixes = RadixEnumerator.new
|
50
|
+
@origin, @size = Location.new(-180.0, -90.0), Location.new(360.0, 180.0)
|
51
|
+
|
52
|
+
@grid_reference.upcase.chars.each_slice(2) do |lng, lat|
|
53
|
+
zero, radix = *radixes.next
|
54
|
+
@size /= radix
|
55
|
+
@origin += Location.new(@size.longitude * (lng.ord - zero), @size.latitude * (lat.ord - zero))
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def width; @size.longitude; end
|
60
|
+
def height; @size.latitude; end
|
61
|
+
|
62
|
+
def left; @origin.longitude; end
|
63
|
+
def bottom; @origin.latitude; end
|
64
|
+
def top; (@origin + @size).latitude; end
|
65
|
+
def right; (@origin + @size).longitude; end
|
66
|
+
|
67
|
+
alias :west :left
|
68
|
+
alias :south :bottom
|
69
|
+
alias :east :right
|
70
|
+
alias :north :top
|
71
|
+
|
72
|
+
def center
|
73
|
+
@origin + @size/2
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
data/lib/location.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
module GridSquare
|
2
|
+
class Location
|
3
|
+
attr_accessor :longitude, :latitude
|
4
|
+
def initialize(longitude, latitude)
|
5
|
+
@longitude, @latitude = longitude, latitude
|
6
|
+
end
|
7
|
+
|
8
|
+
def /(scalar)
|
9
|
+
Location.new longitude/scalar, latitude/scalar
|
10
|
+
end
|
11
|
+
|
12
|
+
def *(scalar)
|
13
|
+
Location.new longitude*scalar, latitude*scalar
|
14
|
+
end
|
15
|
+
|
16
|
+
def +(other)
|
17
|
+
Location.new longitude+other.longitude, latitude+other.latitude
|
18
|
+
end
|
19
|
+
|
20
|
+
def -(other)
|
21
|
+
Location.new longitude-other.longitude, latitude-other.latitude
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/string_ext.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require_relative "../../lib/grid_square"
|
3
|
+
|
4
|
+
describe GridSquare do
|
5
|
+
context "created from field" do
|
6
|
+
Given(:grid_square) { GridSquare.new "DN" }
|
7
|
+
|
8
|
+
Then { grid_square.field.should == "DN" }
|
9
|
+
Then { lambda { grid_square.square }.should raise_error(IndexError) }
|
10
|
+
Then { lambda { grid_square.subsquare }.should raise_error(IndexError) }
|
11
|
+
Then { lambda { grid_square.extended_subsquare.should }.should raise_error(IndexError) }
|
12
|
+
Then { lambda { grid_square.precision 10 }.should raise_error(IndexError) }
|
13
|
+
|
14
|
+
Then { grid_square.west.should be_within(0.00001).of -120.0 }
|
15
|
+
Then { grid_square.south.should be_within(0.00001).of 40.0 }
|
16
|
+
Then { grid_square.north.should be_within(0.00001).of 50.0 }
|
17
|
+
Then { grid_square.east.should be_within(0.00001).of -100.0 }
|
18
|
+
|
19
|
+
Then { grid_square.width.should be_within(0.00001).of 20.0 }
|
20
|
+
Then { grid_square.height.should be_within(0.00001).of 10.0 }
|
21
|
+
|
22
|
+
Then { grid_square.center.longitude.should be_within(0.00001).of -110.0 }
|
23
|
+
Then { grid_square.center.latitude.should be_within(0.00001).of 45.0 }
|
24
|
+
end
|
25
|
+
|
26
|
+
context "created from square" do
|
27
|
+
Given(:grid_square) { GridSquare.new "DN41" }
|
28
|
+
|
29
|
+
Then { grid_square.field.should == "DN" }
|
30
|
+
Then { grid_square.square.should == "DN41" }
|
31
|
+
Then { lambda { grid_square.subsquare.should == "DN41bi" }.should raise_error(IndexError) }
|
32
|
+
Then { lambda { grid_square.extended_subsquare.should }.should raise_error(IndexError) }
|
33
|
+
Then { lambda { grid_square.precision 10 }.should raise_error(IndexError) }
|
34
|
+
|
35
|
+
Then { grid_square.west.should be_within(0.00001).of -112.0 }
|
36
|
+
Then { grid_square.south.should be_within(0.00001).of 41.0 }
|
37
|
+
|
38
|
+
Then { grid_square.width.should be_within(0.00001).of 2.0 }
|
39
|
+
Then { grid_square.height.should be_within(0.00001).of 1.0 }
|
40
|
+
|
41
|
+
Then { grid_square.center.longitude.should be_within(0.00001).of -111.0 }
|
42
|
+
Then { grid_square.center.latitude.should be_within(0.00001).of 41.5 }
|
43
|
+
end
|
44
|
+
|
45
|
+
context "created from subsquare" do
|
46
|
+
Given(:grid_square) { GridSquare.new "DN41bi" }
|
47
|
+
|
48
|
+
Then { grid_square.field.should == "DN" }
|
49
|
+
Then { grid_square.square.should == "DN41" }
|
50
|
+
Then { grid_square.subsquare.should == "DN41bi" }
|
51
|
+
Then { lambda { grid_square.extended_subsquare.should }.should raise_error(IndexError) }
|
52
|
+
Then { lambda { grid_square.precision 10 }.should raise_error(IndexError) }
|
53
|
+
|
54
|
+
Then { grid_square.west.should be_within(0.00001).of -111.91666 }
|
55
|
+
Then { grid_square.south.should be_within(0.00001).of 41.33333 }
|
56
|
+
|
57
|
+
Then { grid_square.width.should be_within(0.00001).of 0.083333 }
|
58
|
+
Then { grid_square.height.should be_within(0.00001).of 0.041666 }
|
59
|
+
|
60
|
+
Then { grid_square.center.longitude.should be_within(0.00001).of -111.875 }
|
61
|
+
Then { grid_square.center.latitude.should be_within(0.00001).of 41.35416 }
|
62
|
+
end
|
63
|
+
|
64
|
+
context "created from extended subsquare" do
|
65
|
+
Given(:grid_square) { GridSquare.new "DN41bi63" }
|
66
|
+
|
67
|
+
Then { grid_square.field.should == "DN" }
|
68
|
+
Then { grid_square.square.should == "DN41" }
|
69
|
+
Then { grid_square.subsquare.should == "DN41bi" }
|
70
|
+
Then { grid_square.extended_subsquare.should == "DN41bi63" }
|
71
|
+
Then { lambda { grid_square.precision 10 }.should raise_error(IndexError) }
|
72
|
+
|
73
|
+
Then { grid_square.west.should be_within(0.00001).of -111.86666 }
|
74
|
+
Then { grid_square.south.should be_within(0.00001).of 41.34583 }
|
75
|
+
|
76
|
+
Then { grid_square.width.should be_within(0.00001).of 0.0083333 }
|
77
|
+
Then { grid_square.height.should be_within(0.00001).of 0.0041666 }
|
78
|
+
|
79
|
+
Then { grid_square.center.longitude.should be_within(0.00001).of -111.8625 }
|
80
|
+
Then { grid_square.center.latitude.should be_within(0.00001).of 41.34792 }
|
81
|
+
end
|
82
|
+
|
83
|
+
context "proper field casing" do
|
84
|
+
Given(:upper) { GridSquare.new "DN41BI83QR" }
|
85
|
+
Given(:lower) { GridSquare.new "dn41bi83qr" }
|
86
|
+
|
87
|
+
Then { upper.field.should == "DN" }
|
88
|
+
Then { upper.square.should == "DN41" }
|
89
|
+
Then { upper.subsquare.should == "DN41bi" }
|
90
|
+
Then { upper.precision(4).should == "DN41bi83" }
|
91
|
+
|
92
|
+
Then { lower.field.should == "DN" }
|
93
|
+
Then { lower.square.should == "DN41" }
|
94
|
+
Then { lower.subsquare.should == "DN41bi" }
|
95
|
+
Then { lower.precision(4).should == "DN41bi83" }
|
96
|
+
end
|
97
|
+
|
98
|
+
context "created from a ridiculously long GridSquare code" do
|
99
|
+
Given(:ludicrous) { GridSquare.new "RN91SK59MC07FQ84VK31SM03PF57XS16DU32MS24LX34EI48RQ28CS09MA87VO18GS16WK64JL24XF21KJ12FO37RJ73QL28IU39AS55HC86SW74JD70VQ61SF52QA21SD28GB60HT40SN34VG10NP11TP27CR36OA76LD28TI36JE73TF03OT41UH60IX96IH80HX45KC53SJ57AF07HQ38NI74WT84LP33UQ34OP06TV69IA96LB80VW57MV04SJ88AV74GO73JW26BF53DE74BH31EV57WP25WO98IL47BT13AD44WC66BL08IA01KN55FV05EI50KM77HV72LF21NG51XI69QW28PO80FW77AI36BE19ID25JR96KA39DA28LK83PL86TP85AH21LB31NF52BQ06WJ64AQ05XK16RJ16SP96KE85BU61BS68OK10HC39QH86XB51PO62RA27JH93PM08NF46XS98HN76LJ55KQ68AQ34JR96OF09DJ13NP76BP09AP83MK60SE83FX63OS03AG31HA46KB00QF06LU66DX71PH65WU26IF88AO21LE62DI34GF23hc34" }
|
100
|
+
Then { ludicrous.field.should == "RN" }
|
101
|
+
Then { ludicrous.square.should == "RN91" }
|
102
|
+
Then { ludicrous.subsquare.should == "RN91sk" }
|
103
|
+
Then { ludicrous.extended_subsquare.should == "RN91sk59" }
|
104
|
+
Then { lambda { ludicrous.precision 301 }.should raise_error(IndexError) }
|
105
|
+
end
|
106
|
+
|
107
|
+
describe ".encode" do
|
108
|
+
Given(:grid_square) { GridSquare.encode -111.866785, 40.363840 }
|
109
|
+
|
110
|
+
Then { grid_square.grid_reference.should == "DN40bi57" }
|
111
|
+
|
112
|
+
context "with precision" do
|
113
|
+
Given(:grid_square) { GridSquare.encode -111.866785, 40.363840, 10 }
|
114
|
+
|
115
|
+
Then { grid_square.grid_reference.should == "DN40BI57XH67OE24bd98" }
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require_relative '../../lib/location'
|
3
|
+
|
4
|
+
module GridSquare
|
5
|
+
describe Location do
|
6
|
+
# We can use Locations to represent exact points...
|
7
|
+
Given(:origin) { Location.new 0.0, 0.0 }
|
8
|
+
|
9
|
+
# Or spans/sizes
|
10
|
+
Given(:window) { Location.new -180.0, -90.0 }
|
11
|
+
|
12
|
+
Then { window.longitude.should be_within(0.000001).of -180.0 }
|
13
|
+
Then { window.latitude.should be_within(0.000001).of -90.0 }
|
14
|
+
|
15
|
+
context "translation +" do
|
16
|
+
Given(:new_origin) { origin + Location.new(50.0, 40.0) }
|
17
|
+
Then { new_origin.longitude.should be_within(0.000001).of 50.0 }
|
18
|
+
Then { new_origin.latitude.should be_within(0.000001).of 40.0 }
|
19
|
+
end
|
20
|
+
|
21
|
+
context "translation -" do
|
22
|
+
Given(:new_origin) { origin - Location.new(50.0, 40.0) }
|
23
|
+
Then { new_origin.longitude.should be_within(0.000001).of -50.0 }
|
24
|
+
Then { new_origin.latitude.should be_within(0.000001).of -40.0 }
|
25
|
+
end
|
26
|
+
|
27
|
+
context "scaling *" do
|
28
|
+
Given(:new_window) { window * 2 }
|
29
|
+
Then { new_window.longitude.should be_within(0.000001).of -360.0 }
|
30
|
+
Then { new_window.latitude.should be_within(0.000001).of -180.0 }
|
31
|
+
end
|
32
|
+
|
33
|
+
context "scaling /" do
|
34
|
+
Given(:new_window) { window / 2 }
|
35
|
+
Then { new_window.longitude.should be_within(0.000001).of -90.0 }
|
36
|
+
Then { new_window.latitude.should be_within(0.000001).of -45.0 }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require_relative '../../lib/radix_enumerator'
|
3
|
+
|
4
|
+
module GridSquare
|
5
|
+
describe RadixEnumerator do
|
6
|
+
Given(:radix) { RadixEnumerator.new }
|
7
|
+
|
8
|
+
Then {
|
9
|
+
radix.next[0].should == ?A.ord
|
10
|
+
radix.next[0].should == "0".ord
|
11
|
+
radix.next[0].should == ?A.ord
|
12
|
+
radix.next[0].should == "0".ord
|
13
|
+
radix.next[0].should == ?A.ord
|
14
|
+
radix.next[0].should == "0".ord
|
15
|
+
radix.next[0].should == ?A.ord
|
16
|
+
radix.next[0].should == "0".ord
|
17
|
+
radix.next[0].should == ?A.ord
|
18
|
+
}
|
19
|
+
|
20
|
+
Then {
|
21
|
+
radix.next[1].should == 18
|
22
|
+
radix.next[1].should == 10
|
23
|
+
radix.next[1].should == 24
|
24
|
+
radix.next[1].should == 10
|
25
|
+
radix.next[1].should == 24
|
26
|
+
radix.next[1].should == 10
|
27
|
+
radix.next[1].should == 24
|
28
|
+
radix.next[1].should == 10
|
29
|
+
radix.next[1].should == 24
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require_relative "../../lib/string_ext"
|
3
|
+
|
4
|
+
describe String do
|
5
|
+
describe "#downcase_last" do
|
6
|
+
context "field" do
|
7
|
+
Given(:upper) { "DN" }
|
8
|
+
Given(:lower) { "dn" }
|
9
|
+
|
10
|
+
Then { upper.downcase_last.should == "DN" }
|
11
|
+
Then { lower.downcase_last.should == "DN" }
|
12
|
+
end
|
13
|
+
|
14
|
+
context "ending in digits" do
|
15
|
+
Given(:upper) { "DN41BI83" }
|
16
|
+
Given(:lower) { "dn41bi83" }
|
17
|
+
|
18
|
+
Then { upper.downcase_last.should == "DN41bi83" }
|
19
|
+
Then { lower.downcase_last.should == "DN41bi83" }
|
20
|
+
end
|
21
|
+
|
22
|
+
context "subsquare or longer" do
|
23
|
+
Given(:upper) { "DN41BI83QR" }
|
24
|
+
Given(:lower) { "dn41bi83qr" }
|
25
|
+
|
26
|
+
Then { upper.downcase_last.should == "DN41BI83qr" }
|
27
|
+
Then { lower.downcase_last.should == "DN41BI83qr" }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "rspec-given"
|
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: grid_square
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Graham McIntire
|
9
|
+
- David Brady
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2012-11-16 00:00:00.000000000 Z
|
14
|
+
dependencies: []
|
15
|
+
description: Encode/decode between lat/lng locations and US GridSquare references
|
16
|
+
email:
|
17
|
+
- gmcintire@gmail.com
|
18
|
+
executables: []
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- .rspec
|
23
|
+
- .rvmrc
|
24
|
+
- .travis.yml
|
25
|
+
- Gemfile
|
26
|
+
- Gemfile.lock
|
27
|
+
- README.md
|
28
|
+
- Rakefile
|
29
|
+
- grid_square.gemspec
|
30
|
+
- lib/grid_square.rb
|
31
|
+
- lib/grid_square/version.rb
|
32
|
+
- lib/location.rb
|
33
|
+
- lib/radix_enumerator.rb
|
34
|
+
- lib/string_ext.rb
|
35
|
+
- spec/lib/grid_square_spec.rb
|
36
|
+
- spec/lib/location_spec.rb
|
37
|
+
- spec/lib/radix_enumerator_spec.rb
|
38
|
+
- spec/lib/string_ext_spec.rb
|
39
|
+
- spec/spec_helper.rb
|
40
|
+
homepage: https://github.com/gmcintire/grid_square
|
41
|
+
licenses: []
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options: []
|
44
|
+
require_paths:
|
45
|
+
- lib
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ! '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
requirements: []
|
59
|
+
rubyforge_project:
|
60
|
+
rubygems_version: 1.8.23
|
61
|
+
signing_key:
|
62
|
+
specification_version: 3
|
63
|
+
summary: Encode/decode between lat/lng locations and US GridSquare references
|
64
|
+
test_files:
|
65
|
+
- spec/lib/grid_square_spec.rb
|
66
|
+
- spec/lib/location_spec.rb
|
67
|
+
- spec/lib/radix_enumerator_spec.rb
|
68
|
+
- spec/lib/string_ext_spec.rb
|
69
|
+
- spec/spec_helper.rb
|