tillless-core 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in tillless-core.gemspec
4
+ gemspec
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,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -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
+
@@ -0,0 +1,3 @@
1
+ module Tillless
2
+ VERSION = "0.0.1"
3
+ end
@@ -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: