motion-beacon 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.
- checksums.yaml +7 -0
- data/.gitignore +21 -0
- data/.repl_history +0 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +12 -0
- data/LICENSE.txt +22 -0
- data/README.md +34 -0
- data/Rakefile +12 -0
- data/app/app_delegate.rb +37 -0
- data/lib/motion-beacon/beaconmanager.rb +315 -0
- data/lib/motion-beacon/clbeaconregion.rb +47 -0
- data/lib/motion-beacon/version.rb +5 -0
- data/lib/motion-beacon.rb +9 -0
- data/motion-beacon.gemspec +18 -0
- metadata +71 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 09750b5492cc2c3e8fb72d58ae99a90c246265ea
|
4
|
+
data.tar.gz: 3a9920655fdbece2c6d2be36d405e56f6ccebab8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e4c9318ccd291aa94a7272c2af1b4ec9c060f17ab318dc6f402a28763706f9143d4afdcd1bf206eb39f77660bc9e10fe2f91f738b0a3a4c9bf618533acbaf5ab
|
7
|
+
data.tar.gz: 1974bd9fc9192bcb423bdc54b1c1cfa07c584e7e04c94c3f83842cc6c58c3f6d4edef77e9cd9056f168e1cca59129607ebe86fea5178dc3ae67eb902acff4fe7
|
data/.gitignore
ADDED
data/.repl_history
ADDED
File without changes
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Vaclav Samec
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# MotionBeacon
|
2
|
+
|
3
|
+
|
4
|
+
## Installation
|
5
|
+
|
6
|
+
Add this line to your application's Gemfile:
|
7
|
+
|
8
|
+
gem 'motion-beaon'
|
9
|
+
|
10
|
+
And then execute:
|
11
|
+
|
12
|
+
$ bundle
|
13
|
+
|
14
|
+
Or install it yourself as:
|
15
|
+
|
16
|
+
$ gem install motion-beacon
|
17
|
+
|
18
|
+
## Usage
|
19
|
+
|
20
|
+
Inlcude MotionBeacon module in your app_delegate.rb:
|
21
|
+
|
22
|
+
include MotionBeacon
|
23
|
+
|
24
|
+
Once MotionBeacon module is included, you can start using it:
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
## Contributing
|
29
|
+
|
30
|
+
1. Fork it
|
31
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
32
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
33
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
34
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
$:.unshift("/Library/RubyMotion/lib")
|
3
|
+
require 'motion/project/template/ios'
|
4
|
+
require 'bundler'
|
5
|
+
require 'sugarcube-timer'
|
6
|
+
|
7
|
+
$:.unshift("./lib/")
|
8
|
+
require './lib/motion-beacon'
|
9
|
+
|
10
|
+
Motion::Project::App.setup do |app|
|
11
|
+
app.frameworks += ['CoreLocation']
|
12
|
+
end
|
data/app/app_delegate.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
include SugarCube::Timer
|
2
|
+
|
3
|
+
class AppDelegate
|
4
|
+
def application(application, didFinishLaunchingWithOptions:launchOptions)
|
5
|
+
|
6
|
+
after 2.sec do
|
7
|
+
|
8
|
+
@beaconManager = BeaconManager.new('E2C56DB5-DFFB-48D2-B060-D0F5A71096E0', 'com.codium.iBeaconsDemo')
|
9
|
+
|
10
|
+
@beaconManager.createRegion(major: 0, minor: 1)
|
11
|
+
@beaconManager.startRangingBeacons(major: 0, minor: 1)
|
12
|
+
@beaconManager.createRegion(major: 0, minor: 2)
|
13
|
+
@beaconManager.startRangingBeacons(major: 0, minor: 2)
|
14
|
+
|
15
|
+
@beaconManager.onEnterRegion { |region|
|
16
|
+
|
17
|
+
NSLog("Region entered: #{region.to_s}")
|
18
|
+
}
|
19
|
+
|
20
|
+
@beaconManager.onLeaveRegion { |region|
|
21
|
+
NSLog("Region leaved: " + region.to_s)
|
22
|
+
}
|
23
|
+
|
24
|
+
@beaconManager.onChangeRegion { |oldRegion, newRegion|
|
25
|
+
NSLog("Region change, old: [#{oldRegion.to_s}] new: [#{newRegion}]")
|
26
|
+
}
|
27
|
+
|
28
|
+
@beaconManager.onLostRegions {
|
29
|
+
NSLog("Regions lost")
|
30
|
+
}
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,315 @@
|
|
1
|
+
include SugarCube::Timer
|
2
|
+
|
3
|
+
# wrapper over CLLocationManager and CLBeaconRegion
|
4
|
+
class BeaconManager
|
5
|
+
|
6
|
+
# the unique ID of the beacons being targeted
|
7
|
+
attr_reader :proximityUUID
|
8
|
+
|
9
|
+
# unique identifier to all your beacons for using in your application
|
10
|
+
# @example
|
11
|
+
# com.company.beaconsApp
|
12
|
+
attr_reader :beaconID
|
13
|
+
|
14
|
+
# timeout for deactivating regions in [ms]
|
15
|
+
REGION_TIMEOUT = 2000
|
16
|
+
|
17
|
+
# tick update timeout in [ms]
|
18
|
+
UPDATE_TIMEOUT = 500
|
19
|
+
|
20
|
+
# initialize BeaconManager with a proximity ID of beacons being targeted and application beacon ID
|
21
|
+
# @example
|
22
|
+
# beaconManager = BeaconManager.new('E2C56DB5-DFFB-48D2-B060-D0F5A71096E0',
|
23
|
+
# 'com.company.beacons')
|
24
|
+
def initialize(proximityUUID, beaconID)
|
25
|
+
@locationManager = CLLocationManager.alloc.init
|
26
|
+
@locationManager.delegate = self
|
27
|
+
|
28
|
+
@proximityUUID = if proximityUUID.is_a? NSUUID then
|
29
|
+
id
|
30
|
+
elsif proximityUUID.is_a? String then
|
31
|
+
NSUUID.alloc.initWithUUIDString(proximityUUID)
|
32
|
+
else
|
33
|
+
raise 'Invalid Beacon proximity UUID!'
|
34
|
+
end
|
35
|
+
|
36
|
+
@beaconID = if beaconID.is_a? String then
|
37
|
+
beaconID
|
38
|
+
else
|
39
|
+
raise 'Invalid Beacon app ID!'
|
40
|
+
end
|
41
|
+
|
42
|
+
@regions = []
|
43
|
+
@activeRegions = []
|
44
|
+
@activeRegion = nil
|
45
|
+
@callbacks = Hash.new { |hash, key| hash[key] = [] }
|
46
|
+
|
47
|
+
every UPDATE_TIMEOUT.millisec do
|
48
|
+
self.onTimer
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# create a beacon region that targets beacons with specified major value and minor value
|
53
|
+
# @example
|
54
|
+
# createRegion(major: 0, minor: 1)
|
55
|
+
def createRegion(options = {})
|
56
|
+
|
57
|
+
minor = options.fetch(:minor, nil)
|
58
|
+
major = options.fetch(:major, nil)
|
59
|
+
|
60
|
+
id = @beaconID;
|
61
|
+
if not major.nil?
|
62
|
+
id = id + ':' + if minor.nil? then major.to_s else minor.to_s end
|
63
|
+
end
|
64
|
+
|
65
|
+
region = if major.nil? then
|
66
|
+
CLBeaconRegion.alloc.initWithProximityUUID(@proximityUUID, identifier: id)
|
67
|
+
elsif minor.nil? then
|
68
|
+
CLBeaconRegion.alloc.initWithProximityUUID(@proximityUUID, major: major, identifier: id)
|
69
|
+
else
|
70
|
+
CLBeaconRegion.alloc.initWithProximityUUID(@proximityUUID, major: major, minor: minor, identifier: id)
|
71
|
+
end
|
72
|
+
|
73
|
+
region.notifyOnEntry = true
|
74
|
+
region.notifyOnExit = true
|
75
|
+
region.notifyEntryStateOnDisplay = true
|
76
|
+
|
77
|
+
@regions.push(region)
|
78
|
+
end
|
79
|
+
|
80
|
+
# advertise this device as a beacon
|
81
|
+
def advertiseSelf(major, minor)
|
82
|
+
end
|
83
|
+
|
84
|
+
# start the delivery of notifications for beacons in the specified region
|
85
|
+
# @example
|
86
|
+
# startRangingBeacons(:major = 0, :minor = 1)
|
87
|
+
# startRangingBeacons(:major = 0)
|
88
|
+
# startRangingBeacons
|
89
|
+
def startRangingBeacons(options = {})
|
90
|
+
major = options.fetch(:major, nil)
|
91
|
+
minor = options.fetch(:minor, nil)
|
92
|
+
|
93
|
+
regions = findRegions(major, minor)
|
94
|
+
|
95
|
+
regions.each { |region|
|
96
|
+
@locationManager.startRangingBeaconsInRegion(region)
|
97
|
+
}
|
98
|
+
end
|
99
|
+
|
100
|
+
# stops the delivery of notifications for the specified beacon regions
|
101
|
+
# @example
|
102
|
+
# stopRangingBeacons(:major = 0, :minor = 1)
|
103
|
+
# stopRangingBeacons(:major = 0)
|
104
|
+
# stopRangingBeacons
|
105
|
+
def stopRangingBeacons(options = {})
|
106
|
+
major = options.fetch(:major, nil)
|
107
|
+
minor = options.fetch(:minor, nil)
|
108
|
+
|
109
|
+
regions = findRegions(major, minor)
|
110
|
+
|
111
|
+
regions.each { |region|
|
112
|
+
@locationManager.stopRangingBeacons(region)
|
113
|
+
}
|
114
|
+
end
|
115
|
+
|
116
|
+
# add event handler for detection of entering the beacon region
|
117
|
+
# @example
|
118
|
+
# onEnterRegion { my_code }
|
119
|
+
# onEnterRegion(:major = 0) { |region| my_code }
|
120
|
+
# onEnterRegion(:major = 0, :minor = 1) { my_code }
|
121
|
+
def onEnterRegion(options = {}, &block)
|
122
|
+
major = options.fetch(:major, nil)
|
123
|
+
minor = options.fetch(:minor, nil)
|
124
|
+
|
125
|
+
key = CallbackKey.new(major, minor, :enter)
|
126
|
+
@callbacks[key].push(block.weak!)
|
127
|
+
end
|
128
|
+
|
129
|
+
# add event handler for detection of leaving the beacon region
|
130
|
+
# @example
|
131
|
+
# onLeaveRegion { my_code }
|
132
|
+
# onLeaveRegion(:major = 0) { |region| my_code }
|
133
|
+
# onLeaveRegion(:major = 0, :minor = 1) { my_code }
|
134
|
+
def onLeaveRegion(options = {}, &block)
|
135
|
+
major = options.fetch(:major, nil)
|
136
|
+
minor = options.fetch(:minor, nil)
|
137
|
+
|
138
|
+
key = CallbackKey.new(major, minor, :leave)
|
139
|
+
@callbacks[key].push(block.weak!)
|
140
|
+
end
|
141
|
+
|
142
|
+
# add event handler for detection of changing the region
|
143
|
+
# @example
|
144
|
+
# onChangeRegion { |oldRegion, newRegion| my_code }
|
145
|
+
def onChangeRegion(&block)
|
146
|
+
key = CallbackKey.new(0, 0, :change)
|
147
|
+
@callbacks[key].push(block.weak!)
|
148
|
+
end
|
149
|
+
|
150
|
+
# add event handler for detection of loosing any regions
|
151
|
+
# this is called when there are no close regions in range
|
152
|
+
# @example
|
153
|
+
# onLostRegions { my_code }
|
154
|
+
def onLostRegions(&block)
|
155
|
+
key = CallbackKey.new(0, 0, :lost)
|
156
|
+
@callbacks[key].push(block.weak!)
|
157
|
+
end
|
158
|
+
|
159
|
+
private
|
160
|
+
CallbackKey = Struct.new(:major, :minor, :type)
|
161
|
+
|
162
|
+
|
163
|
+
protected
|
164
|
+
def onTimer
|
165
|
+
@activeRegions.each { |region|
|
166
|
+
region.timeout += UPDATE_TIMEOUT
|
167
|
+
}
|
168
|
+
|
169
|
+
# if @activeRegions.count > 0 then
|
170
|
+
# NSLog("onTimer.timeout: " + @activeRegions[0].timeout.to_s)
|
171
|
+
# end
|
172
|
+
|
173
|
+
@activeRegions.delete_if { |region| region.timeout > REGION_TIMEOUT }
|
174
|
+
|
175
|
+
self.updateRegions
|
176
|
+
end
|
177
|
+
|
178
|
+
protected
|
179
|
+
def updateRegions
|
180
|
+
if not @activeRegions.empty? then
|
181
|
+
|
182
|
+
# if @activeRegions.count > 1 then
|
183
|
+
# NSLog("region0: #{@activeRegions[0].distance.to_s} region1: #{@activeRegions[1].distance.to_s}")
|
184
|
+
# end
|
185
|
+
|
186
|
+
sorted = @activeRegions.sort { |a, b| a.distance <=> b.distance }
|
187
|
+
|
188
|
+
if sorted[0] != @activeRegion then
|
189
|
+
if not @activeRegion.nil? then
|
190
|
+
regionLeaved(@activeRegion)
|
191
|
+
end
|
192
|
+
regionChanged(@activeRegion, sorted[0])
|
193
|
+
@activeRegion = sorted[0]
|
194
|
+
regionEntered(@activeRegion)
|
195
|
+
end
|
196
|
+
|
197
|
+
elsif not @activeRegion.nil? then
|
198
|
+
self.regionLeaved(@activeRegion)
|
199
|
+
self.regionChanged(@activeRegion, nil)
|
200
|
+
@activeRegion = nil
|
201
|
+
self.regionsLost
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
def regionEntered(region)
|
206
|
+
# NSLog("regionEntered: callbacks: #{@callbacks.count.to_s}")
|
207
|
+
@callbacks.each { |key, value|
|
208
|
+
|
209
|
+
if (key.type == :enter) and
|
210
|
+
((key.major.nil?) or
|
211
|
+
(key.minor.nil? and key.major == region.major) or
|
212
|
+
(region.major == key.major and region.minor == key.minor) or
|
213
|
+
(region.hasBeacon?(key.major, key.minor))) then
|
214
|
+
|
215
|
+
if not value[0].nil? then
|
216
|
+
value[0].call(region)
|
217
|
+
end
|
218
|
+
end
|
219
|
+
}
|
220
|
+
|
221
|
+
end
|
222
|
+
|
223
|
+
def regionLeaved(region)
|
224
|
+
# NSLog("onRegionLeav: callbacks: #{@callbacks.count.to_s}")
|
225
|
+
@callbacks.each { |key, value|
|
226
|
+
|
227
|
+
if (key.type == :leave) and
|
228
|
+
((key.major.nil?) or
|
229
|
+
(key.minor.nil? and key.major == region.major) or
|
230
|
+
(region.major == key.major and region.minor == key.minor) or
|
231
|
+
(region.hasBeacon?(key.major, key.minor))) then
|
232
|
+
|
233
|
+
if not value[0].nil? then
|
234
|
+
value[0].call(region)
|
235
|
+
end
|
236
|
+
end
|
237
|
+
}
|
238
|
+
end
|
239
|
+
|
240
|
+
def regionChanged(regionOld, regionNew)
|
241
|
+
@callbacks.each { |key, value|
|
242
|
+
|
243
|
+
if key.type == :change then
|
244
|
+
|
245
|
+
if not value[0].nil? then
|
246
|
+
value[0].call(regionOld, regionNew)
|
247
|
+
end
|
248
|
+
end
|
249
|
+
}
|
250
|
+
end
|
251
|
+
|
252
|
+
def regionsLost
|
253
|
+
@callbacks.each { |key, value|
|
254
|
+
|
255
|
+
if key.type == :lost
|
256
|
+
if not value[0].nil?
|
257
|
+
value[0].call
|
258
|
+
end
|
259
|
+
end
|
260
|
+
}
|
261
|
+
end
|
262
|
+
|
263
|
+
private
|
264
|
+
|
265
|
+
def findRegions(major, minor)
|
266
|
+
regionsFound = []
|
267
|
+
|
268
|
+
if major.nil?
|
269
|
+
return @regions
|
270
|
+
end
|
271
|
+
|
272
|
+
@regions.each { |region|
|
273
|
+
if region.major == major then
|
274
|
+
if region.minor == minor or minor.nil? then
|
275
|
+
regionsFound.push(region)
|
276
|
+
end
|
277
|
+
end
|
278
|
+
}
|
279
|
+
|
280
|
+
regionsFound
|
281
|
+
end
|
282
|
+
|
283
|
+
def locationManager(locationManager, didRangeBeacons: beacons, inRegion: region)
|
284
|
+
|
285
|
+
# NSLog("didRangeBeacons: " + beacons.count.to_s + " valid: " + beaconsValid?(beacons).to_s)
|
286
|
+
|
287
|
+
if not beacons.empty? and beaconsValid?(beacons) then
|
288
|
+
|
289
|
+
# NSLog("didRangeBeacons: " + beacons.count.to_s + " valid: " + beaconsValid?(beacons).to_s)
|
290
|
+
|
291
|
+
regionIndex = @activeRegions.index(region)
|
292
|
+
|
293
|
+
if regionIndex.nil? then
|
294
|
+
region.beacons = beacons
|
295
|
+
region.timeout = 0
|
296
|
+
@activeRegions.push(region)
|
297
|
+
else
|
298
|
+
@activeRegions[regionIndex].beacons = beacons
|
299
|
+
@activeRegions[regionIndex].timeout = 0
|
300
|
+
end
|
301
|
+
|
302
|
+
self.updateRegions
|
303
|
+
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
def locationManager(locationManager, rangingBeaconsDidFailForRegion: region, withError: error)
|
308
|
+
NSLog("rangingBeaconsDidFailForRegion: " + region.to_s + " " + error.to_s)
|
309
|
+
end
|
310
|
+
|
311
|
+
def beaconsValid?(beacons)
|
312
|
+
beacons.any? { |beacon| beacon.accuracy > -1 and beacon.rssi != 0 }
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# extended BeaconRegion class with list of beacons and helper methods
|
2
|
+
class CLBeaconRegion
|
3
|
+
|
4
|
+
attr_accessor :beacons
|
5
|
+
attr_accessor :timeout
|
6
|
+
|
7
|
+
def distance
|
8
|
+
if @beacons.empty? then
|
9
|
+
return 99999
|
10
|
+
else
|
11
|
+
beaconMin = @beacons.min { |a, b| a.accuracy <=> b.accuracy }
|
12
|
+
beaconMin.accuracy
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def hasBeacon?(major, minor)
|
17
|
+
@beacons.each { |beacon|
|
18
|
+
if not major.nil? then
|
19
|
+
if minor.nil? then
|
20
|
+
if beacon.major == major then
|
21
|
+
return true
|
22
|
+
end
|
23
|
+
else
|
24
|
+
if beacon.major == major and beacon.minor == minor then
|
25
|
+
return true
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
}
|
30
|
+
false
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_s
|
34
|
+
"region: [major]: " + major.to_s +
|
35
|
+
" [minor]: " + minor.to_s
|
36
|
+
end
|
37
|
+
|
38
|
+
def printBeacons
|
39
|
+
@beacons.each { |beacon|
|
40
|
+
NSLog("beacon: [major]: " + beacon.major.to_s +
|
41
|
+
" [minor]: " + beacon.minor.to_s +
|
42
|
+
" [proximity]: " + beacon.proximity.to_s +
|
43
|
+
" [accuracy]: " + beacon.accuracy.to_s +
|
44
|
+
" [rssi]: " + beacon.rssi.to_s)
|
45
|
+
}
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
unless defined?(Motion::Project::Config)
|
2
|
+
raise "This file must be required within a RubyMotion project Rakefile."
|
3
|
+
end
|
4
|
+
|
5
|
+
Motion::Project::App.setup do |app|
|
6
|
+
Dir.glob(File.join(File.dirname(__FILE__), 'motion-beacon/*.rb')).each do |file|
|
7
|
+
app.files.unshift(file)
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/motion-beacon/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["CODIUM"]
|
6
|
+
gem.email = ["vaclav.s@codium.co"]
|
7
|
+
gem.description = "detect iBeacons with simple events"
|
8
|
+
gem.summary = "Goal of this gem is to add a simple but powerful event system for iBeacon detection."
|
9
|
+
gem.homepage = "https://bitbucket.org/vencacodium/motion-beacon"
|
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 = "motion-beacon"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Motion::Beacon::VERSION
|
17
|
+
gem.add_dependency "sugarcube-timer"
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: motion-beacon
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- CODIUM
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-01-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sugarcube-timer
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: detect iBeacons with simple events
|
28
|
+
email:
|
29
|
+
- vaclav.s@codium.co
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- .gitignore
|
35
|
+
- .repl_history
|
36
|
+
- Gemfile
|
37
|
+
- Gemfile.lock
|
38
|
+
- LICENSE.txt
|
39
|
+
- README.md
|
40
|
+
- Rakefile
|
41
|
+
- app/app_delegate.rb
|
42
|
+
- lib/motion-beacon.rb
|
43
|
+
- lib/motion-beacon/beaconmanager.rb
|
44
|
+
- lib/motion-beacon/clbeaconregion.rb
|
45
|
+
- lib/motion-beacon/version.rb
|
46
|
+
- motion-beacon.gemspec
|
47
|
+
homepage: https://bitbucket.org/vencacodium/motion-beacon
|
48
|
+
licenses: []
|
49
|
+
metadata: {}
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options: []
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - '>='
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
requirements: []
|
65
|
+
rubyforge_project:
|
66
|
+
rubygems_version: 2.0.3
|
67
|
+
signing_key:
|
68
|
+
specification_version: 4
|
69
|
+
summary: Goal of this gem is to add a simple but powerful event system for iBeacon
|
70
|
+
detection.
|
71
|
+
test_files: []
|