plus_codes 0.1.0 → 0.1.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.
- checksums.yaml +4 -4
- data/lib/plus_codes.rb +1 -0
- data/lib/plus_codes/code_area.rb +1 -0
- data/lib/plus_codes/open_location_code.rb +11 -10
- data/lib/plus_codes/version.rb +1 -1
- data/test/plus_codes_test.rb +10 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1da7f815765ecb2206cb0649c9aa38dd3fa74f02
|
4
|
+
data.tar.gz: 31e1d4218ecd47d5430e73b47760ae8acda9d163
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dde33abf4454355f14b1497c82266e97c2e8cfe5b7a6cf0a8567f133ed0d5d225c433cd8a87029a5c8aab87f10f524095254b08f00e035f97c4224c4f92bb192
|
7
|
+
data.tar.gz: 6e01e7ed5b9bfe233a819a6195122e7d5b0af0f7ef53ae3c5f5d962b9d9d8c67e4165c10e1e201a7fdd4cc48851dbc0aa1c057246d3671646d7e93934049f214
|
data/lib/plus_codes.rb
CHANGED
data/lib/plus_codes/code_area.rb
CHANGED
@@ -12,6 +12,7 @@ module PlusCodes
|
|
12
12
|
# latitude_center: The latitude of the center in degrees.
|
13
13
|
# longitude_center: The longitude of the center in degrees.
|
14
14
|
# code_length: The number of significant characters that were in the code.
|
15
|
+
#
|
15
16
|
# @author We-Ming Wu
|
16
17
|
class CodeArea
|
17
18
|
attr_accessor :latitude_lo, :longitude_lo, :latitude_hi, :longitude_hi,
|
@@ -4,6 +4,7 @@ require 'plus_codes/code_area'
|
|
4
4
|
module PlusCodes
|
5
5
|
|
6
6
|
# [OpenLocationCode] implements the Google Open Location Code(Plus+Codes) algorithm.
|
7
|
+
#
|
7
8
|
# @author We-Ming Wu
|
8
9
|
class OpenLocationCode
|
9
10
|
|
@@ -19,22 +20,22 @@ module PlusCodes
|
|
19
20
|
return false if separator_index.nil? ||
|
20
21
|
separator_index != code.rindex(SEPARATOR) ||
|
21
22
|
separator_index > SEPARATOR_POSITION ||
|
22
|
-
separator_index
|
23
|
+
separator_index.odd?
|
23
24
|
|
24
25
|
# We can have an even number of padding characters before the separator,
|
25
26
|
# but then it must be the final character.
|
26
27
|
if code.include?(PADDING)
|
27
28
|
# Not allowed to start with them!
|
28
|
-
return false if code.
|
29
|
+
return false if code.start_with?(PADDING)
|
29
30
|
|
30
31
|
# There can only be one group and it must have even length.
|
31
32
|
pad_match = /(#{PADDING}+)/.match(code).to_a
|
32
33
|
return false if pad_match.length != 2
|
33
34
|
match = pad_match[1]
|
34
|
-
return false if match.length
|
35
|
+
return false if match.length.odd? || match.length > SEPARATOR_POSITION - 2
|
35
36
|
|
36
37
|
# If the code is long enough to end with a separator, make sure it does.
|
37
|
-
return false if code[
|
38
|
+
return false if code[-1] != SEPARATOR
|
38
39
|
end
|
39
40
|
|
40
41
|
# If there are characters after the separator, make sure there isn't just
|
@@ -43,7 +44,7 @@ module PlusCodes
|
|
43
44
|
|
44
45
|
# Check code contains only valid characters.
|
45
46
|
code.chars.each do |ch|
|
46
|
-
return false if ch.ord
|
47
|
+
return false if ch.ord >= DECODE.length || DECODE[ch.ord] < -1
|
47
48
|
end
|
48
49
|
true
|
49
50
|
end
|
@@ -87,8 +88,7 @@ module PlusCodes
|
|
87
88
|
# @param code_length [Integer] the number of characters in the code, this excludes the separator
|
88
89
|
# @return [String] a plus+codes
|
89
90
|
def encode(latitude, longitude, code_length = PAIR_CODE_LENGTH)
|
90
|
-
if code_length < 2 ||
|
91
|
-
(code_length < SEPARATOR_POSITION && code_length % 2 == 1)
|
91
|
+
if code_length < 2 || (code_length < SEPARATOR_POSITION && code_length.odd?)
|
92
92
|
raise ArgumentError, "Invalid Open Location Code length: #{code_length}"
|
93
93
|
end
|
94
94
|
|
@@ -96,11 +96,12 @@ module PlusCodes
|
|
96
96
|
longitude = normalize_longitude(longitude)
|
97
97
|
if latitude == 90
|
98
98
|
latitude = latitude - compute_latitude_precision(code_length).to_f
|
99
|
-
p latitude
|
100
99
|
end
|
101
100
|
code = encode_pairs(latitude, longitude, [code_length, PAIR_CODE_LENGTH].min)
|
102
101
|
# If the requested length indicates we want grid refined codes.
|
103
|
-
|
102
|
+
if code_length > PAIR_CODE_LENGTH
|
103
|
+
code += encode_grid(latitude, longitude, code_length - PAIR_CODE_LENGTH)
|
104
|
+
end
|
104
105
|
code
|
105
106
|
end
|
106
107
|
|
@@ -142,7 +143,7 @@ module PlusCodes
|
|
142
143
|
if full?(short_code)
|
143
144
|
return short_code
|
144
145
|
else
|
145
|
-
raise ArgumentError,
|
146
|
+
raise ArgumentError, "ValueError: Passed short code is not valid: #{short_code}"
|
146
147
|
end
|
147
148
|
end
|
148
149
|
|
data/lib/plus_codes/version.rb
CHANGED
data/test/plus_codes_test.rb
CHANGED
@@ -64,6 +64,16 @@ class PlusCodesTest < Test::Unit::TestCase
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
+
def test_exceptions
|
68
|
+
assert_raise ArgumentError do
|
69
|
+
@olc.encode(20, 30, 1)
|
70
|
+
end
|
71
|
+
assert_raise ArgumentError do
|
72
|
+
@olc.recover_nearest('9C3W9QCJ-2VX', 51.3708675, -1.217765625)
|
73
|
+
end
|
74
|
+
@olc.recover_nearest('9C3W9QCJ+2VX', 51.3708675, -1.217765625)
|
75
|
+
end
|
76
|
+
|
67
77
|
def read_csv_lines(csv_file)
|
68
78
|
f = File.open(File.join(@test_data_folder_path, csv_file), 'r')
|
69
79
|
f.each_line.lazy.select { |line| line !~ /^\s*#/ }.map { |line| line.chop }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: plus_codes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wei-Ming Wu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|