ruby-macrodroid 0.9.1 → 0.9.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 37e8014bb2ccd71ffd2da90197a1dd1a89c7e8e6bbbfc7ed88e9cfbff07925a1
4
- data.tar.gz: f2d4910bb6893249e33eb7c4326ea733188ecef67ec94f808cd25ef6c97760d0
3
+ metadata.gz: 652f6174d50060ca2b7e3197c2bc79062ed6af498b1982ef8c73e27b0422ad85
4
+ data.tar.gz: 86096eb1c1fef612666065e0e3d48c619b4768d801723b6beaa273687d643fec
5
5
  SHA512:
6
- metadata.gz: 06015fe764a0450838ad49b6dbebba46afc32ec49673dbf4e1bce9b07e04aaea1850153cf2c0b1d56e740dd2cbcf4653f92878ee99680d7c3f2eaacf1fffb69e
7
- data.tar.gz: df0c2950bcae690d137b294825c95579f8530fea24cabfe371809efff64343d4e9ffd71b5f2378c7938bc214dfc0e409892947ad03a86ef4438816fafa11000a
6
+ metadata.gz: f9705342b8176dc48a5bfca362a17e340bfd56f67d2eafa3b20602fa493d02cbf5a9cbfe13b2dfb02565a74bb02bf01477de6884151a659fab4500c4b2cbfea4
7
+ data.tar.gz: 6e7bae11b8cf64ff3b0efd4f852f6bb8c2e419aa8d25693aeb894dde64c063c2dbcf9abe9bddf5dbe87cb630d8fa6e6c183d105b6b71fedee804918a79467489
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -38,6 +38,8 @@ require 'rxfhelper'
38
38
  require 'chronic_cron'
39
39
 
40
40
 
41
+ # PASTE_START
42
+
41
43
  MODEL =<<EOF
42
44
  device
43
45
  connectivity
@@ -73,16 +75,16 @@ module Params
73
75
  end
74
76
 
75
77
  # turns keys from snake_case to CamelCase
76
- def to_camel_case(h=self)
78
+ def to_camelcase(h=self)
77
79
 
78
80
  h.inject({}) do |r,x|
79
81
 
80
82
  key, value = x
81
83
 
82
84
  val = if value.is_a?(Hash) then
83
- to_camel_case(value)
85
+ to_camelcase(value)
84
86
  elsif value.is_a?(Array) and value.first.is_a? Hash
85
- value.map {|row| to_camel_case(row)}
87
+ value.map {|row| to_camelcase(row)}
86
88
  else
87
89
  value
88
90
  end
@@ -144,8 +146,9 @@ class MacroDroid
144
146
  puts 'before RowX.new' if @debug
145
147
 
146
148
  s2 = s.gsub(/^g:/,'geofence:').gsub(/^m:/,'macro:')\
147
- .gsub(/^v:/,'variable:').gsub(/^t:/,'trigger:')\
148
- .gsub(/^a:/,'action:').gsub(/^c:/,'constraint:').gsub(/^#.*/,'')
149
+ .gsub(/^d:/,'description:').gsub(/^v:/,'variable:')\
150
+ .gsub(/^t:/,'trigger:').gsub(/^a:/,'action:')\
151
+ .gsub(/^c:/,'constraint:').gsub(/^#.*/,'')
149
152
 
150
153
  a = s2.split(/(?=^macro:)/)
151
154
 
@@ -165,7 +168,7 @@ class MacroDroid
165
168
 
166
169
  end
167
170
 
168
- xml = RowX.new(raw_macros).to_xml
171
+ xml = RowX.new(raw_macros, allow_lonely_keyfield: true).to_xml
169
172
  puts 'xml: ' + xml if @debug
170
173
  import_rowxml(xml)
171
174
 
@@ -240,7 +243,7 @@ class MacroDroid
240
243
  },
241
244
  macro_list: @macros.map(&:to_h)
242
245
  }
243
- @h.merge(h).to_camel_case
246
+ @h.merge(h).to_camelcase
244
247
 
245
248
  end
246
249
 
@@ -576,6 +579,7 @@ class DroidSim
576
579
 
577
580
  end
578
581
 
582
+ # PASTE_END
579
583
 
580
584
  require 'ruby-macrodroid/base'
581
585
  require 'ruby-macrodroid/triggers'
@@ -33,7 +33,9 @@
33
33
 
34
34
 
35
35
  class Action < MacroObject
36
+ using ColouredText
36
37
  using Params
38
+ include ObjectX
37
39
 
38
40
  attr_reader :constraints
39
41
 
@@ -141,22 +143,39 @@ end
141
143
 
142
144
  # Category: Applications
143
145
  #
146
+
147
+
144
148
  class OpenWebPageAction < ApplicationAction
149
+ using ColouredText
145
150
 
146
151
  def initialize(obj={}, macro=nil)
152
+
153
+ $debug = true
154
+ puts ('obj: ' + obj.inspect).debug if $debug
147
155
 
148
156
  h = if obj.is_a? Hash then
149
157
 
150
- obj
158
+ obj.merge({macro: macro})
151
159
 
152
160
  elsif obj.is_a? Array
153
- puts 'obj: ' + obj.inspect if @debug
161
+
162
+ puts ('obj: ' + obj.inspect).debug if $debug
154
163
  e, macro = obj
155
164
 
156
165
  a = e.xpath('item/*')
157
166
 
158
167
  h2 = if a.any? then
159
- a.map {|node| [node.name.to_sym, node.text.to_s]}.to_h
168
+
169
+ a.map do |node|
170
+
171
+ if node.name == 'description' and node.text.to_s =~ /: / then
172
+ node.text.to_s.split(/: +/,2).map(&:strip)
173
+ else
174
+ [node.name.to_sym, node.text.to_s.strip]
175
+ end
176
+
177
+ end.to_h
178
+
160
179
  else
161
180
  txt = e.text('item/description')
162
181
  {url: (txt || e.text)}
@@ -166,41 +185,54 @@ class OpenWebPageAction < ApplicationAction
166
185
 
167
186
  end
168
187
 
169
- puts 'h:' + h.inspect if @debug
188
+ puts ('h:' + h.inspect).debug if $debug
170
189
 
171
- h[:url_to_open] = h[:url] if h[:url] and h[:url].length > 1
190
+ #h[:url_to_open] = h[:url] if h[:url] and h[:url].length > 1
172
191
 
173
192
  options = {
174
- variable_to_save_response: {:m_stringValue=>"", :m_name=>"",
175
- m_decimalValue: 0.0, isLocal: true, m_booleanValue: false,
176
- excludeFromLog: false, m_intValue: 0, m_type: 2},
193
+ variable_to_save_response: {:string_value=>"", :name=>"coords",
194
+ decimal_value: 0.0, isLocal: true, m_boolean_value: false,
195
+ excludeFromLog: false, int_value: 0, type: 2},
177
196
  url_to_open: '',
178
197
  http_get: true,
179
198
  disable_url_encode: false,
180
199
  block_next_action: false
181
200
  }
182
201
 
183
- if h[:macro].remote_url.nil? and (h[:url_to_open].nil? or
184
- h[:url_to_open].empty?) then
202
+ return super(options.merge h) if h[:url_to_open]
203
+
204
+ if h[:macro].remote_url.nil? and (h[:url].nil? or h[:url].empty?) then
185
205
  raise OpenWebPageActionError, 'remote_url not found'
186
206
  end
187
207
 
188
- if (h[:identifier].nil? or h[:identifier].empty?) and
189
- (h[:url_to_open].nil? or h[:url_to_open].empty?) then
208
+ url = if h[:url] and h[:url].length > 1 then
209
+
210
+ h[:url]
211
+
212
+ elsif h2 and h[:macro].remote_url and h[:identifier]
213
+
214
+ "%s/%s" % [h[:macro].remote_url.sub(/\/$/,''), h[:identifier]]
215
+
216
+ elsif (h[:identifier].nil? or h[:identifier].empty?)
190
217
 
191
218
  h[:url_to_open] = h[:macro].remote_url.sub(/\/$/,'') + '/' +
192
- h[:macro].title.downcase.gsub(/ +/,'-')
219
+ h[:macro].title.downcase.gsub(/ +/,'-')
193
220
 
194
- elsif h2 and h[:macro].remote_url and h[:identifier]
221
+ end
222
+
223
+ if h2 then
195
224
 
196
- url = "%s/%s" % [h[:macro].remote_url.sub(/\/$/,''), h[:identifier]]
197
225
  h2.delete :identifier
198
- url += '?' + \
199
- URI.escape(h2.map {|key,value| "%s=%s" % [key, value]}.join('&'))
200
- h[:url_to_open] = url
226
+ h2.delete :url
201
227
 
202
- end
228
+ if h2.any? then
229
+ url += '?' + \
230
+ URI.escape(h2.map {|key,value| "%s=%s" % [key, value]}.join('&'))
231
+ end
232
+
233
+ end
203
234
 
235
+ h[:url_to_open] = url
204
236
  super(options.merge h)
205
237
 
206
238
  end
@@ -377,6 +409,7 @@ class IfConditionAction < Action
377
409
  a: true,
378
410
  constraint_list: []
379
411
  }
412
+ puts 'obj: ' + obj.inspect if $debug
380
413
 
381
414
  if obj.is_a? Hash then
382
415
 
@@ -386,18 +419,23 @@ class IfConditionAction < Action
386
419
  super(h2)
387
420
 
388
421
  elsif obj.is_a? Array
422
+
389
423
  e, macro = obj
390
- super()
391
- raw_txt = e.text('item/description') || e.text.to_s
424
+ super()
425
+ puts 'e.xml: ' + e.xml if $debug
426
+ puts 'e.text: ' + e.text.to_s.strip if $debug
427
+ raw_txt = e.text.to_s.strip[/^if [^$]+/i] || e.text('item/description')
392
428
  puts 'raw_txt: ' + raw_txt.inspect if $debug
393
429
 
394
- clause = raw_txt[/^if (.*)/i,1]
430
+ clause = raw_txt[/^If (.*)/i,1]
431
+ puts 'clause: ' + clause.inspect if $debug
395
432
  conditions = clause.split(/\s+\b(?:AND|OR)\b\s+/i)
433
+ puts 'conditions: ' + conditions.inspect if $debug
396
434
 
397
435
  cp = ConstraintsNlp.new
398
436
 
399
437
  @constraints = conditions.map do |c|
400
- puts 'c: ' + c.inspect
438
+ puts 'c: ' + c.inspect if $debug
401
439
  r = cp.find_constraint c
402
440
  puts 'found constraint ' + r.inspect if $debug
403
441
 
@@ -405,7 +443,24 @@ class IfConditionAction < Action
405
443
 
406
444
  end
407
445
  puts '@constraints: ' + @constraints.inspect if $debug
408
- {}
446
+
447
+ # find any nested actions
448
+ item = e.element('item')
449
+
450
+ if item then
451
+
452
+ ap = ActionsNlp.new
453
+ obj2 = action_to_object(ap, item, item, macro)
454
+ puts 'obj2: ' + obj2.inspect if $debug
455
+ #macro.add obj2
456
+
457
+ end
458
+
459
+ h = {
460
+ constraint_list: @constraints.map(&:to_h)
461
+ }
462
+ super(h) {}
463
+
409
464
  else
410
465
  # get the constraints
411
466
 
@@ -434,21 +489,47 @@ class IfConditionAction < Action
434
489
  out << s + constraints
435
490
  out.join("\n")
436
491
 
437
- end
492
+ end
493
+
438
494
  end
439
495
 
440
496
  class ElseAction < Action
441
497
 
442
- def initialize(h={})
498
+ def initialize(obj=[])
443
499
 
444
500
  options = {
445
- constraint_list: ''
501
+ constraint_list: []
446
502
  }
503
+
504
+ if obj.is_a? Hash then
505
+
506
+ h = obj
447
507
 
448
- super(options.merge h)
508
+ super(options.merge h)
509
+
510
+ elsif obj.is_a? Array
511
+
512
+ e, macro = obj
513
+
514
+ # find any nested actions
515
+ item = e.element('item')
516
+
517
+ if item then
518
+
519
+ ap = ActionsNlp.new
520
+ obj2 = action_to_object(ap, item, item, macro)
521
+ puts 'obj2: ' + obj2.inspect if $debug
522
+ #macro.add obj2
523
+
524
+ end
525
+
526
+ super(options)
527
+ end
528
+
449
529
 
450
530
 
451
- end
531
+
532
+ end
452
533
 
453
534
  def to_s(colour: false, indent: 0)
454
535
  'Else'
@@ -1050,7 +1131,17 @@ end
1050
1131
  class VibrateAction < DeviceSettingsAction
1051
1132
 
1052
1133
  def initialize(h={})
1053
-
1134
+
1135
+ pattern = [
1136
+ 'Blip', 'Short Buzz', 'Long Buzz', 'Rapid', 'Slow', 'Increasing',
1137
+ 'Constant', 'Decreasing', 'Final Fantasy', 'Game Over', 'Star Wars',
1138
+ 'Mini Blip', 'Micro Blip'
1139
+ ]
1140
+
1141
+ if h[:pattern] then
1142
+ h[:vibrate_pattern] = pattern.map(&:downcase).index h[:pattern]
1143
+ end
1144
+
1054
1145
  options = {
1055
1146
  vibrate_pattern: 1
1056
1147
  }
@@ -1338,7 +1429,7 @@ class ForceLocationUpdateAction < LocationAction
1338
1429
  end
1339
1430
 
1340
1431
  def to_s(colour: false, indent: 0)
1341
- 'ForceLocationUpdateAction ' + @h.inspect
1432
+ 'Force Location Update' #+ @h.inspect
1342
1433
  end
1343
1434
 
1344
1435
  alias to_summary to_s
@@ -1359,26 +1450,34 @@ end
1359
1450
  #
1360
1451
  class ShareLocationAction < LocationAction
1361
1452
 
1362
- def initialize(h={})
1453
+ def initialize(obj=nil)
1363
1454
 
1364
- super()
1455
+ h = if obj.is_a? Hash then
1456
+ obj
1457
+ elsif obj.is_a? Array
1458
+ e, macro = obj
1459
+ {variable: macro.set_var(e.text('item/description').to_s)}
1460
+
1461
+ end
1462
+
1463
+ #super()
1365
1464
 
1366
1465
  options = {
1367
1466
  email: '',
1368
- variable: {:m_stringValue=>"", :m_name=>"",
1369
- :m_decimalValue=>0.0, :isLocal=>true, :m_booleanValue=>false,
1370
- :excludeFromLog=>false, :m_intValue=>0, :m_type=>2},
1467
+ variable: {:string_value=>"", :name=>"",
1468
+ :decimal_value=>0.0, :is_local=>true, :boolean_value=>false,
1469
+ :exclude_from_log=>false, :int_value=>0, :type=>2},
1371
1470
  sim_id: 0,
1372
1471
  output_channel: 5,
1373
1472
  old_variable_format: true
1374
1473
  }
1375
-
1474
+ #options[:variable].merge! h
1376
1475
  super(options.merge h)
1377
1476
 
1378
1477
  end
1379
1478
 
1380
1479
  def to_s(colour: false, indent: 0)
1381
- @s = 'Share Location' + "\nGPS" # + @h.inspect
1480
+ @s = 'Share Location' + "\n" + @h[:variable][:name] # + @h.inspect
1382
1481
  super()
1383
1482
  end
1384
1483
 
@@ -1572,8 +1671,24 @@ end
1572
1671
  # MacroDroid Specific
1573
1672
  #
1574
1673
  class SetVariableAction < Action
1674
+ using ColouredText
1575
1675
 
1576
- def initialize(h={})
1676
+ def initialize(obj=nil)
1677
+
1678
+ h = if obj.is_a? Hash then
1679
+ obj
1680
+ elsif obj.is_a? Array
1681
+ e, macro = obj
1682
+ node = e.element('item/*')
1683
+ #puts ("node.name: %s node.value: %s" % [node.name, node.value]).debug
1684
+ r = macro.set_var node.name, node.value.to_s
1685
+ puts ('r: ' + r.inspect).debug if $debug
1686
+ r
1687
+ if r[:type] == 2 then
1688
+ { variable: {name: r[:name], type: r[:type]}, new_string_value: r[:string_value]
1689
+ }
1690
+ end
1691
+ end
1577
1692
 
1578
1693
  options = {
1579
1694
  :user_prompt=>true,
@@ -1581,9 +1696,21 @@ class SetVariableAction < Action
1581
1696
  :user_prompt_show_cancel=>true,
1582
1697
  :user_prompt_stop_after_cancel=>true,
1583
1698
  :user_prompt_title=>"Word reverse",
1584
- :name => 'word'
1699
+ :name => 'word',
1700
+ :false_label=>"False", :int_expression=>false, :int_random=>false,
1701
+ :int_random_max=>0, :int_random_min=>0, :int_value_decrement=>false,
1702
+ :int_value_increment=>false, :new_boolean_value=>false,
1703
+ :new_double_value=>0.0, :new_int_value=>0,
1704
+ :new_string_value=>"[battery]", :true_label=>"True",
1705
+ :user_prompt=>false, :user_prompt_show_cancel=>true,
1706
+ :user_prompt_stop_after_cancel=>true,
1707
+ :variable=>{
1708
+ :exclude_from_log=>false, :is_local=>true,
1709
+ :boolean_value=>false, :decimal_value=>0.0,
1710
+ :int_value=>0, :name=>"foo", :string_value=>"52", :type=>2
1711
+ }
1585
1712
  }
1586
- super(h)
1713
+ super(options.merge h)
1587
1714
 
1588
1715
  end
1589
1716
 
@@ -2280,8 +2407,31 @@ end
2280
2407
  # Category: Screen
2281
2408
  #
2282
2409
  class ScreenOnAction < ScreenAction
2410
+ using ColouredText
2283
2411
 
2284
- def initialize(h={})
2412
+ def initialize(obj=nil)
2413
+
2414
+ debug = false
2415
+
2416
+ h = if obj.is_a? Hash then
2417
+
2418
+ obj
2419
+
2420
+ elsif obj.is_a? Array
2421
+ =begin
2422
+ puts 'obj: ' + obj.inspect if debug
2423
+ e, macro = obj
2424
+ puts ('e: ' + e.xml.inspect).debug if debug
2425
+ a = e.xpath('item/*')
2426
+
2427
+ txt = e.text.to_s
2428
+ puts ('txt: ' + txt.inspect).debug if debug
2429
+ state = txt[/Screen (On|Off)/i,1]
2430
+
2431
+ {screen_off: state.downcase == 'off'}
2432
+ =end
2433
+ {}
2434
+ end
2285
2435
 
2286
2436
  options = {
2287
2437
  pie_lock_screen: false,
@@ -2337,8 +2487,46 @@ end
2337
2487
  # disable keep awake => enabled: false
2338
2488
  #
2339
2489
  class KeepAwakeAction < ScreenAction
2490
+ using ColouredText
2340
2491
 
2341
- def initialize(h={})
2492
+ def initialize(obj=nil)
2493
+
2494
+
2495
+ h = if obj.is_a? Hash then
2496
+
2497
+ obj
2498
+
2499
+ elsif obj.is_a? Array
2500
+
2501
+ puts 'obj: ' + obj.inspect if $debug
2502
+ e, macro = obj
2503
+
2504
+ a = e.xpath('item/*')
2505
+
2506
+ txt = e.text('item/description')
2507
+
2508
+ h2 = if txt then
2509
+
2510
+ raw_duration = (txt || e.text).to_s
2511
+ puts 'raw_duration: ' + raw_duration.inspect if $debug
2512
+ duration = raw_duration[/Screen On - ([^$]+)/i]
2513
+ {duration: duration}
2514
+
2515
+ elsif a.any? then
2516
+ a.map {|node| [node.name.to_sym, node.text.to_s]}.to_h
2517
+ end
2518
+
2519
+ h2.merge(macro: macro)
2520
+
2521
+ end
2522
+
2523
+ puts ('h: ' + h.inspect).debug if $debug
2524
+
2525
+ if h[:duration] then
2526
+
2527
+ h[:seconds_to_stay_awake_for] = Subunit.hms_to_seconds(h[:duration])
2528
+
2529
+ end
2342
2530
 
2343
2531
  options = {
2344
2532
  enabled: true,