tillless-core 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/Guardfile +24 -0
- data/README.md +29 -0
- data/Rakefile +2 -0
- data/lib/tillless-core.rb +13 -0
- data/lib/tillless-core/location.rb +235 -0
- data/lib/tillless-core/version.rb +3 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/tillless-core/location_spec.rb +135 -0
- data/tillless-core.gemspec +22 -0
- metadata +124 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'rspec' do
|
5
|
+
watch(%r{^spec/.+_spec\.rb$})
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
7
|
+
watch('spec/spec_helper.rb') { "spec" }
|
8
|
+
|
9
|
+
# Rails example
|
10
|
+
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
11
|
+
watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
12
|
+
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
13
|
+
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
14
|
+
watch('config/routes.rb') { "spec/routing" }
|
15
|
+
watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
16
|
+
|
17
|
+
# Capybara request specs
|
18
|
+
watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" }
|
19
|
+
|
20
|
+
# Turnip features and steps
|
21
|
+
watch(%r{^spec/acceptance/(.+)\.feature$})
|
22
|
+
watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
|
23
|
+
end
|
24
|
+
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Tillless::Core
|
2
|
+
|
3
|
+
Utilities used across Tillless
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'tillless-core'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install tillless-core
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
TODO: Write usage instructions here
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
module Tillless
|
2
|
+
require 'tillless-core/version'
|
3
|
+
require 'tillless-core/location'
|
4
|
+
end
|
5
|
+
|
6
|
+
# This is only necessary for when the utilities are pulled into the RubyMotion app
|
7
|
+
if defined?(Motion::Project::Config)
|
8
|
+
Motion::Project::App.setup do |app|
|
9
|
+
Dir.glob(File.join(File.dirname(__FILE__), 'tillless-core/*.rb')).each do |file|
|
10
|
+
app.files.unshift(file)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,235 @@
|
|
1
|
+
# tillless-core/lib/tillless-core/location.rb
|
2
|
+
module Tillless
|
3
|
+
module Location
|
4
|
+
|
5
|
+
# Radius of the Earth in km
|
6
|
+
RADIUS_OF_EARTH = Float(6378.7)
|
7
|
+
|
8
|
+
# Minimum distance apart to be considered 'near' in km
|
9
|
+
MIN_DISTANCE_FOR_NEARBY_IN_KM = 0.2
|
10
|
+
MIN_DISTANCE_FOR_NEARBY_IN_M = MIN_DISTANCE_FOR_NEARBY_IN_KM * 1000.0
|
11
|
+
|
12
|
+
# Shorthand for Pi Radians
|
13
|
+
PI_RADIANCE = (Math::PI / 180)
|
14
|
+
|
15
|
+
# Factor used in great circle calcs
|
16
|
+
GREAT_CIRCLE_FACTOR = 57.2958
|
17
|
+
|
18
|
+
# Class for raising exceptions
|
19
|
+
class LocationCalibrationException < Exception
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.included(base)
|
23
|
+
base.send :include, InstanceMethods
|
24
|
+
base.send :extend, ClassMethods
|
25
|
+
|
26
|
+
# Set the right attr method if a rails environment (assuming it's an ActiveRecord model)
|
27
|
+
if defined?(Rails.env)
|
28
|
+
base.send :attr_accessible, :lat, :lon
|
29
|
+
base.send :validates_presence_of, :lat, :lon
|
30
|
+
# Always recalibrate on save
|
31
|
+
base.send :before_save, :calibrate
|
32
|
+
base.send :include, RailsInstanceMethods
|
33
|
+
else
|
34
|
+
base.send :include, RubyInstanceMethods
|
35
|
+
|
36
|
+
attr_accessor :lat, :lon
|
37
|
+
|
38
|
+
# true if calibrated, note: following lat= or lon= it will need to be re-calibrated
|
39
|
+
attr_accessor :calibrated
|
40
|
+
|
41
|
+
# These are used so that half of the Great Circle algorithm can be calculated on
|
42
|
+
# instantiation which makes any subsequent comparison check significantly faster.
|
43
|
+
# See calibrate() for more details.
|
44
|
+
attr_accessor :term1, :term2, :term3, :term4, :term5, :term6
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
module ClassMethods
|
49
|
+
# Empty at this stage
|
50
|
+
end
|
51
|
+
|
52
|
+
module RailsInstanceMethods
|
53
|
+
# updated setters to decalibrate if lan/lon attributes updated without save
|
54
|
+
def lat=(val)
|
55
|
+
self.calibrated = false
|
56
|
+
super(val)
|
57
|
+
end
|
58
|
+
|
59
|
+
def lon=(val)
|
60
|
+
self.calibrated = false
|
61
|
+
super(val)
|
62
|
+
end
|
63
|
+
|
64
|
+
def term1=(val)
|
65
|
+
self.calibrated = false
|
66
|
+
super(val)
|
67
|
+
end
|
68
|
+
|
69
|
+
def term2=(val)
|
70
|
+
self.calibrated = false
|
71
|
+
super(val)
|
72
|
+
end
|
73
|
+
|
74
|
+
def term3=(val)
|
75
|
+
self.calibrated = false
|
76
|
+
super(val)
|
77
|
+
end
|
78
|
+
|
79
|
+
def term4=(val)
|
80
|
+
self.calibrated = false
|
81
|
+
super(val)
|
82
|
+
end
|
83
|
+
|
84
|
+
def term5=(val)
|
85
|
+
self.calibrated = false
|
86
|
+
super(val)
|
87
|
+
end
|
88
|
+
|
89
|
+
def term6=(val)
|
90
|
+
self.calibrated = false
|
91
|
+
super(val)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
module RubyInstanceMethods
|
96
|
+
# Assumes that :lat and :lon are Doubles / Floats
|
97
|
+
def initialize(hash = {})
|
98
|
+
|
99
|
+
# lat and lon coordinates of loation
|
100
|
+
@lat = hash[:lat]
|
101
|
+
@lon = hash[:lon]
|
102
|
+
|
103
|
+
# components of the Great Circle formula
|
104
|
+
@term1 = 0.0;
|
105
|
+
@term2 = 0.0;
|
106
|
+
@term3 = 0.0;
|
107
|
+
@term4 = 0.0;
|
108
|
+
@term5 = 0.0;
|
109
|
+
@term6 = 0.0;
|
110
|
+
|
111
|
+
# calibrate on creation to do first half of Great Circle calculation
|
112
|
+
calibrate
|
113
|
+
end
|
114
|
+
|
115
|
+
# These methods are only valid for a ruby class and will break an ActiveRecord model
|
116
|
+
# Set lat value for the location and mark the location as !calibrated
|
117
|
+
def lat=(_lat)
|
118
|
+
@lat = _lat
|
119
|
+
@calibrated = false
|
120
|
+
end
|
121
|
+
|
122
|
+
#Set lon value for the location and mark the location as !calibrated
|
123
|
+
def lon=(_lon)
|
124
|
+
@lon = lon
|
125
|
+
@calibrated = false
|
126
|
+
end
|
127
|
+
|
128
|
+
# private
|
129
|
+
|
130
|
+
# # Mark location as !calibrated if any changes are made to any of the terms
|
131
|
+
# def term1=(_lon)
|
132
|
+
# @lon = lon
|
133
|
+
# @calibrated = false
|
134
|
+
# end
|
135
|
+
|
136
|
+
# def term2=(_lon)
|
137
|
+
# @lon = lon
|
138
|
+
# @calibrated = false
|
139
|
+
# end
|
140
|
+
|
141
|
+
# def term3=(_lon)
|
142
|
+
# @lon = lon
|
143
|
+
# @calibrated = false
|
144
|
+
# end
|
145
|
+
|
146
|
+
# def term4=(_lon)
|
147
|
+
# @lon = lon
|
148
|
+
# @calibrated = false
|
149
|
+
# end
|
150
|
+
|
151
|
+
# def term5=(_lon)
|
152
|
+
# @lon = lon
|
153
|
+
# @calibrated = false
|
154
|
+
# end
|
155
|
+
|
156
|
+
# def term6=(_lon)
|
157
|
+
# @lon = lon
|
158
|
+
# @calibrated = false
|
159
|
+
# end
|
160
|
+
|
161
|
+
# def calibrated=(val)
|
162
|
+
# @calibrated = val
|
163
|
+
# end
|
164
|
+
end
|
165
|
+
|
166
|
+
module InstanceMethods
|
167
|
+
# Set both lat and lon and recalibrate in the one go
|
168
|
+
def set_and_calibrate(_lat, _lon)
|
169
|
+
self.lat = _lat
|
170
|
+
self.lon = _lon
|
171
|
+
calibrate
|
172
|
+
end
|
173
|
+
|
174
|
+
# Pre-calculate the various terms of the Great Circle Distance Formula
|
175
|
+
#
|
176
|
+
# Tillless::Location::RADIUS_OF_EARTH * # Radius of Earth in KM
|
177
|
+
# acos[
|
178
|
+
# sin(lat1/57.2958) * # term1
|
179
|
+
# sin(lat2/57.2958) + # term2
|
180
|
+
# cos(lat1/57.2958) * # term3
|
181
|
+
# cos(lat2/57.2958) * # term4
|
182
|
+
# cos(
|
183
|
+
# lon2/57.2958 - # term5
|
184
|
+
# lon1/57.2958) # term6
|
185
|
+
# ]
|
186
|
+
def calibrate
|
187
|
+
self.term1 = Math.sin(self.lat/Tillless::Location::GREAT_CIRCLE_FACTOR)
|
188
|
+
self.term2 = Math.sin(self.lat/Tillless::Location::GREAT_CIRCLE_FACTOR)
|
189
|
+
self.term3 = Math.cos(self.lat/Tillless::Location::GREAT_CIRCLE_FACTOR)
|
190
|
+
self.term4 = Math.cos(self.lat/Tillless::Location::GREAT_CIRCLE_FACTOR)
|
191
|
+
self.term5 = self.lon/Tillless::Location::GREAT_CIRCLE_FACTOR
|
192
|
+
self.term6 = self.lon/Tillless::Location::GREAT_CIRCLE_FACTOR
|
193
|
+
self.calibrated = true
|
194
|
+
end
|
195
|
+
|
196
|
+
# Calculate the great circle distance between this GeoLocation
|
197
|
+
# and the specified other location. This uses the formula specified
|
198
|
+
# here: http://www.meridianworlddata.com/Distance-Calculation.asp
|
199
|
+
#
|
200
|
+
# The formula used to calculate the Great Circle Distance is:
|
201
|
+
#
|
202
|
+
# RADIUS_OF_EARTH * acos[sin(lat1/57.2958) * sin(lat2/57.2958) + cos(lat1/57.2958) * cos(lat2/57.2958) * cos(lon2/57.2958 - lon1/57.2958)]
|
203
|
+
#
|
204
|
+
# Where: lat1/lon1 is the lat and lon of this Location, and lat2/lon2 is the lat and lon of the other location.
|
205
|
+
#
|
206
|
+
# :otherloc location to compare with
|
207
|
+
# return great circle distance from here to otherloc
|
208
|
+
# raises LocationCalibrationException if either self or otherloc are not calibrated
|
209
|
+
#
|
210
|
+
def great_circle_distance_from_here_to(otherloc)
|
211
|
+
raise Tillless::Location::LocationCalibrationException if ! (self.calibrated and otherloc.calibrated)
|
212
|
+
stage1 = self.term1 * otherloc.term2 +
|
213
|
+
self.term3 * otherloc.term4 *
|
214
|
+
Math.cos(self.term5 - otherloc.term6)
|
215
|
+
# fix floating point roudning error that manifests in ActiveRecord and Postgres
|
216
|
+
stage1 = stage1.round if stage1 < -1 or stage1 > 1
|
217
|
+
Tillless::Location::RADIUS_OF_EARTH * Math.acos(stage1)
|
218
|
+
end
|
219
|
+
|
220
|
+
# Test to see if the specified location is near this one, where
|
221
|
+
# 'near' means within 100 meters.
|
222
|
+
#
|
223
|
+
# :otherloc location to check
|
224
|
+
# :min_distance minimum distance for which to be considered 'nearby', default = Tillless::Location::MIN_DISTANCE_FOR_NEARBY_IN_KM
|
225
|
+
# return true if the specified location is near this one
|
226
|
+
# raises LocationCalibrationException if either self or otherloc are not calibrated
|
227
|
+
#
|
228
|
+
def nearby?(otherloc, min_distance = Tillless::Location::MIN_DISTANCE_FOR_NEARBY_IN_KM)
|
229
|
+
raise Tillless::Location::LocationCalibrationException if ! (self.calibrated and otherloc.calibrated)
|
230
|
+
( (great_circle_distance_from_here_to(otherloc) - min_distance) <= 0.0)
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# /tillless/server/tillless-core/spec/spec_helper.rb
|
2
|
+
|
3
|
+
require 'tillless-core'
|
4
|
+
|
5
|
+
|
6
|
+
RSpec.configure do |config|
|
7
|
+
# Use color in STDOUT
|
8
|
+
config.color_enabled = true
|
9
|
+
|
10
|
+
# Use color not only in STDOUT but also in pagers and files
|
11
|
+
config.tty = true
|
12
|
+
|
13
|
+
# Use the specified formatter
|
14
|
+
# config.formatter = :documentation # :documentation, :progress, :html, :textmate
|
15
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
# tillless-core/spec/tillless-core/location_spec.rb
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module Tillless
|
6
|
+
describe Location do
|
7
|
+
|
8
|
+
before(:all) do
|
9
|
+
# 127 Talga Road Rothbury NSW Australia
|
10
|
+
@talgard_lat = -32.73075
|
11
|
+
@talgard_lon = 151.37991
|
12
|
+
|
13
|
+
# North Sydney Post Office, North Sydney NSW Australia
|
14
|
+
@northsydpo_lat = -33.8384945
|
15
|
+
@northsydpo_lon = 151.2064807
|
16
|
+
|
17
|
+
# 2/10 Holdsworth Street Neutral Bay NSW Australia
|
18
|
+
@holdsworthst_lat = -33.838236
|
19
|
+
@holdsworthst_lon = 151.214478
|
20
|
+
|
21
|
+
# 34 Ryan Street Lilyfield NSW 2040 Australia
|
22
|
+
@ryanst_lat = -33.870203
|
23
|
+
@ryanst_lon = 151.167256
|
24
|
+
|
25
|
+
class MockLocation
|
26
|
+
include Location
|
27
|
+
# Create a new MockLocation
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
before(:each) do
|
32
|
+
@talgard = MockLocation.new(lat: @talgard_lat, lon: @talgard_lon)
|
33
|
+
@northsydpo = MockLocation.new(lat: @northsydpo_lat, lon: @northsydpo_lon)
|
34
|
+
@holdsworthst = MockLocation.new(lat: @holdsworthst_lat, lon: @holdsworthst_lon)
|
35
|
+
@ryanst = MockLocation.new(lat: @ryanst_lat, lon: @ryanst_lon)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should have lattitude and longitude' do
|
39
|
+
@talgard.lat.should_not be nil
|
40
|
+
@talgard.lon.should_not be nil
|
41
|
+
@northsydpo.lat.should_not be nil
|
42
|
+
@northsydpo.lon.should_not be nil
|
43
|
+
@holdsworthst.lat.should_not be nil
|
44
|
+
@holdsworthst.lon.should_not be nil
|
45
|
+
@ryanst.lat.should_not be nil
|
46
|
+
@ryanst.lon.should_not be nil
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should be !calibrated if lat and/or lon change' do
|
50
|
+
@loc1 = MockLocation.new(lat: @talgard_lat, lon: @talgard_lon)
|
51
|
+
@loc1.lat = @holdsworthst_lat
|
52
|
+
@loc1.calibrated.should be false
|
53
|
+
@loc1.calibrate
|
54
|
+
@loc1.calibrated.should be true
|
55
|
+
@loc1.lon = @holdsworthst_lon
|
56
|
+
@loc1.calibrated.should be false
|
57
|
+
@loc1.calibrate
|
58
|
+
@loc1.calibrated.should be true
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should be calibrated if lat/lon set via set_and_calibrate' do
|
62
|
+
@loc1 = MockLocation.new(lat: @talgard_lat, lon: @talgard_lon)
|
63
|
+
@loc1.calibrated.should be true
|
64
|
+
@loc1.set_and_calibrate(@holdsworthst_lat, @holdsworthst_lon)
|
65
|
+
@loc1.calibrated.should be true
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should raise an exception if nearby? used on uncalibrated locations' do
|
69
|
+
@loc1 = MockLocation.new(lat: @talgard_lat, lon: @talgard_lon)
|
70
|
+
@loc1.lat = @holdsworthst_lat
|
71
|
+
@loc1.calibrated.should be false
|
72
|
+
expect { @loc1.nearby?(nil) }.to raise_error(Tillless::Location::LocationCalibrationException)
|
73
|
+
@loc1.calibrate
|
74
|
+
@loc1.lon = @holdsworthst_lon
|
75
|
+
@loc1.calibrated.should be false
|
76
|
+
expect { @loc1.nearby?(nil) }.to raise_error(Tillless::Location::LocationCalibrationException)
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'should raise an exception if great_circle_distance_from_here_to used on uncalibrated locations' do
|
80
|
+
@loc1 = MockLocation.new(lat: @talgard_lat, lon: @talgard_lon)
|
81
|
+
@loc1.lat = @holdsworthst_lat
|
82
|
+
@loc1.calibrated.should be false
|
83
|
+
expect { @loc1.great_circle_distance_from_here_to(nil) }.to raise_error(Tillless::Location::LocationCalibrationException)
|
84
|
+
@loc1.calibrate
|
85
|
+
@loc1.lon = @holdsworthst_lon
|
86
|
+
@loc1.calibrated.should be false
|
87
|
+
expect { @loc1.great_circle_distance_from_here_to(nil) }.to raise_error(Tillless::Location::LocationCalibrationException)
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'should be nearby if lat/lon are identical' do
|
91
|
+
@loc1 = MockLocation.new(lat: @talgard_lat, lon: @talgard_lon)
|
92
|
+
@loc2 = MockLocation.new(lat: @talgard_lat, lon: @talgard_lon)
|
93
|
+
@loc1.lat.should == @loc2.lat
|
94
|
+
@loc2.lat.should == @loc1.lat
|
95
|
+
@loc1.lon.should == @loc2.lon
|
96
|
+
@loc2.lon.should == @loc1.lon
|
97
|
+
@loc1.nearby?(@loc2).should == true
|
98
|
+
@loc2.nearby?(@loc1).should == true
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'should not be nearby if lat/lon are different' do
|
102
|
+
@loc1 = MockLocation.new(lat: @talgard_lat, lon: @talgard_lon)
|
103
|
+
@loc2 = MockLocation.new(lat: @holdsworthst_lat, lon: @holdsworthst_lon)
|
104
|
+
@loc1.lat.should_not eq(@loc2.lat)
|
105
|
+
@loc2.lat.should_not eq(@loc1.lat)
|
106
|
+
@loc1.lon.should_not eq(@loc2.lon)
|
107
|
+
@loc2.lon.should_not eq(@loc1.lon)
|
108
|
+
@loc1.nearby?(@loc2).should == false
|
109
|
+
@loc2.nearby?(@loc1).should == false
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'should be nearby if loc within min_distance for nearby?' do
|
113
|
+
@loc1 = MockLocation.new(lat: @talgard_lat, lon: @talgard_lon)
|
114
|
+
@loc2 = MockLocation.new(lat: @holdsworthst_lat, lon: @holdsworthst_lon)
|
115
|
+
distance1 = @loc1.great_circle_distance_from_here_to(@loc2)
|
116
|
+
distance2 = @loc2.great_circle_distance_from_here_to(@loc1)
|
117
|
+
distance1.should == distance2
|
118
|
+
distance2.should == distance1
|
119
|
+
@loc1.nearby?(@loc2, distance1+1).should == true
|
120
|
+
@loc2.nearby?(@loc1, distance1+1).should == true
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'should not be nearby if loc greater than min_distance for nearby?' do
|
124
|
+
@loc1 = MockLocation.new(lat: @talgard_lat, lon: @talgard_lon)
|
125
|
+
@loc2 = MockLocation.new(lat: @holdsworthst_lat, lon: @holdsworthst_lon)
|
126
|
+
distance1 = @loc1.great_circle_distance_from_here_to(@loc2)
|
127
|
+
distance2 = @loc2.great_circle_distance_from_here_to(@loc1)
|
128
|
+
distance1.should == distance2
|
129
|
+
distance2.should == distance1
|
130
|
+
@loc1.nearby?(@loc2, distance1-1).should == false
|
131
|
+
@loc2.nearby?(@loc1, distance1-1).should == false
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
135
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/tillless-core/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Matthew Sinclair", "Jason Elston"]
|
6
|
+
gem.email = ["info@tillless.com"]
|
7
|
+
gem.description = %q{Tillless utilities}
|
8
|
+
gem.summary = %q{Gem for core utilities used across Tillless}
|
9
|
+
gem.homepage = ""
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "tillless-core"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Tillless::VERSION
|
17
|
+
|
18
|
+
gem.add_development_dependency 'rspec', '~> 2'
|
19
|
+
gem.add_development_dependency 'factory_girl', '~> 4.1.0'
|
20
|
+
gem.add_development_dependency 'rb-fsevent', '~> 0.9.1'
|
21
|
+
gem.add_development_dependency 'guard-rspec'
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tillless-core
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Matthew Sinclair
|
9
|
+
- Jason Elston
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2013-02-17 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rspec
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '2'
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ~>
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '2'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: factory_girl
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ~>
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: 4.1.0
|
39
|
+
type: :development
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 4.1.0
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rb-fsevent
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.9.1
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ~>
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 0.9.1
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: guard-rspec
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
description: Tillless utilities
|
80
|
+
email:
|
81
|
+
- info@tillless.com
|
82
|
+
executables: []
|
83
|
+
extensions: []
|
84
|
+
extra_rdoc_files: []
|
85
|
+
files:
|
86
|
+
- .gitignore
|
87
|
+
- Gemfile
|
88
|
+
- Guardfile
|
89
|
+
- README.md
|
90
|
+
- Rakefile
|
91
|
+
- lib/tillless-core.rb
|
92
|
+
- lib/tillless-core/location.rb
|
93
|
+
- lib/tillless-core/version.rb
|
94
|
+
- spec/spec_helper.rb
|
95
|
+
- spec/tillless-core/location_spec.rb
|
96
|
+
- tillless-core.gemspec
|
97
|
+
homepage: ''
|
98
|
+
licenses: []
|
99
|
+
post_install_message:
|
100
|
+
rdoc_options: []
|
101
|
+
require_paths:
|
102
|
+
- lib
|
103
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
104
|
+
none: false
|
105
|
+
requirements:
|
106
|
+
- - ! '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
none: false
|
111
|
+
requirements:
|
112
|
+
- - ! '>='
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
requirements: []
|
116
|
+
rubyforge_project:
|
117
|
+
rubygems_version: 1.8.23
|
118
|
+
signing_key:
|
119
|
+
specification_version: 3
|
120
|
+
summary: Gem for core utilities used across Tillless
|
121
|
+
test_files:
|
122
|
+
- spec/spec_helper.rb
|
123
|
+
- spec/tillless-core/location_spec.rb
|
124
|
+
has_rdoc:
|