hexagonly 0.1.0
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 +15 -0
- data/.gitignore +24 -0
- data/.rspec +1 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +265 -0
- data/Rakefile +7 -0
- data/hexagonly.gemspec +31 -0
- data/lib/hexagonly/geo_json.rb +34 -0
- data/lib/hexagonly/hexagon.rb +212 -0
- data/lib/hexagonly/point.rb +113 -0
- data/lib/hexagonly/polygon.rb +94 -0
- data/lib/hexagonly/space.rb +37 -0
- data/lib/hexagonly/version.rb +3 -0
- data/lib/hexagonly.rb +11 -0
- data/localities.rb +17 -0
- data/spec/factories.rb +12 -0
- data/spec/fixtures/localities.csv +5009 -0
- data/spec/lib/hexagonly/hexagon_spec.rb +208 -0
- data/spec/lib/hexagonly/point_spec.rb +71 -0
- data/spec/lib/hexagonly/polygon_spec.rb +96 -0
- data/spec/lib/hexagonly/space_spec.rb +31 -0
- data/spec/lib/hexagonly_spec.rb +5 -0
- data/spec/spec_helper.rb +8 -0
- metadata +163 -0
@@ -0,0 +1,208 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hexagonly::Hexagon do
|
4
|
+
|
5
|
+
describe "#hex_corners" do
|
6
|
+
|
7
|
+
context "if hex_center or hex_size have not been defined" do
|
8
|
+
subject { Hexagonly::Hexagon.new(nil, nil) }
|
9
|
+
it { expect { subject.hex_corners }.to raise_error Exception }
|
10
|
+
end
|
11
|
+
|
12
|
+
context "if hex_center and hex_size have been defined" do
|
13
|
+
subject { Hexagonly::Hexagon.new(Hexagonly::Point.new(5, 6), 2.1) }
|
14
|
+
let(:corners) do
|
15
|
+
[
|
16
|
+
[7.1, 6.0],
|
17
|
+
[6.050000000000001, 7.818653347947321],
|
18
|
+
[3.95, 7.818653347947321],
|
19
|
+
[2.9, 6.0],
|
20
|
+
[3.9499999999999993, 4.18134665205268],
|
21
|
+
[6.049999999999999, 4.181346652052678]
|
22
|
+
]
|
23
|
+
end
|
24
|
+
it { subject.hex_corners.size == 5 }
|
25
|
+
it { (subject.hex_corners.map{ |p| [p.x_coord, p.y_coord] } - corners).should == [] }
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#loosely_contains?" do
|
31
|
+
|
32
|
+
context "if hex_center or hex_size have not been defined" do
|
33
|
+
subject { Hexagonly::Hexagon.new(nil, nil) }
|
34
|
+
it { expect { subject.loosely_contains?(Hexagonly::Point.new(1, 1)) }.to raise_error Exception }
|
35
|
+
end
|
36
|
+
|
37
|
+
context "if hex_center and hex_size have been defined" do
|
38
|
+
subject { Hexagonly::Hexagon.new(Hexagonly::Point.new(5, 6), 2.1) }
|
39
|
+
# Outside the bounding box
|
40
|
+
it { subject.loosely_contains?(Hexagonly::Point.new(5, 8)).should == false }
|
41
|
+
it { subject.loosely_contains?(Hexagonly::Point.new(5, 4)).should == false }
|
42
|
+
it { subject.loosely_contains?(Hexagonly::Point.new(2, 6)).should == false }
|
43
|
+
it { subject.loosely_contains?(Hexagonly::Point.new(8, 6)).should == false }
|
44
|
+
# Inside the bounding box but outside the hexagon
|
45
|
+
it { subject.loosely_contains?(Hexagonly::Point.new(3.3, 7)).should == true }
|
46
|
+
it { subject.loosely_contains?(Hexagonly::Point.new(6.7, 5)).should == true }
|
47
|
+
# Inside the hexagon
|
48
|
+
it { subject.loosely_contains?(Hexagonly::Point.new(5.1, 6.2)).should == true }
|
49
|
+
it { subject.loosely_contains?(Hexagonly::Point.new(4.2, 5.3)).should == true }
|
50
|
+
it { subject.loosely_contains?(Hexagonly::Point.new(5.0, 6.0)).should == true }
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "#contains?" do
|
56
|
+
|
57
|
+
context "if hex_center or hex_size have not been defined" do
|
58
|
+
subject { Hexagonly::Hexagon.new(nil, nil) }
|
59
|
+
it { expect { subject.contains?(Hexagonly::Point.new(1, 1)) }.to raise_error Exception }
|
60
|
+
end
|
61
|
+
|
62
|
+
context "if hex_center and hex_size have been defined" do
|
63
|
+
subject { Hexagonly::Hexagon.new(Hexagonly::Point.new(5, 6), 2.1) }
|
64
|
+
# Outside the bounding box
|
65
|
+
it { subject.contains?(Hexagonly::Point.new(5, 8)).should == false }
|
66
|
+
it { subject.contains?(Hexagonly::Point.new(5, 4)).should == false }
|
67
|
+
it { subject.contains?(Hexagonly::Point.new(2, 6)).should == false }
|
68
|
+
it { subject.contains?(Hexagonly::Point.new(8, 6)).should == false }
|
69
|
+
# Inside the bounding box but outside the hexagon
|
70
|
+
it { subject.contains?(Hexagonly::Point.new(3.3, 7)).should == false }
|
71
|
+
it { subject.contains?(Hexagonly::Point.new(6.7, 5)).should == false }
|
72
|
+
# Inside the hexagon
|
73
|
+
it { subject.contains?(Hexagonly::Point.new(5.1, 6.2)).should == true }
|
74
|
+
it { subject.contains?(Hexagonly::Point.new(4.2, 5.3)).should == true }
|
75
|
+
it { subject.contains?(Hexagonly::Point.new(5.0, 6.0)).should == true }
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "#grab" do
|
81
|
+
|
82
|
+
context "when none of the points belong to the hexagon" do
|
83
|
+
let(:rejected_points) { [[5, 8], [5, 4], [2, 6], [8, 6], [3.3, 7], [6.7, 5]].map{ |x, y| Hexagonly::Point.new(x, y) } }
|
84
|
+
subject do
|
85
|
+
hex = Hexagonly::Hexagon.new(Hexagonly::Point.new(5, 6), 2.1)
|
86
|
+
hex.grab(rejected_points)
|
87
|
+
hex
|
88
|
+
end
|
89
|
+
it { subject.collected_points.class.should == Array }
|
90
|
+
it { subject.collected_points.size.should == 0 }
|
91
|
+
it { subject.rejected_points.class.should == Array }
|
92
|
+
it { subject.rejected_points.should == rejected_points }
|
93
|
+
end
|
94
|
+
|
95
|
+
context "when some of the points belong to the hexagon" do
|
96
|
+
let(:accepted_points) { [[5.1, 6.2], [4.2, 5.3], [5.0, 6.0]].map{ |x, y| Hexagonly::Point.new(x, y) } }
|
97
|
+
let(:rejected_points) { [[5, 8], [5, 4], [2, 6], [8, 6], [3.3, 7], [6.7, 5]].map{ |x, y| Hexagonly::Point.new(x, y) } }
|
98
|
+
subject do
|
99
|
+
hex = Hexagonly::Hexagon.new(Hexagonly::Point.new(5, 6), 2.1)
|
100
|
+
hex.grab(accepted_points + rejected_points)
|
101
|
+
hex
|
102
|
+
end
|
103
|
+
it { subject.collected_points.class.should == Array }
|
104
|
+
it { subject.collected_points.should == accepted_points }
|
105
|
+
it { subject.rejected_points.class.should == Array }
|
106
|
+
it { subject.rejected_points.should == rejected_points }
|
107
|
+
end
|
108
|
+
|
109
|
+
context "when all of the points belong to the hexagon" do
|
110
|
+
let(:accepted_points) { [[5.1, 6.2], [4.2, 5.3], [5.0, 6.0]].map{ |x, y| Hexagonly::Point.new(x, y) } }
|
111
|
+
subject do
|
112
|
+
hex = Hexagonly::Hexagon.new(Hexagonly::Point.new(5, 6), 2.1)
|
113
|
+
hex.grab(accepted_points)
|
114
|
+
hex
|
115
|
+
end
|
116
|
+
it { subject.collected_points.class.should == Array }
|
117
|
+
it { subject.collected_points.should == accepted_points }
|
118
|
+
it { subject.rejected_points.class.should == Array }
|
119
|
+
it { subject.rejected_points.size.should == 0 }
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
describe ".pack" do
|
125
|
+
|
126
|
+
context "when using default classes and point grabbing" do
|
127
|
+
let(:points) { 100.times.map{ build(:point) } }
|
128
|
+
let(:hex_size) { 0.15 }
|
129
|
+
let(:params) { { :grab_points => true } }
|
130
|
+
subject { Hexagonly::Hexagon.pack(points, hex_size, params) }
|
131
|
+
it { subject.class.should == Array }
|
132
|
+
it { subject.each{ |hex| hex.collected_points.each{ |p| hex.contains?(p).should == true } } }
|
133
|
+
it { subject.inject([]){ |arr, hex| arr += hex.collected_points }.size.should == points.size }
|
134
|
+
end
|
135
|
+
|
136
|
+
context "when using default classes, point grabbing and rejecting empty" do
|
137
|
+
let(:points) { 100.times.map{ build(:point) } }
|
138
|
+
let(:hex_size) { 0.15 }
|
139
|
+
let(:params) { { :grab_points => true, :reject_empty => true } }
|
140
|
+
subject { Hexagonly::Hexagon.pack(points, hex_size, params) }
|
141
|
+
it { subject.class.should == Array }
|
142
|
+
it { subject.inject([]){ |arr, hex| arr += hex.collected_points }.size.should == points.size }
|
143
|
+
it { subject.each{ |hex| hex.collected_points.should_not be_empty} }
|
144
|
+
end
|
145
|
+
|
146
|
+
context "when using custom classes" do
|
147
|
+
before(:all) do
|
148
|
+
class CustomPoint
|
149
|
+
include Hexagonly::Point::Methods
|
150
|
+
x_y_coord_methods :a, :b
|
151
|
+
|
152
|
+
attr_accessor :a, :b
|
153
|
+
def initialize(*args); set_coords(*args) if args.size == 2; end
|
154
|
+
end
|
155
|
+
|
156
|
+
class CustomHexagon
|
157
|
+
include Hexagonly::Hexagon::Methods
|
158
|
+
|
159
|
+
def initialize(*args); setup_hex(center, size) if args.size == 2; end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
let(:custom_boundries) { [[22, 46], [24, 48]].map{ |x, y| CustomPoint.new(x, y) } }
|
163
|
+
let(:hex_size) { 0.15 }
|
164
|
+
let(:params) { { :hexagon_class => CustomHexagon, :point_class => CustomPoint } }
|
165
|
+
subject{ Hexagonly::Hexagon.pack(custom_boundries, hex_size, params) }
|
166
|
+
it { subject.inject(0){ |sum, hex| sum += custom_boundries.inject(0){ |subsum, p| hex.contains?(p) ? subsum += 1 : subsum } }.should == custom_boundries.size }
|
167
|
+
it { subject.each{ |hex| hex.class.should == CustomHexagon } }
|
168
|
+
it { subject.each{ |hex| hex.hex_center.class.should == CustomPoint } }
|
169
|
+
end
|
170
|
+
|
171
|
+
context "when using custom classes with mixed points and point grabbing" do
|
172
|
+
before(:all) do
|
173
|
+
class Cheese
|
174
|
+
include Hexagonly::Point::Methods
|
175
|
+
x_y_coord_methods :a, :b
|
176
|
+
|
177
|
+
attr_accessor :a, :b
|
178
|
+
def initialize(*args); set_coords(*args) if args.size == 2; end
|
179
|
+
end
|
180
|
+
|
181
|
+
class Salami
|
182
|
+
include Hexagonly::Point::Methods
|
183
|
+
x_y_coord_methods :a, :b
|
184
|
+
|
185
|
+
attr_accessor :a, :b
|
186
|
+
def initialize(*args); set_coords(*args) if args.size == 2; end
|
187
|
+
end
|
188
|
+
|
189
|
+
class Pizza
|
190
|
+
include Hexagonly::Hexagon::Methods
|
191
|
+
|
192
|
+
def initialize(*args); setup_hex(center, size) if args.size == 2; end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
let(:points) { 100.times.map{ [Cheese, Salami].sample.new(generate(:x), generate(:y)) } }
|
196
|
+
let(:hex_size) { 0.15 }
|
197
|
+
let(:params) { { :hexagon_class => Pizza, :grab_points => true } }
|
198
|
+
subject{ Hexagonly::Hexagon.pack(points, hex_size, params) }
|
199
|
+
it { subject.class.should == Array }
|
200
|
+
it { subject.each{ |hex| hex.class.should == Pizza } }
|
201
|
+
it { subject.each{ |hex| hex.collected_points.each{ |p| hex.contains?(p).should == true } } }
|
202
|
+
it { subject.inject([]){ |arr, hex| arr += hex.collected_points }.size.should == points.size }
|
203
|
+
it { subject.each{ |hex| hex.collected_points.each{ |p| [Cheese, Salami].should include(p.class) } } }
|
204
|
+
end
|
205
|
+
|
206
|
+
end
|
207
|
+
|
208
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hexagonly::Point do
|
4
|
+
|
5
|
+
describe "#x_coord and #y_coord" do
|
6
|
+
|
7
|
+
context "when .set_coord_names WAS NOT used" do
|
8
|
+
|
9
|
+
context "if #x and #y are not defined" do
|
10
|
+
before(:all) do
|
11
|
+
class TestPoint
|
12
|
+
include Hexagonly::Point::Methods
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
subject { TestPoint.new }
|
17
|
+
it { expect {subject.x_coord}.to raise_error(NoMethodError) }
|
18
|
+
it { expect {subject.y_coord}.to raise_error(NoMethodError) }
|
19
|
+
end
|
20
|
+
|
21
|
+
context "if #x and #y are defined" do
|
22
|
+
before(:all) do
|
23
|
+
class TestPoint
|
24
|
+
include Hexagonly::Point::Methods
|
25
|
+
attr_accessor :x, :y
|
26
|
+
def initialize(x, y); @x, @y = x, y; end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
subject { TestPoint.new(1, 2) }
|
31
|
+
it { subject.x_coord.should == 1 }
|
32
|
+
it { subject.y_coord.should == 2 }
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when .set_coord_names WAS used" do
|
38
|
+
|
39
|
+
context "if given coordinate methods are not defined" do
|
40
|
+
before(:all) do
|
41
|
+
class TestPoint
|
42
|
+
include Hexagonly::Point::Methods
|
43
|
+
x_y_coord_methods :a, :b
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
subject { TestPoint.new(1, 2) }
|
48
|
+
it { expect {subject.x_coord}.to raise_error(NoMethodError) }
|
49
|
+
it { expect {subject.y_coord}.to raise_error(NoMethodError) }
|
50
|
+
end
|
51
|
+
|
52
|
+
context "if given coordinate methods are defined" do
|
53
|
+
before(:all) do
|
54
|
+
class TestPoint
|
55
|
+
include Hexagonly::Point::Methods
|
56
|
+
x_y_coord_methods :a, :b
|
57
|
+
attr_accessor :a, :b
|
58
|
+
def initialize(a, b); @a, @b = a, b; end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
subject { TestPoint.new(1, 2) }
|
63
|
+
it { subject.x_coord.should == 1 }
|
64
|
+
it { subject.y_coord.should == 2 }
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hexagonly::Polygon do
|
4
|
+
|
5
|
+
describe "#poly_points" do
|
6
|
+
|
7
|
+
context "when .poly_points_method WAS NOT used" do
|
8
|
+
|
9
|
+
context "if #poly_points is not defined" do
|
10
|
+
before(:all) do
|
11
|
+
class TestPolyWithoutPolyPoints
|
12
|
+
include Hexagonly::Polygon::Methods
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
subject { TestPolyWithoutPolyPoints.new }
|
17
|
+
it { expect { subject.poly_points }.to raise_error(NoMethodError) }
|
18
|
+
end
|
19
|
+
|
20
|
+
context "if #poly_points is defined" do
|
21
|
+
before(:all) do
|
22
|
+
class TestPolyWithPolyPoints
|
23
|
+
include Hexagonly::Polygon::Methods
|
24
|
+
attr_reader :poly_points
|
25
|
+
def initialize(points); @poly_points = points; end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
let(:points) { 5.times.map{ build(:point) } }
|
30
|
+
subject { TestPolyWithPolyPoints.new(points).poly_points }
|
31
|
+
it { subject.class.should == Array }
|
32
|
+
it { should == points }
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when .poly_points_method WAS used" do
|
38
|
+
|
39
|
+
context "if given method is defined" do
|
40
|
+
before(:all) do
|
41
|
+
class TestPolyWithCustomMethod
|
42
|
+
include Hexagonly::Polygon::Methods
|
43
|
+
poly_points_method :custom_poly_points
|
44
|
+
attr_reader :custom_poly_points
|
45
|
+
def initialize(points); @custom_poly_points = points; end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
let(:points) { 5.times.map{ build(:point) } }
|
50
|
+
subject { TestPolyWithCustomMethod.new(points) }
|
51
|
+
it { subject.poly_points.class.should == Array }
|
52
|
+
it { subject.poly_points.should == points }
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "#contains?" do
|
60
|
+
|
61
|
+
context "when the polygon has less than 3 points" do
|
62
|
+
let(:points) { 2.times.map( build(:point)) }
|
63
|
+
it { expect { Hexagonly::Polygon.new(nil).contains?(Hexagonly::Point.new(1, 2)) }.to raise_error Exception }
|
64
|
+
it { expect { Hexagonly::Polygon.new(points).contains?(Hexagonly::Point.new(1, 2)) }.to raise_error Exception }
|
65
|
+
end
|
66
|
+
|
67
|
+
context "when the polygon has 3 or more points and a simple poly was given" do
|
68
|
+
# See Wolfram Alpha: (4, 4)(5, 6)(3, 8)(8, 8)(7, 4) polygon
|
69
|
+
let(:simple_poly_points) { [[4, 4], [5, 6], [3, 8], [8, 8], [7, 4]].map{ |p| Hexagonly::Point.new(p[0], p[1]) } }
|
70
|
+
subject { Hexagonly::Polygon.new(simple_poly_points) }
|
71
|
+
it { subject.contains?(Hexagonly::Point.new(4, 6)).should == false }
|
72
|
+
it { subject.contains?(Hexagonly::Point.new(6, 6)).should == true }
|
73
|
+
it { subject.contains?(Hexagonly::Point.new(3, 3)).should == false }
|
74
|
+
it { subject.contains?(Hexagonly::Point.new(6, 7.99)).should == true }
|
75
|
+
it { subject.contains?(Hexagonly::Point.new(8, 6)).should == false }
|
76
|
+
it { subject.contains?(Hexagonly::Point.new(-6, -6)).should == false }
|
77
|
+
end
|
78
|
+
|
79
|
+
context "when the polygon has 3 or more points and a messed up poly was given" do
|
80
|
+
# See Wolfram Alpha: (4, 6)(8, 7)(7, 3)(5, 9)(8, 9)(4.2, 2)(5, 4) polygon
|
81
|
+
let(:messed_up_poly_points) { [[4, 6], [8, 7], [7, 3], [5, 9], [8, 9], [4.2, 2], [5, 4]].map{ |p| Hexagonly::Point.new(p[0], p[1]) } }
|
82
|
+
subject { Hexagonly::Polygon.new(messed_up_poly_points) }
|
83
|
+
it { subject.contains?(Hexagonly::Point.new(8, 6)).should == false }
|
84
|
+
it { subject.contains?(Hexagonly::Point.new(4, 4)).should == false }
|
85
|
+
it { subject.contains?(Hexagonly::Point.new(4.3, 7)).should == false }
|
86
|
+
it { subject.contains?(Hexagonly::Point.new(7, 8)).should == true }
|
87
|
+
it { subject.contains?(Hexagonly::Point.new(5.1, 4)).should == true }
|
88
|
+
it { subject.contains?(Hexagonly::Point.new(6, 4.2)).should == false }
|
89
|
+
it { subject.contains?(Hexagonly::Point.new(6, 5)).should == false }
|
90
|
+
it { subject.contains?(Hexagonly::Point.new(4.9, 3.5)).should == true }
|
91
|
+
it { subject.contains?(Hexagonly::Point.new(6, 6.2)).should == false }
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hexagonly::Space do
|
4
|
+
|
5
|
+
context "when initialized with sufficient points" do
|
6
|
+
before(:each) do
|
7
|
+
points_arr = [
|
8
|
+
[1, 2], [3, 2], [4, 3], [1, 5], [4, 4], [7, 2], [8, 1], [2, 6], [5, 9], [6, 5], [1, 4]
|
9
|
+
]
|
10
|
+
@points = points_arr.map{ |point| Hexagonly::Point.new(point[0], point[1]) }
|
11
|
+
@space = Hexagonly::Space.new(@points)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "assigns points to a readable attribute" do
|
15
|
+
@space.points.should == @points
|
16
|
+
end
|
17
|
+
|
18
|
+
it "computes the boundries of this space" do
|
19
|
+
@space.north.should == Hexagonly::Point.new(5, 9)
|
20
|
+
@space.west.should == Hexagonly::Point.new(1, 2)
|
21
|
+
@space.south.should == Hexagonly::Point.new(8, 1)
|
22
|
+
@space.east.should == Hexagonly::Point.new(8, 1)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "computes the center of this space" do
|
26
|
+
@space.center.class.should == Hexagonly::Point
|
27
|
+
@space.center.should == Hexagonly::Point.new((8 - 1) / 2 + 1, (9 - 1) / 2 + 1)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,163 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hexagonly
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Florin Lipan
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-10-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: factory_girl
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: yard
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: redcarpet
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: Hexagonal tiling in Ruby.
|
98
|
+
email:
|
99
|
+
- lipanski@gmail.com
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- .gitignore
|
105
|
+
- .rspec
|
106
|
+
- .ruby-gemset
|
107
|
+
- .ruby-version
|
108
|
+
- Gemfile
|
109
|
+
- LICENSE.txt
|
110
|
+
- README.md
|
111
|
+
- Rakefile
|
112
|
+
- hexagonly.gemspec
|
113
|
+
- lib/hexagonly.rb
|
114
|
+
- lib/hexagonly/geo_json.rb
|
115
|
+
- lib/hexagonly/hexagon.rb
|
116
|
+
- lib/hexagonly/point.rb
|
117
|
+
- lib/hexagonly/polygon.rb
|
118
|
+
- lib/hexagonly/space.rb
|
119
|
+
- lib/hexagonly/version.rb
|
120
|
+
- localities.rb
|
121
|
+
- spec/factories.rb
|
122
|
+
- spec/fixtures/localities.csv
|
123
|
+
- spec/lib/hexagonly/hexagon_spec.rb
|
124
|
+
- spec/lib/hexagonly/point_spec.rb
|
125
|
+
- spec/lib/hexagonly/polygon_spec.rb
|
126
|
+
- spec/lib/hexagonly/space_spec.rb
|
127
|
+
- spec/lib/hexagonly_spec.rb
|
128
|
+
- spec/spec_helper.rb
|
129
|
+
homepage: ''
|
130
|
+
licenses:
|
131
|
+
- MIT
|
132
|
+
metadata: {}
|
133
|
+
post_install_message:
|
134
|
+
rdoc_options: []
|
135
|
+
require_paths:
|
136
|
+
- lib
|
137
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - ! '>='
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
147
|
+
requirements: []
|
148
|
+
rubyforge_project:
|
149
|
+
rubygems_version: 2.0.5
|
150
|
+
signing_key:
|
151
|
+
specification_version: 4
|
152
|
+
summary: Provides helper classes for performing regular, flat-topped hexagonal tiling
|
153
|
+
and other polygon-related operations.
|
154
|
+
test_files:
|
155
|
+
- spec/factories.rb
|
156
|
+
- spec/fixtures/localities.csv
|
157
|
+
- spec/lib/hexagonly/hexagon_spec.rb
|
158
|
+
- spec/lib/hexagonly/point_spec.rb
|
159
|
+
- spec/lib/hexagonly/polygon_spec.rb
|
160
|
+
- spec/lib/hexagonly/space_spec.rb
|
161
|
+
- spec/lib/hexagonly_spec.rb
|
162
|
+
- spec/spec_helper.rb
|
163
|
+
has_rdoc:
|