remotedroid 0.1.0 → 0.4.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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/remotedroid.rb +474 -11
- 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: dd7b7c4614e48123ecdc155abc68d996445d62d997df99dc65fe2969b9260c79
|
4
|
+
data.tar.gz: a4de25cf022d6bdaacc221f9b986a0244e1ea8b5faad38f151713825417b004c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0467d4f2441f460e6428ba1457637643fc707ec1f6c4aeb66e15f7d8cc75f2fec4284915d3b5f0bd3ea1b7fc9818305ed4a54b00fc07913ec5d01746b73d1ad4
|
7
|
+
data.tar.gz: 385c2c1d6b7a78954eadf6c01d03382cfe16986ac27c218fc1a8ac01e2350d814df6de0909bd0c084e1e36cc53398cd974bc9c49537dc24f51ea9d98621f5067
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/remotedroid.rb
CHANGED
@@ -9,8 +9,97 @@ require 'sps-sub'
|
|
9
9
|
require 'ruby-macrodroid'
|
10
10
|
|
11
11
|
|
12
|
+
# Here's what's available so far:
|
13
|
+
#
|
14
|
+
# # Triggers
|
15
|
+
#
|
16
|
+
# ## Sensors
|
17
|
+
#
|
18
|
+
# * proximity (near)
|
19
|
+
# * shake device
|
20
|
+
#
|
21
|
+
# ------------------------------------
|
22
|
+
#
|
23
|
+
# # Actions
|
24
|
+
#
|
25
|
+
# ## Date/Time
|
26
|
+
#
|
27
|
+
# * Say Current Time
|
28
|
+
#
|
29
|
+
# ## Device Actions
|
30
|
+
#
|
31
|
+
# * Speak text
|
32
|
+
# * Torch toggle
|
33
|
+
# * vibrate
|
34
|
+
#
|
35
|
+
# ## Location
|
36
|
+
#
|
37
|
+
# * Share Location
|
38
|
+
#
|
39
|
+
# ## Media
|
40
|
+
#
|
41
|
+
# * Play sound (Doda)
|
42
|
+
#
|
43
|
+
# ## Notification
|
44
|
+
#
|
45
|
+
# * Popup Message
|
46
|
+
#
|
47
|
+
# ## Screen
|
48
|
+
#
|
49
|
+
# * Screen On
|
50
|
+
#
|
51
|
+
|
52
|
+
# Variables which can be queried
|
53
|
+
#
|
54
|
+
# Description Variable
|
55
|
+
# ------------------- ----------------
|
56
|
+
# Foreground app name :fg_app_name
|
57
|
+
# Foreground app package :fg_app_package
|
58
|
+
# Current Brightness :current_brightness
|
59
|
+
# Screen timeout (seconds) :screen_timeout
|
60
|
+
# Current battery % :battery
|
61
|
+
# Battery temp °C :battery_temp
|
62
|
+
# Power (On/Off) :power
|
63
|
+
# Clipboard text :clipboard
|
64
|
+
# Current IP address :ip
|
65
|
+
# Wifi SSID :ssid
|
66
|
+
# Wifi signal strength :wifi_strength
|
67
|
+
# System time :system_time
|
68
|
+
# IMEI :imei
|
69
|
+
# Cell Id :cell_id
|
70
|
+
# Last known location (lat,lon) :last_loc_latlong
|
71
|
+
# Last known location (altitude) :last_loc_alt
|
72
|
+
# Last known location (link) :last_loc_link
|
73
|
+
# Last known location (time) :last_loc_age_timestamp
|
74
|
+
# Last known location (kmh) :last_loc_speed_kmh
|
75
|
+
# Last known location (mph) :last_loc_speed_mph
|
76
|
+
# Current Volume (Alarm) :vol_alarm
|
77
|
+
# Current Volume (Media / Music) :vol_music
|
78
|
+
# Current Volume (Ringer) :vol_ring
|
79
|
+
# Current Volume (Notification) :vol_notif
|
80
|
+
# Current Volume (System Sounds) :vol_system
|
81
|
+
# Current Volume (Voice Call) :vol_call
|
82
|
+
# Current Volume (Bluetooth Voice) :vol_bt_voice
|
83
|
+
# Device name :device_name
|
84
|
+
# Device uptime :uptime_secs
|
85
|
+
# Device manufacturer :device_manufacturer
|
86
|
+
# Device model :device_model
|
87
|
+
# Android version :android_version
|
88
|
+
# Android version (SDK Level) :android_version_sdk
|
89
|
+
# Storage total (external) :storage_external_total
|
90
|
+
# Storage free (external) :storage_external_free
|
91
|
+
# Storage total (internal) :storage_internal_total
|
92
|
+
# Storage free (internal) :storage_internal_free
|
93
|
+
|
94
|
+
|
95
|
+
# The macros below are exported to JSON format as a file which is imported into
|
96
|
+
# the Android device running MacroDroid.
|
12
97
|
|
13
98
|
RD_MACROS =<<EOF
|
99
|
+
m: Camera flash light
|
100
|
+
t: webhook
|
101
|
+
a: Torch toggle
|
102
|
+
|
14
103
|
m: Torch
|
15
104
|
t: webhook
|
16
105
|
a: Torch toggle
|
@@ -22,11 +111,119 @@ a:
|
|
22
111
|
Popup Message
|
23
112
|
[lv=msg]
|
24
113
|
|
114
|
+
m: Say current time
|
115
|
+
t: webhook
|
116
|
+
a: Say Current Time
|
117
|
+
|
118
|
+
m: Speak text
|
119
|
+
v: text
|
120
|
+
t: webhook
|
121
|
+
a: speak text ([lv=text])
|
122
|
+
|
123
|
+
m: vibrate
|
124
|
+
t: webhook
|
125
|
+
a: vibrate
|
126
|
+
|
127
|
+
m: play doda
|
128
|
+
t: webhook
|
129
|
+
a: play: Doda
|
130
|
+
|
131
|
+
m: Screen
|
132
|
+
v: on: false
|
133
|
+
t: WebHook
|
134
|
+
a:
|
135
|
+
If on = True
|
136
|
+
Screen On
|
137
|
+
Else
|
138
|
+
Screen Off
|
139
|
+
End If
|
140
|
+
|
141
|
+
m: Share location
|
142
|
+
t:
|
143
|
+
WebHook
|
144
|
+
identifier: location
|
145
|
+
a: Force Location Update
|
146
|
+
a:
|
147
|
+
Share Location
|
148
|
+
coords
|
149
|
+
a:
|
150
|
+
HTTP GET
|
151
|
+
identifier: location
|
152
|
+
coords: [lv=coords]
|
153
|
+
type: query
|
154
|
+
|
155
|
+
m: query
|
156
|
+
t: WebHook
|
157
|
+
v: qvar
|
158
|
+
a:
|
159
|
+
Set Variable
|
160
|
+
var: [[lv=qvar]]
|
161
|
+
a:
|
162
|
+
HTTP GET
|
163
|
+
[lv=qvar]: [lv=var]
|
164
|
+
|
165
|
+
m: query setting system
|
166
|
+
t: WebHook
|
167
|
+
v: qvar
|
168
|
+
a:
|
169
|
+
Set Variable
|
170
|
+
var: [setting_system=[lv=qvar]]
|
171
|
+
a:
|
172
|
+
HTTP GET
|
173
|
+
[lv=qvar]: [lv=var]
|
174
|
+
|
175
|
+
m: query setting global
|
176
|
+
t: WebHook
|
177
|
+
v: qvar
|
178
|
+
a:
|
179
|
+
Set Variable
|
180
|
+
var: [setting_global=[lv=qvar]]
|
181
|
+
a:
|
182
|
+
HTTP GET
|
183
|
+
[lv=qvar]: [lv=var]
|
184
|
+
|
185
|
+
m: query setting secure
|
186
|
+
t: WebHook
|
187
|
+
v: qvar
|
188
|
+
a:
|
189
|
+
Set Variable
|
190
|
+
var: [setting_secure=[lv=qvar]]
|
191
|
+
a:
|
192
|
+
HTTP GET
|
193
|
+
[lv=qvar]: [lv=var]
|
194
|
+
|
195
|
+
|
25
196
|
m: shake device
|
26
197
|
t: shake device
|
27
198
|
a: webhook
|
199
|
+
|
200
|
+
m: Proximity near
|
201
|
+
t: Proximity near
|
202
|
+
a:
|
203
|
+
webhook
|
204
|
+
identifier: proximity
|
205
|
+
option: 0
|
206
|
+
|
207
|
+
m: Power connected
|
208
|
+
t: Power Connected: Any
|
209
|
+
a: webhook
|
210
|
+
|
211
|
+
|
28
212
|
EOF
|
29
213
|
|
214
|
+
=begin
|
215
|
+
m: Screen
|
216
|
+
v: on: true
|
217
|
+
t: WebHook
|
218
|
+
a:
|
219
|
+
If on = true
|
220
|
+
Screen On
|
221
|
+
Else
|
222
|
+
Screen Off
|
223
|
+
End If
|
224
|
+
|
225
|
+
=end
|
226
|
+
|
30
227
|
module RemoteDroid
|
31
228
|
|
32
229
|
class Model
|
@@ -257,7 +454,7 @@ module RemoteDroid
|
|
257
454
|
class Controller
|
258
455
|
|
259
456
|
attr_reader :model, :control
|
260
|
-
attr_accessor :title, :macros
|
457
|
+
attr_accessor :title, :macros, :store
|
261
458
|
|
262
459
|
def initialize(mcs, model=MODEL, deviceid: nil, debug: false)
|
263
460
|
|
@@ -270,12 +467,24 @@ module RemoteDroid
|
|
270
467
|
if model then
|
271
468
|
@model = Model.new(model)
|
272
469
|
end
|
470
|
+
|
471
|
+
@store = {}
|
472
|
+
@query = Query.new(self)
|
273
473
|
|
274
474
|
end
|
275
475
|
|
276
476
|
def export(s)
|
277
477
|
@macros = MacroDroid.new(s).macros
|
278
478
|
end
|
479
|
+
|
480
|
+
def invoke(name, options={})
|
481
|
+
|
482
|
+
if @control.respond_to? name.to_sym then
|
483
|
+
@control.method(name.to_sym).call(options)
|
484
|
+
else
|
485
|
+
@control.http_exec name.to_sym, options
|
486
|
+
end
|
487
|
+
end
|
279
488
|
|
280
489
|
# Object Property (op)
|
281
490
|
# Helpful for accessing properites in dot notation
|
@@ -285,6 +494,49 @@ module RemoteDroid
|
|
285
494
|
@model.op
|
286
495
|
end
|
287
496
|
|
497
|
+
def query(id=nil)
|
498
|
+
|
499
|
+
return @query unless id
|
500
|
+
|
501
|
+
@store[id] = nil
|
502
|
+
|
503
|
+
sys = %i(accelerometer_rotation)
|
504
|
+
|
505
|
+
global = [:airplane_mode_on, :bluetooth_on, :cell_on, :device_name, \
|
506
|
+
:usb_mass_storage_enabled, :wifi_on]
|
507
|
+
|
508
|
+
secure = %i(bluetooth_name flashlight_enabled)
|
509
|
+
|
510
|
+
|
511
|
+
# send http request via macrodroid.com API
|
512
|
+
|
513
|
+
if id.downcase.to_sym == :location then
|
514
|
+
@control.http_exec id
|
515
|
+
elsif sys.include? id
|
516
|
+
@control.http_exec :'query-setting-system', {qvar: id}
|
517
|
+
elsif global.include? id
|
518
|
+
@control.http_exec :'query-setting-global', {qvar: id}
|
519
|
+
elsif secure.include? id
|
520
|
+
@control.http_exec :'query-setting-secure', {qvar: id}
|
521
|
+
else
|
522
|
+
@control.http_exec :query, {qvar: id}
|
523
|
+
end
|
524
|
+
|
525
|
+
# wait for the local variable to be updated
|
526
|
+
# timeout after 5 seoncds
|
527
|
+
t = Time.now
|
528
|
+
|
529
|
+
begin
|
530
|
+
sleep 1
|
531
|
+
end until @store[id] or Time.now > t + 5
|
532
|
+
|
533
|
+
return {warning: 'HTTP response timeout'} if Time.now > t+5
|
534
|
+
|
535
|
+
return @store[id]
|
536
|
+
|
537
|
+
|
538
|
+
end
|
539
|
+
|
288
540
|
def request(s)
|
289
541
|
@model.request s
|
290
542
|
end
|
@@ -318,6 +570,12 @@ module RemoteDroid
|
|
318
570
|
end
|
319
571
|
|
320
572
|
alias trigger_fired trigger
|
573
|
+
|
574
|
+
def update(id, val)
|
575
|
+
key = id == :location ? id : val.keys.first.to_sym
|
576
|
+
@store[key] = val
|
577
|
+
end
|
578
|
+
|
321
579
|
|
322
580
|
end
|
323
581
|
|
@@ -347,6 +605,13 @@ module RemoteDroid
|
|
347
605
|
end
|
348
606
|
|
349
607
|
end
|
608
|
+
|
609
|
+
class ControlHelper
|
610
|
+
|
611
|
+
def initialize(callback)
|
612
|
+
@callback
|
613
|
+
end
|
614
|
+
end
|
350
615
|
|
351
616
|
class Control
|
352
617
|
|
@@ -354,16 +619,19 @@ module RemoteDroid
|
|
354
619
|
|
355
620
|
@deviceid, @remote_url, @debug = deviceid, remote_url, debug
|
356
621
|
@torch = Torch.new(self)
|
357
|
-
end
|
622
|
+
end
|
358
623
|
|
359
624
|
def bluetooth()
|
360
625
|
@bluetooth
|
361
626
|
end
|
362
627
|
|
628
|
+
def camera_flash_light(options={})
|
629
|
+
http_exec 'camera-flash-light', options
|
630
|
+
end
|
631
|
+
|
363
632
|
def http_exec(command, options={})
|
364
633
|
|
365
634
|
url = "https://trigger.macrodroid.com/%s/%s" % [@deviceid, command]
|
366
|
-
File.write '/tmp/foo.txt', 'url : ' + url.inspect #if @debug
|
367
635
|
|
368
636
|
if options and options.any? then
|
369
637
|
h = options
|
@@ -375,13 +643,65 @@ module RemoteDroid
|
|
375
643
|
|
376
644
|
end
|
377
645
|
|
646
|
+
def location(options={})
|
647
|
+
http_exec 'location'
|
648
|
+
end
|
649
|
+
|
650
|
+
def say_current_time(options={})
|
651
|
+
http_exec 'say-current-time'
|
652
|
+
end
|
653
|
+
|
654
|
+
alias say_time say_current_time
|
655
|
+
|
656
|
+
def screen(state=nil)
|
657
|
+
|
658
|
+
if state then
|
659
|
+
http_exec 'screen', {on: state == :on}
|
660
|
+
else
|
661
|
+
|
662
|
+
def self.on()
|
663
|
+
http_exec 'screen', {on: true}
|
664
|
+
end
|
665
|
+
|
666
|
+
def self.off()
|
667
|
+
http_exec 'screen', {on: false}
|
668
|
+
end
|
669
|
+
|
670
|
+
self
|
671
|
+
|
672
|
+
end
|
673
|
+
end
|
674
|
+
|
675
|
+
def share_location(options={})
|
676
|
+
http_exec 'share-location'
|
677
|
+
end
|
678
|
+
|
679
|
+
def speak_text(obj)
|
680
|
+
|
681
|
+
options = case obj
|
682
|
+
when String
|
683
|
+
{text: obj}
|
684
|
+
when Hash
|
685
|
+
obj
|
686
|
+
end
|
687
|
+
|
688
|
+
http_exec 'speak-text', options
|
689
|
+
end
|
690
|
+
|
691
|
+
alias say speak_text
|
692
|
+
|
378
693
|
def toast(options={})
|
379
|
-
http_exec
|
694
|
+
http_exec :toast, options
|
380
695
|
end
|
381
696
|
|
382
|
-
def torch()
|
383
|
-
|
697
|
+
def torch(options={})
|
698
|
+
http_exec :torch
|
384
699
|
end
|
700
|
+
|
701
|
+
def vibrate(options={})
|
702
|
+
http_exec :vibrate
|
703
|
+
end
|
704
|
+
|
385
705
|
|
386
706
|
def write(s)
|
387
707
|
|
@@ -392,12 +712,55 @@ module RemoteDroid
|
|
392
712
|
|
393
713
|
alias export write
|
394
714
|
|
395
|
-
def
|
715
|
+
def method_missing2(method_name, *args)
|
396
716
|
http_exec(method_name, args.first)
|
397
717
|
end
|
398
718
|
|
399
719
|
end
|
400
720
|
|
721
|
+
class Query
|
722
|
+
|
723
|
+
def initialize(callback)
|
724
|
+
@callback = callback
|
725
|
+
end
|
726
|
+
|
727
|
+
def airplane_mode_enabled?()
|
728
|
+
q(:airplane_mode_on).to_i > 0
|
729
|
+
end
|
730
|
+
|
731
|
+
def battery()
|
732
|
+
q(:battery).to_i
|
733
|
+
end
|
734
|
+
|
735
|
+
def current_brightness()
|
736
|
+
q(:current_brightness).to_i
|
737
|
+
end
|
738
|
+
|
739
|
+
alias brightness current_brightness
|
740
|
+
|
741
|
+
def cell_id()
|
742
|
+
q(:cell_id)
|
743
|
+
end
|
744
|
+
|
745
|
+
alias cell_tower cell_id
|
746
|
+
|
747
|
+
def ip()
|
748
|
+
q(:ip)
|
749
|
+
end
|
750
|
+
|
751
|
+
def location()
|
752
|
+
@callback.query(:location)[:coords]
|
753
|
+
end
|
754
|
+
|
755
|
+
|
756
|
+
private
|
757
|
+
|
758
|
+
def q(id)
|
759
|
+
@callback.query(id)[id]
|
760
|
+
end
|
761
|
+
|
762
|
+
end
|
763
|
+
|
401
764
|
class Server
|
402
765
|
|
403
766
|
def initialize(s, drb_host: '127.0.0.1', deviceid: nil)
|
@@ -414,10 +777,91 @@ module RemoteDroid
|
|
414
777
|
|
415
778
|
end
|
416
779
|
|
780
|
+
class Client
|
781
|
+
|
782
|
+
def initialize(host='127.0.0.1')
|
783
|
+
@drb = OneDrb::Client.new host: host, port: '5777'
|
784
|
+
end
|
785
|
+
|
786
|
+
def control
|
787
|
+
@drb.control
|
788
|
+
end
|
789
|
+
|
790
|
+
def export(s)
|
791
|
+
@drb.export(s)
|
792
|
+
end
|
793
|
+
|
794
|
+
def invoke(s, *args)
|
795
|
+
@drb.invoke(s, *args)
|
796
|
+
end
|
797
|
+
|
798
|
+
def query(id=nil)
|
799
|
+
|
800
|
+
return @drb.query unless id
|
801
|
+
t = Time.now
|
802
|
+
h = @drb.query(id)
|
803
|
+
h.merge({latency: (Time.now - t).round(3)})
|
804
|
+
|
805
|
+
end
|
806
|
+
|
807
|
+
def update(key, val)
|
808
|
+
@drb.update key.to_sym, val
|
809
|
+
end
|
810
|
+
|
811
|
+
def store()
|
812
|
+
@drb.store
|
813
|
+
end
|
814
|
+
|
815
|
+
# -- helpful methods -----------------
|
816
|
+
|
817
|
+
def battery()
|
818
|
+
query.battery
|
819
|
+
end
|
820
|
+
|
821
|
+
def cell_tower()
|
822
|
+
query.cell_tower
|
823
|
+
end
|
824
|
+
|
825
|
+
def location()
|
826
|
+
query.location
|
827
|
+
end
|
828
|
+
|
829
|
+
def say(text)
|
830
|
+
control.say text
|
831
|
+
end
|
832
|
+
|
833
|
+
def say_time()
|
834
|
+
control.say_time
|
835
|
+
end
|
836
|
+
|
837
|
+
alias saytime say_time
|
838
|
+
|
839
|
+
def screen(state=nil)
|
840
|
+
control.screen state
|
841
|
+
end
|
842
|
+
|
843
|
+
def screen_on()
|
844
|
+
screen :on
|
845
|
+
end
|
846
|
+
|
847
|
+
def screen_off()
|
848
|
+
screen :off
|
849
|
+
end
|
850
|
+
|
851
|
+
def torch()
|
852
|
+
control.torch
|
853
|
+
end
|
854
|
+
|
855
|
+
def vibrate
|
856
|
+
control.vibrate
|
857
|
+
end
|
858
|
+
|
859
|
+
end
|
860
|
+
|
417
861
|
class TriggerSubscriber < SPSSub
|
418
862
|
|
419
863
|
def initialize(host: 'sps.home', drb_host: '127.0.0.1')
|
420
|
-
@remote = OneDrb::Client.new host: drb_host, port: '5777'
|
864
|
+
@remote = OneDrb::Client.new host: drb_host, port: '5777'
|
421
865
|
super(host: host)
|
422
866
|
end
|
423
867
|
|
@@ -438,7 +882,7 @@ module RemoteDroid
|
|
438
882
|
class ActionSubscriber < SPSSub
|
439
883
|
|
440
884
|
def initialize(host: 'sps.home', drb_host: '127.0.0.1')
|
441
|
-
@remote = OneDrb::Client.new host: drb_host, port: '5777'
|
885
|
+
@remote = OneDrb::Client.new host: drb_host, port: '5777'
|
442
886
|
super(host: host)
|
443
887
|
end
|
444
888
|
|
@@ -457,6 +901,25 @@ module RemoteDroid
|
|
457
901
|
|
458
902
|
end
|
459
903
|
|
460
|
-
|
904
|
+
class ResponseSubscriber < SPSSub
|
905
|
+
|
906
|
+
def initialize(host: 'sps.home', drb_host: '127.0.0.1')
|
907
|
+
@remote = OneDrb::Client.new host: drb_host, port: '5777'
|
908
|
+
super(host: host)
|
909
|
+
end
|
910
|
+
|
911
|
+
def subscribe(topic: 'macrodroid/response')
|
912
|
+
|
913
|
+
super(topic: topic) do |msg|
|
914
|
+
|
915
|
+
json, id = msg.split(/:\s+/,2).reverse
|
916
|
+
h = JSON.parse(json, symbolize_names: true)
|
917
|
+
id ||= h.keys.first
|
918
|
+
@remote.update id.to_sym, h
|
919
|
+
|
920
|
+
end
|
921
|
+
|
922
|
+
end
|
923
|
+
|
924
|
+
end
|
461
925
|
end
|
462
|
-
|
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.1
|
4
|
+
version: 0.4.1
|
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-13 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.5
|
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.5
|
120
120
|
description:
|
121
121
|
email: james@jamesrobertson.eu
|
122
122
|
executables: []
|
metadata.gz.sig
CHANGED
Binary file
|