tillless-core 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/.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: