remotedroid 0.1.1 → 0.4.2
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/remotedroid.rb +455 -9
- metadata +6 -6
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6bd8aa94326f04e26626c2919060c259afea85c5e89f6ae33de505d0af5381b6
|
4
|
+
data.tar.gz: efbb77b568cc56a821569021dfd6a1c4001645a0019d0d3d56445a3f31887737
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68ca84c69885979de74d5265b216808dba934f63854978ffde5e48a49458f88e3483294f555f36685b1a5cc44b2309b285870228c5eb63ca3759b0e41eb7b752
|
7
|
+
data.tar.gz: ba2aa7d3d3fbf3512b3cfdbd55aa7442499355c3110bcfed6b92a5da516f4a4e39eb3ff8eff6fba5f3702aeb739562d2bde777c31e2c0ce6a9a9581287fda93f
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/remotedroid.rb
CHANGED
@@ -22,6 +22,10 @@ require 'ruby-macrodroid'
|
|
22
22
|
#
|
23
23
|
# # Actions
|
24
24
|
#
|
25
|
+
## Connectivity
|
26
|
+
#
|
27
|
+
# * Enable HotSpot
|
28
|
+
#
|
25
29
|
# ## Date/Time
|
26
30
|
#
|
27
31
|
# * Say Current Time
|
@@ -30,11 +34,70 @@ require 'ruby-macrodroid'
|
|
30
34
|
#
|
31
35
|
# * Speak text
|
32
36
|
# * Torch toggle
|
37
|
+
# * vibrate
|
38
|
+
#
|
39
|
+
# ## Location
|
40
|
+
#
|
41
|
+
# * Share Location
|
42
|
+
#
|
43
|
+
# ## Media
|
44
|
+
#
|
45
|
+
# * Play sound (Doda)
|
33
46
|
#
|
34
47
|
# ## Notification
|
48
|
+
#
|
35
49
|
# * Popup Message
|
50
|
+
#
|
51
|
+
# ## Screen
|
52
|
+
#
|
53
|
+
# * Screen On
|
54
|
+
#
|
36
55
|
|
37
|
-
|
56
|
+
# Variables which can be queried
|
57
|
+
#
|
58
|
+
# Description Variable
|
59
|
+
# ------------------- ----------------
|
60
|
+
# Foreground app name :fg_app_name
|
61
|
+
# Foreground app package :fg_app_package
|
62
|
+
# Current Brightness :current_brightness
|
63
|
+
# Screen timeout (seconds) :screen_timeout
|
64
|
+
# Current battery % :battery
|
65
|
+
# Battery temp °C :battery_temp
|
66
|
+
# Power (On/Off) :power
|
67
|
+
# Clipboard text :clipboard
|
68
|
+
# Current IP address :ip
|
69
|
+
# Wifi SSID :ssid
|
70
|
+
# Wifi signal strength :wifi_strength
|
71
|
+
# System time :system_time
|
72
|
+
# IMEI :imei
|
73
|
+
# Cell Id :cell_id
|
74
|
+
# Last known location (lat,lon) :last_loc_latlong
|
75
|
+
# Last known location (altitude) :last_loc_alt
|
76
|
+
# Last known location (link) :last_loc_link
|
77
|
+
# Last known location (time) :last_loc_age_timestamp
|
78
|
+
# Last known location (kmh) :last_loc_speed_kmh
|
79
|
+
# Last known location (mph) :last_loc_speed_mph
|
80
|
+
# Current Volume (Alarm) :vol_alarm
|
81
|
+
# Current Volume (Media / Music) :vol_music
|
82
|
+
# Current Volume (Ringer) :vol_ring
|
83
|
+
# Current Volume (Notification) :vol_notif
|
84
|
+
# Current Volume (System Sounds) :vol_system
|
85
|
+
# Current Volume (Voice Call) :vol_call
|
86
|
+
# Current Volume (Bluetooth Voice) :vol_bt_voice
|
87
|
+
# Device name :device_name
|
88
|
+
# Device uptime :uptime_secs
|
89
|
+
# Device manufacturer :device_manufacturer
|
90
|
+
# Device model :device_model
|
91
|
+
# Android version :android_version
|
92
|
+
# Android version (SDK Level) :android_version_sdk
|
93
|
+
# Storage total (external) :storage_external_total
|
94
|
+
# Storage free (external) :storage_external_free
|
95
|
+
# Storage total (internal) :storage_internal_total
|
96
|
+
# Storage free (internal) :storage_internal_free
|
97
|
+
|
98
|
+
|
99
|
+
# The macros below are exported to JSON format as a file which is imported into
|
100
|
+
# the Android device running MacroDroid.
|
38
101
|
|
39
102
|
RD_MACROS =<<EOF
|
40
103
|
m: Camera flash light
|
@@ -61,6 +124,90 @@ v: text
|
|
61
124
|
t: webhook
|
62
125
|
a: speak text ([lv=text])
|
63
126
|
|
127
|
+
m: vibrate
|
128
|
+
t: webhook
|
129
|
+
a: vibrate
|
130
|
+
|
131
|
+
m: play doda
|
132
|
+
t: webhook
|
133
|
+
a: play: Doda
|
134
|
+
|
135
|
+
m: Screen
|
136
|
+
v: on: false
|
137
|
+
t: WebHook
|
138
|
+
a:
|
139
|
+
If on = True
|
140
|
+
Screen On
|
141
|
+
Else
|
142
|
+
Screen Off
|
143
|
+
End If
|
144
|
+
|
145
|
+
m: Hotspot
|
146
|
+
v: enable: false
|
147
|
+
t: WebHook
|
148
|
+
a:
|
149
|
+
If enable = True
|
150
|
+
Enable Hotspot
|
151
|
+
Else
|
152
|
+
Disable Hotspot
|
153
|
+
End If
|
154
|
+
|
155
|
+
|
156
|
+
m: Share location
|
157
|
+
t:
|
158
|
+
WebHook
|
159
|
+
identifier: location
|
160
|
+
a: Force Location Update
|
161
|
+
a:
|
162
|
+
Share Location
|
163
|
+
coords
|
164
|
+
a:
|
165
|
+
HTTP GET
|
166
|
+
identifier: location
|
167
|
+
coords: [lv=coords]
|
168
|
+
type: query
|
169
|
+
|
170
|
+
m: query
|
171
|
+
t: WebHook
|
172
|
+
v: qvar
|
173
|
+
a:
|
174
|
+
Set Variable
|
175
|
+
var: [[lv=qvar]]
|
176
|
+
a:
|
177
|
+
HTTP GET
|
178
|
+
[lv=qvar]: [lv=var]
|
179
|
+
|
180
|
+
m: query setting system
|
181
|
+
t: WebHook
|
182
|
+
v: qvar
|
183
|
+
a:
|
184
|
+
Set Variable
|
185
|
+
var: [setting_system=[lv=qvar]]
|
186
|
+
a:
|
187
|
+
HTTP GET
|
188
|
+
[lv=qvar]: [lv=var]
|
189
|
+
|
190
|
+
m: query setting global
|
191
|
+
t: WebHook
|
192
|
+
v: qvar
|
193
|
+
a:
|
194
|
+
Set Variable
|
195
|
+
var: [setting_global=[lv=qvar]]
|
196
|
+
a:
|
197
|
+
HTTP GET
|
198
|
+
[lv=qvar]: [lv=var]
|
199
|
+
|
200
|
+
m: query setting secure
|
201
|
+
t: WebHook
|
202
|
+
v: qvar
|
203
|
+
a:
|
204
|
+
Set Variable
|
205
|
+
var: [setting_secure=[lv=qvar]]
|
206
|
+
a:
|
207
|
+
HTTP GET
|
208
|
+
[lv=qvar]: [lv=var]
|
209
|
+
|
210
|
+
|
64
211
|
m: shake device
|
65
212
|
t: shake device
|
66
213
|
a: webhook
|
@@ -71,9 +218,27 @@ a:
|
|
71
218
|
webhook
|
72
219
|
identifier: proximity
|
73
220
|
option: 0
|
221
|
+
|
222
|
+
m: Power connected
|
223
|
+
t: Power Connected: Any
|
224
|
+
a: webhook
|
225
|
+
|
74
226
|
|
75
227
|
EOF
|
76
228
|
|
229
|
+
=begin
|
230
|
+
m: Screen
|
231
|
+
v: on: true
|
232
|
+
t: WebHook
|
233
|
+
a:
|
234
|
+
If on = true
|
235
|
+
Screen On
|
236
|
+
Else
|
237
|
+
Screen Off
|
238
|
+
End If
|
239
|
+
|
240
|
+
=end
|
241
|
+
|
77
242
|
module RemoteDroid
|
78
243
|
|
79
244
|
class Model
|
@@ -304,7 +469,7 @@ module RemoteDroid
|
|
304
469
|
class Controller
|
305
470
|
|
306
471
|
attr_reader :model, :control
|
307
|
-
attr_accessor :title, :macros
|
472
|
+
attr_accessor :title, :macros, :store
|
308
473
|
|
309
474
|
def initialize(mcs, model=MODEL, deviceid: nil, debug: false)
|
310
475
|
|
@@ -317,6 +482,9 @@ module RemoteDroid
|
|
317
482
|
if model then
|
318
483
|
@model = Model.new(model)
|
319
484
|
end
|
485
|
+
|
486
|
+
@store = {}
|
487
|
+
@query = Query.new(self)
|
320
488
|
|
321
489
|
end
|
322
490
|
|
@@ -325,7 +493,12 @@ module RemoteDroid
|
|
325
493
|
end
|
326
494
|
|
327
495
|
def invoke(name, options={})
|
328
|
-
|
496
|
+
|
497
|
+
if @control.respond_to? name.to_sym then
|
498
|
+
@control.method(name.to_sym).call(options)
|
499
|
+
else
|
500
|
+
@control.http_exec name.to_sym, options
|
501
|
+
end
|
329
502
|
end
|
330
503
|
|
331
504
|
# Object Property (op)
|
@@ -336,6 +509,49 @@ module RemoteDroid
|
|
336
509
|
@model.op
|
337
510
|
end
|
338
511
|
|
512
|
+
def query(id=nil)
|
513
|
+
|
514
|
+
return @query unless id
|
515
|
+
|
516
|
+
@store[id] = nil
|
517
|
+
|
518
|
+
sys = %i(accelerometer_rotation)
|
519
|
+
|
520
|
+
global = [:airplane_mode_on, :bluetooth_on, :cell_on, :device_name, \
|
521
|
+
:usb_mass_storage_enabled, :wifi_on]
|
522
|
+
|
523
|
+
secure = %i(bluetooth_name flashlight_enabled)
|
524
|
+
|
525
|
+
|
526
|
+
# send http request via macrodroid.com API
|
527
|
+
|
528
|
+
if id.downcase.to_sym == :location then
|
529
|
+
@control.http_exec id
|
530
|
+
elsif sys.include? id
|
531
|
+
@control.http_exec :'query-setting-system', {qvar: id}
|
532
|
+
elsif global.include? id
|
533
|
+
@control.http_exec :'query-setting-global', {qvar: id}
|
534
|
+
elsif secure.include? id
|
535
|
+
@control.http_exec :'query-setting-secure', {qvar: id}
|
536
|
+
else
|
537
|
+
@control.http_exec :query, {qvar: id}
|
538
|
+
end
|
539
|
+
|
540
|
+
# wait for the local variable to be updated
|
541
|
+
# timeout after 5 seoncds
|
542
|
+
t = Time.now
|
543
|
+
|
544
|
+
begin
|
545
|
+
sleep 1
|
546
|
+
end until @store[id] or Time.now > t + 5
|
547
|
+
|
548
|
+
return {warning: 'HTTP response timeout'} if Time.now > t+5
|
549
|
+
|
550
|
+
return @store[id]
|
551
|
+
|
552
|
+
|
553
|
+
end
|
554
|
+
|
339
555
|
def request(s)
|
340
556
|
@model.request s
|
341
557
|
end
|
@@ -369,6 +585,12 @@ module RemoteDroid
|
|
369
585
|
end
|
370
586
|
|
371
587
|
alias trigger_fired trigger
|
588
|
+
|
589
|
+
def update(id, val)
|
590
|
+
key = id == :location ? id : val.keys.first.to_sym
|
591
|
+
@store[key] = val
|
592
|
+
end
|
593
|
+
|
372
594
|
|
373
595
|
end
|
374
596
|
|
@@ -398,6 +620,13 @@ module RemoteDroid
|
|
398
620
|
end
|
399
621
|
|
400
622
|
end
|
623
|
+
|
624
|
+
class ControlHelper
|
625
|
+
|
626
|
+
def initialize(callback)
|
627
|
+
@callback
|
628
|
+
end
|
629
|
+
end
|
401
630
|
|
402
631
|
class Control
|
403
632
|
|
@@ -405,7 +634,7 @@ module RemoteDroid
|
|
405
634
|
|
406
635
|
@deviceid, @remote_url, @debug = deviceid, remote_url, debug
|
407
636
|
@torch = Torch.new(self)
|
408
|
-
end
|
637
|
+
end
|
409
638
|
|
410
639
|
def bluetooth()
|
411
640
|
@bluetooth
|
@@ -414,6 +643,33 @@ module RemoteDroid
|
|
414
643
|
def camera_flash_light(options={})
|
415
644
|
http_exec 'camera-flash-light', options
|
416
645
|
end
|
646
|
+
|
647
|
+
def hotspot(state=nil)
|
648
|
+
|
649
|
+
if state then
|
650
|
+
http_exec 'hotspot', {enable: state == :enable}
|
651
|
+
else
|
652
|
+
|
653
|
+
def self.enable()
|
654
|
+
http_exec 'hotspot', {enable: true}
|
655
|
+
end
|
656
|
+
|
657
|
+
def self.on()
|
658
|
+
self.enable
|
659
|
+
end
|
660
|
+
|
661
|
+
def self.disable()
|
662
|
+
http_exec 'hotspot', {enable: false}
|
663
|
+
end
|
664
|
+
|
665
|
+
def self.off()
|
666
|
+
self.disable
|
667
|
+
end
|
668
|
+
|
669
|
+
self
|
670
|
+
|
671
|
+
end
|
672
|
+
end
|
417
673
|
|
418
674
|
def http_exec(command, options={})
|
419
675
|
|
@@ -429,16 +685,53 @@ module RemoteDroid
|
|
429
685
|
|
430
686
|
end
|
431
687
|
|
688
|
+
def location(options={})
|
689
|
+
http_exec 'location'
|
690
|
+
end
|
691
|
+
|
432
692
|
def say_current_time(options={})
|
433
693
|
http_exec 'say-current-time'
|
434
694
|
end
|
435
695
|
|
436
696
|
alias say_time say_current_time
|
437
697
|
|
438
|
-
def
|
698
|
+
def screen(state=nil)
|
699
|
+
|
700
|
+
if state then
|
701
|
+
http_exec 'screen', {on: state == :on}
|
702
|
+
else
|
703
|
+
|
704
|
+
def self.on()
|
705
|
+
http_exec 'screen', {on: true}
|
706
|
+
end
|
707
|
+
|
708
|
+
def self.off()
|
709
|
+
http_exec 'screen', {on: false}
|
710
|
+
end
|
711
|
+
|
712
|
+
self
|
713
|
+
|
714
|
+
end
|
715
|
+
end
|
716
|
+
|
717
|
+
def share_location(options={})
|
718
|
+
http_exec 'share-location'
|
719
|
+
end
|
720
|
+
|
721
|
+
def speak_text(obj)
|
722
|
+
|
723
|
+
options = case obj
|
724
|
+
when String
|
725
|
+
{text: obj}
|
726
|
+
when Hash
|
727
|
+
obj
|
728
|
+
end
|
729
|
+
|
439
730
|
http_exec 'speak-text', options
|
440
731
|
end
|
441
732
|
|
733
|
+
alias say speak_text
|
734
|
+
|
442
735
|
def toast(options={})
|
443
736
|
http_exec :toast, options
|
444
737
|
end
|
@@ -446,6 +739,11 @@ module RemoteDroid
|
|
446
739
|
def torch(options={})
|
447
740
|
http_exec :torch
|
448
741
|
end
|
742
|
+
|
743
|
+
def vibrate(options={})
|
744
|
+
http_exec :vibrate
|
745
|
+
end
|
746
|
+
|
449
747
|
|
450
748
|
def write(s)
|
451
749
|
|
@@ -456,12 +754,55 @@ module RemoteDroid
|
|
456
754
|
|
457
755
|
alias export write
|
458
756
|
|
459
|
-
def
|
757
|
+
def method_missing2(method_name, *args)
|
460
758
|
http_exec(method_name, args.first)
|
461
759
|
end
|
462
760
|
|
463
761
|
end
|
464
762
|
|
763
|
+
class Query
|
764
|
+
|
765
|
+
def initialize(callback)
|
766
|
+
@callback = callback
|
767
|
+
end
|
768
|
+
|
769
|
+
def airplane_mode_enabled?()
|
770
|
+
q(:airplane_mode_on).to_i > 0
|
771
|
+
end
|
772
|
+
|
773
|
+
def battery()
|
774
|
+
q(:battery).to_i
|
775
|
+
end
|
776
|
+
|
777
|
+
def current_brightness()
|
778
|
+
q(:current_brightness).to_i
|
779
|
+
end
|
780
|
+
|
781
|
+
alias brightness current_brightness
|
782
|
+
|
783
|
+
def cell_id()
|
784
|
+
q(:cell_id)
|
785
|
+
end
|
786
|
+
|
787
|
+
alias cell_tower cell_id
|
788
|
+
|
789
|
+
def ip()
|
790
|
+
q(:ip)
|
791
|
+
end
|
792
|
+
|
793
|
+
def location()
|
794
|
+
@callback.query(:location)[:coords]
|
795
|
+
end
|
796
|
+
|
797
|
+
|
798
|
+
private
|
799
|
+
|
800
|
+
def q(id)
|
801
|
+
@callback.query(id)[id]
|
802
|
+
end
|
803
|
+
|
804
|
+
end
|
805
|
+
|
465
806
|
class Server
|
466
807
|
|
467
808
|
def initialize(s, drb_host: '127.0.0.1', deviceid: nil)
|
@@ -478,10 +819,95 @@ module RemoteDroid
|
|
478
819
|
|
479
820
|
end
|
480
821
|
|
822
|
+
class Client
|
823
|
+
|
824
|
+
def initialize(host='127.0.0.1')
|
825
|
+
@drb = OneDrb::Client.new host: host, port: '5777'
|
826
|
+
end
|
827
|
+
|
828
|
+
def control
|
829
|
+
@drb.control
|
830
|
+
end
|
831
|
+
|
832
|
+
def export(s)
|
833
|
+
@drb.export(s)
|
834
|
+
end
|
835
|
+
|
836
|
+
def invoke(s, *args)
|
837
|
+
@drb.invoke(s, *args)
|
838
|
+
end
|
839
|
+
|
840
|
+
def query(id=nil)
|
841
|
+
|
842
|
+
return @drb.query unless id
|
843
|
+
t = Time.now
|
844
|
+
h = @drb.query(id)
|
845
|
+
h.merge({latency: (Time.now - t).round(3)})
|
846
|
+
|
847
|
+
end
|
848
|
+
|
849
|
+
def update(key, val)
|
850
|
+
@drb.update key.to_sym, val
|
851
|
+
end
|
852
|
+
|
853
|
+
def store()
|
854
|
+
@drb.store
|
855
|
+
end
|
856
|
+
|
857
|
+
# -- helpful methods -----------------
|
858
|
+
|
859
|
+
def battery()
|
860
|
+
query.battery
|
861
|
+
end
|
862
|
+
|
863
|
+
def cell_tower()
|
864
|
+
query.cell_tower
|
865
|
+
end
|
866
|
+
|
867
|
+
def hotspot(state=nil)
|
868
|
+
control.hotspot state
|
869
|
+
end
|
870
|
+
|
871
|
+
def location()
|
872
|
+
query.location
|
873
|
+
end
|
874
|
+
|
875
|
+
def say(text)
|
876
|
+
control.speak_text text
|
877
|
+
end
|
878
|
+
|
879
|
+
def say_time()
|
880
|
+
control.say_time
|
881
|
+
end
|
882
|
+
|
883
|
+
alias saytime say_time
|
884
|
+
|
885
|
+
def screen(state=nil)
|
886
|
+
control.screen state
|
887
|
+
end
|
888
|
+
|
889
|
+
def screen_on()
|
890
|
+
screen :on
|
891
|
+
end
|
892
|
+
|
893
|
+
def screen_off()
|
894
|
+
screen :off
|
895
|
+
end
|
896
|
+
|
897
|
+
def torch()
|
898
|
+
control.torch
|
899
|
+
end
|
900
|
+
|
901
|
+
def vibrate
|
902
|
+
control.vibrate
|
903
|
+
end
|
904
|
+
|
905
|
+
end
|
906
|
+
|
481
907
|
class TriggerSubscriber < SPSSub
|
482
908
|
|
483
909
|
def initialize(host: 'sps.home', drb_host: '127.0.0.1')
|
484
|
-
@remote = OneDrb::Client.new host: drb_host, port: '5777'
|
910
|
+
@remote = OneDrb::Client.new host: drb_host, port: '5777'
|
485
911
|
super(host: host)
|
486
912
|
end
|
487
913
|
|
@@ -502,7 +928,7 @@ module RemoteDroid
|
|
502
928
|
class ActionSubscriber < SPSSub
|
503
929
|
|
504
930
|
def initialize(host: 'sps.home', drb_host: '127.0.0.1')
|
505
|
-
@remote = OneDrb::Client.new host: drb_host, port: '5777'
|
931
|
+
@remote = OneDrb::Client.new host: drb_host, port: '5777'
|
506
932
|
super(host: host)
|
507
933
|
end
|
508
934
|
|
@@ -521,5 +947,25 @@ module RemoteDroid
|
|
521
947
|
|
522
948
|
end
|
523
949
|
|
524
|
-
|
950
|
+
class ResponseSubscriber < SPSSub
|
951
|
+
|
952
|
+
def initialize(host: 'sps.home', drb_host: '127.0.0.1')
|
953
|
+
@remote = OneDrb::Client.new host: drb_host, port: '5777'
|
954
|
+
super(host: host)
|
955
|
+
end
|
956
|
+
|
957
|
+
def subscribe(topic: 'macrodroid/response')
|
958
|
+
|
959
|
+
super(topic: topic) do |msg|
|
960
|
+
|
961
|
+
json, id = msg.split(/:\s+/,2).reverse
|
962
|
+
h = JSON.parse(json, symbolize_names: true)
|
963
|
+
id ||= h.keys.first
|
964
|
+
@remote.update id.to_sym, h
|
965
|
+
|
966
|
+
end
|
967
|
+
|
968
|
+
end
|
969
|
+
|
970
|
+
end
|
525
971
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: remotedroid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Robertson
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
io3WPRDjULC924M5S8wbrus31v2AUjqFBPvmHr7caf/VHErWypV482xcDhWt1eif
|
36
36
|
0G2k2ptozXcBS9odsqGUTb5N
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date: 2020-10-
|
38
|
+
date: 2020-10-14 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: onedrb
|
@@ -103,20 +103,20 @@ dependencies:
|
|
103
103
|
requirements:
|
104
104
|
- - "~>"
|
105
105
|
- !ruby/object:Gem::Version
|
106
|
-
version: '0.
|
106
|
+
version: '0.9'
|
107
107
|
- - ">="
|
108
108
|
- !ruby/object:Gem::Version
|
109
|
-
version: 0.
|
109
|
+
version: 0.9.7
|
110
110
|
type: :runtime
|
111
111
|
prerelease: false
|
112
112
|
version_requirements: !ruby/object:Gem::Requirement
|
113
113
|
requirements:
|
114
114
|
- - "~>"
|
115
115
|
- !ruby/object:Gem::Version
|
116
|
-
version: '0.
|
116
|
+
version: '0.9'
|
117
117
|
- - ">="
|
118
118
|
- !ruby/object:Gem::Version
|
119
|
-
version: 0.
|
119
|
+
version: 0.9.7
|
120
120
|
description:
|
121
121
|
email: james@jamesrobertson.eu
|
122
122
|
executables: []
|
metadata.gz.sig
CHANGED
Binary file
|