ruby-macrodroid 0.8.9 → 0.8.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 12fa9c7d9f642140ed62656a4c3444e5c739ad2be06af2883e23e48766cd742f
4
- data.tar.gz: 6f70e2124afbcf43bd15295dfea8aaf9a0a8d6704de819acb34481082d8c905f
3
+ metadata.gz: b820bff4fbf40858e39fb86dcf5cca3c511fec1285c6ef642469f0222ae7858e
4
+ data.tar.gz: abea1d50f38024c84dcca885487915a6f878427d0f5504c98ce818976231eb8c
5
5
  SHA512:
6
- metadata.gz: a00b28e20a41ffbdead956eb07ad4e7fe412aa2ceb773017a709c97a4fd1307672b78405581a8e54d855d1f9cb53fe598638bc542facccde886b127e9e150d17
7
- data.tar.gz: ddcdc9689a2f202477018ab710772c834caad0e392c6d7135c0f65beb8e85dbf0144fc793e7b11db404531a1cbaf69876b2b21f7598b6baf1361ba794f7bc809
6
+ metadata.gz: 6f64c76e11c1b581e8e86bbddbcfec090e90c5673ecc72d64deeb542452a870252dc30a066f699f5ea1b682147f241d2518341b34cfefe6d5e70aacbe4cf22e6
7
+ data.tar.gz: b3e6b695cca7a0c10c14b4bde58c927504cc2f5e722ba2ca83fb9c905d51369b1a0912134a523ae4a3f6546dbf9e826585fddb6a56fa02799e2d72fcbd37a6d0
Binary file
data.tar.gz.sig CHANGED
@@ -1,3 +1 @@
1
- 0t�����Ip���,���d ��Q7��N��j���eO���Xu�,�{2�'���Gi��V�'��qͩTȉ����+��)jۥ7� 603�e�����OC�O�갣�pR^���¢�Sܥ�̦�t����>������ᚈ�Xk�Boi��Z��c�O8���q�#a�
2
- �����L'NK��D�qf�H� k�w�+ԐP]�\�X9��x��w���1wj{S9�fWDgc�6s��Yr�= �ų��UB�,�Q.�z�R�R\C���jC��탿Ru�����3����j�a+�������>�tv׳��[��Ѐ�0^
3
- d[m6��N�eœ�׷�HvLv
1
+ �����Qt�;�����Ɠ�5���
@@ -7,12 +7,7 @@
7
7
  # ## Nlp classes
8
8
  #
9
9
  # TriggersNlp ActionsNlp ConstraintsNlp
10
- #
11
- #
12
- # ## Macro class
13
- #
14
- # Macro
15
- #
10
+ #
16
11
  #
17
12
  # ## Error class
18
13
  #
@@ -31,11 +26,12 @@
31
26
  #
32
27
 
33
28
 
29
+
34
30
  require 'yaml'
35
31
  require 'rowx'
36
32
  require 'uuid'
37
- require 'glw'
38
- require 'geozone'
33
+ #require 'glw'
34
+ #require 'geozone'
39
35
  require 'geocoder'
40
36
  require 'subunit'
41
37
  require 'rxfhelper'
@@ -345,500 +341,6 @@ end
345
341
 
346
342
 
347
343
 
348
- class Macro
349
- using ColouredText
350
- using Params
351
-
352
- attr_reader :local_variables, :triggers, :actions, :constraints,
353
- :guid, :deviceid
354
- attr_accessor :title, :description
355
-
356
- def initialize(name=nil, geofences: nil, deviceid: nil, debug: false)
357
-
358
- @title, @geofences, @deviceid, @debug = name, geofences, deviceid, debug
359
-
360
- puts 'inside Macro#initialize' if @debug
361
-
362
- @local_variables, @triggers, @actions, @constraints = [], [], [], []
363
- @h = {}
364
-
365
- end
366
-
367
- def add(obj)
368
-
369
- if obj.kind_of? Trigger then
370
-
371
- puts 'trigger found' if @debug
372
- @triggers << obj
373
-
374
- elsif obj.kind_of? Action
375
-
376
- puts 'action found' if @debug
377
- @actions << obj
378
-
379
- elsif obj.kind_of? Constraint
380
-
381
- puts 'constraint found' if @debug
382
- @constraints << obj
383
-
384
- end
385
-
386
- end
387
-
388
- def to_h()
389
-
390
- h = {
391
- local_variables: @local_variables,
392
- m_trigger_list: @triggers.map(&:to_h),
393
- m_action_list: @actions.map(&:to_h),
394
- m_category: @category,
395
- m_constraint_list: @constraints.map(&:to_h),
396
- m_description: '',
397
- m_name: title(),
398
- m_excludeLog: false,
399
- m_GUID: guid(),
400
- m_isOrCondition: false,
401
- m_enabled: false,
402
- m_descriptionOpen: false,
403
- m_headingColor: 0
404
- }
405
-
406
- puts 'h: ' + h.inspect if @debug
407
-
408
- @h.merge(h)
409
- end
410
-
411
- def import_h(h)
412
-
413
- if @debug then
414
- puts 'inside import_h'
415
- puts 'h:' + h.inspect
416
- end
417
-
418
- @category = h[:category]
419
- @title = h[:name]
420
- @description = h[:description]
421
-
422
- # fetch the local variables
423
- if h[:local_variables].any? and h[:local_variables].first.any? then
424
-
425
- @local_variables = h[:local_variables].map do |var|
426
-
427
- val = case var[:type]
428
- when 0 # boolean
429
- var[:boolean_value]
430
- when 1 # integer
431
- var[:int_value]
432
- when 2 # string
433
- var[:string_value]
434
- when 3 # decimal
435
- var[:decimal_Value]
436
- end
437
-
438
- [var[:name], val]
439
-
440
- end.to_h
441
- end
442
-
443
- # fetch the triggers
444
- @triggers = h[:trigger_list].map do |trigger|
445
- puts 'trigger: ' + trigger.inspect
446
- #exit
447
- object(trigger.to_snake_case)
448
-
449
- end
450
-
451
- @actions = h[:action_list].map do |action|
452
- object(action.to_snake_case)
453
- end
454
- puts 'before fetch constraints' if @debug
455
- # fetch the constraints
456
- @constraints = h[:constraint_list].map do |constraint|
457
- object(constraint.to_snake_case)
458
- end
459
- puts 'after fetch constraints' if @debug
460
- @h = h
461
-
462
- %i(local_variables m_trigger_list m_action_list m_constraint_list)\
463
- .each {|x| @h[x] = [] }
464
- puts 'after @h set' if @debug
465
- @h
466
-
467
- end
468
-
469
- def import_xml(node)
470
-
471
- if @debug then
472
- puts 'inside Macro#import_xml'
473
- puts 'node: ' + node.xml.inspect
474
- end
475
-
476
- if node.element('triggers') then
477
-
478
- # level 2
479
-
480
- @title = node.attributes[:name]
481
- @category = node.attributes[:category]
482
- @description = node.attributes[:description]
483
-
484
-
485
- # get all the triggers
486
- @triggers = node.xpath('triggers/*').map do |e|
487
-
488
- puts 'e.name: ' + e.name.inspect if @debug
489
- {timer: TimerTrigger}[e.name.to_sym].new(e.attributes.to_h)
490
-
491
- end
492
-
493
- # get all the actions
494
- @actions = node.xpath('actions/*').map do |e|
495
-
496
- if e.name == 'notification' then
497
-
498
- case e.attributes[:type].to_sym
499
- when :popup
500
- e.attributes.delete :type
501
- ToastAction.new e.attributes.to_h
502
- end
503
-
504
- end
505
-
506
- end
507
-
508
- # get all the constraints
509
- @constraints = node.xpath('constraints/*').map do |e|
510
-
511
- puts 'e.name: ' + e.name.inspect if @debug
512
- {airplanemode: AirplaneModeConstraint}[e.name.to_sym].new(e.attributes.to_h)
513
-
514
- end
515
-
516
- else
517
-
518
- # Level 1
519
-
520
- puts 'import_xml: inside level 1' if @debug
521
-
522
- @title = node.text('macro') || node.attributes[:name]
523
-
524
- #@description = node.attributes[:description]
525
-
526
- tp = TriggersNlp.new
527
-
528
- @triggers = node.xpath('trigger').map do |e|
529
-
530
- r = tp.find_trigger e.text
531
-
532
- puts 'found trigger ' + r.inspect if @debug
533
-
534
- if r then
535
- if r[0] == GeofenceTrigger then
536
- GeofenceTrigger.new(r[1], geofences: @geofences)
537
- else
538
- r[0].new(r[1])
539
- end
540
- end
541
-
542
- end
543
-
544
- ap = ActionsNlp.new
545
-
546
- @actions = node.xpath('action').map do |e|
547
-
548
- puts 'action e: ' + e.xml.inspect if @debug
549
- puts 'e.text ' + e.text if @debug
550
-
551
- inner_lines = e.xpath('item/description/text()')
552
-
553
- action = if e.text.to_s.strip.empty? then
554
- inner_lines.shift.strip
555
- else
556
- e.text.strip
557
- end
558
-
559
- r = ap.find_action action
560
- puts 'found action ' + r.inspect if @debug
561
-
562
- if r then
563
-
564
- loose = inner_lines.shift
565
-
566
- raw_attributes = if loose then
567
-
568
- puts 'do something ' + loose.to_s if @debug
569
- loose.to_s
570
-
571
- else
572
-
573
- a = e.xpath('item/*')
574
-
575
- h = if a.any? then
576
- a.map {|node| [node.name.to_sym, node.text.to_s]}.to_h
577
- else
578
- {}
579
- end
580
-
581
- r[1].merge(h)
582
-
583
- end
584
- r[0].new(raw_attributes)
585
- end
586
-
587
- end
588
-
589
- cp = ConstraintsNlp.new
590
-
591
- @constraints = node.xpath('constraint').map do |e|
592
-
593
- r = cp.find_constraint e.text
594
- puts 'found constraint ' + r.inspect if @debug
595
-
596
- if r then
597
- r[0].new(r[1])
598
- end
599
-
600
- end
601
-
602
- end
603
-
604
- self
605
-
606
- end
607
-
608
- def match?(triggerx, detail={time: $env[:time]}, model=nil )
609
-
610
- if @triggers.any? {|x| x.type == triggerx and x.match?(detail, model) } then
611
-
612
- if @debug then
613
- puts 'checking constraints ...'
614
- puts '@constraints: ' + @constraints.inspect
615
- end
616
-
617
- if @constraints.all? {|x| x.match?($env.merge(detail), model) } then
618
-
619
- true
620
-
621
- else
622
-
623
- return false
624
-
625
- end
626
-
627
- end
628
-
629
- end
630
-
631
- # invokes the actions
632
- #
633
- def run()
634
- @actions.map(&:invoke)
635
- end
636
-
637
- # prepares the environment in order for triggers to test fire successfully
638
- # Used for testing
639
- #
640
- def set_env()
641
- @triggers.each(&:set_env)
642
- end
643
-
644
- def to_pc()
645
-
646
- heading = '# ' + @title
647
- heading += '\n# ' + @description if @description
648
- condition = @triggers.first.to_pc
649
- actions = @actions.map(&:to_pc).join("\n")
650
-
651
- <<EOF
652
- #{heading}
653
-
654
- if #{condition} then
655
- #{actions}
656
- end
657
- EOF
658
- end
659
-
660
- def to_s(colour: false)
661
-
662
- indent = 0 #@actions.map(&:to_s).join.lines.length > 0 ? 1 : 0
663
-
664
- a = []
665
- a << '# ' + @category + "\n" if @category
666
- a << (colour ? "m".bg_cyan.gray.bold : 'm') + ': ' + @title
667
-
668
-
669
- if @description and @description.length >= 1 then
670
- a << (colour ? "d".bg_gray.gray.bold : 'd') + ': ' \
671
- + @description.gsub(/\n/,"\n ")
672
- end
673
-
674
- if @local_variables.length >= 1 then
675
-
676
- vars = @local_variables.map do |k,v|
677
- label = colour ? 'v'.bg_magenta : 'v'
678
- label += ': '
679
- label + "%s: %s" % [k,v]
680
- end
681
-
682
- a << vars.join("\n")
683
- end
684
-
685
- a << @triggers.map do |x|
686
- s =-x.to_s(colour: colour)
687
-
688
- s2 = if s.lines.length > 1 then
689
- "\n" + s.lines.map {|x| x.prepend (' ' * (indent+1)) }.join
690
- else
691
- ' ' + s
692
- end
693
- #s.lines > 1 ? "\n" + x : x
694
- (colour ? "t".bg_red.gray.bold : 't') + ":" + s2
695
- end.join("\n")
696
-
697
- actions = @actions.map do |x|
698
-
699
-
700
- s = x.to_s(colour: colour)
701
- #puts 's: ' + s.inspect
702
-
703
-
704
-
705
- r = if indent <= 0 then
706
-
707
- lines = s.lines
708
-
709
- if lines.length > 1 then
710
- s = lines.map {|x| x.prepend (' ' * (indent+1)) }.join
711
- end
712
-
713
- s2 = s.lines.length > 1 ? "\n" + s : ' ' + s
714
-
715
- if colour then
716
- "a".bg_blue.gray.bold + ":" + s2
717
- else
718
- "a:" + s2
719
- end
720
-
721
- elsif indent > 0
722
-
723
- if s =~ /^Else/ then
724
- (' ' * (indent-1)) + "%s" % s
725
- elsif s =~ /^End/
726
- indent -= 1
727
- (' ' * indent) + "%s" % s
728
- else
729
- s2 = s.lines[0] + s.lines[1..-1].map {|x| (' ' * indent) + x }.join
730
- (' ' * indent) + "%s" % s2
731
- end
732
-
733
- end
734
-
735
- if s =~ /^(?:If|DO \/ WHILE)/i then
736
-
737
- if indent < 1 then
738
-
739
- r = if colour then
740
- "a".bg_blue.gray.bold + ":\n %s" % s
741
- else
742
- "a:\n %s" % s
743
- end
744
-
745
- indent += 1
746
- else
747
- r = (' ' * indent) + "%s" % s
748
- end
749
-
750
- indent += 1
751
- end
752
-
753
- r
754
-
755
- end.join("\n")
756
-
757
-
758
-
759
-
760
- a << actions
761
-
762
-
763
- if @constraints.any? then
764
- a << @constraints.map do |x|
765
- (colour ? "c".bg_green.gray.bold : 'c') + ": %s" % x
766
- end.join("\n")
767
- end
768
-
769
-
770
-
771
-
772
-
773
- a.join("\n") + "\n"
774
-
775
- end
776
-
777
- def to_summary(colour: false)
778
-
779
- if colour then
780
-
781
- a = [
782
- 'm'.bg_cyan.gray.bold + ': ' + @title,
783
- 't'.bg_red.gray.bold + ': ' + @triggers.map \
784
- {|x| x.to_summary(colour: false)}.join(", "),
785
- 'a'.bg_blue.gray.bold + ': ' + @actions.map \
786
- {|x| x.to_summary(colour: false)}.join(", ")
787
- ]
788
-
789
- if @constraints.any? then
790
- a << 'c'.bg_green.gray.bold + ': ' + @constraints.map \
791
- {|x| x.to_summary(colour: false)}.join(", ")
792
- end
793
-
794
- else
795
-
796
- a = [
797
- 'm: ' + @title,
798
- 't: ' + @triggers.map {|x| x.to_summary(colour: false)}.join(", "),
799
- 'a: ' + @actions.map {|x| x.to_summary(colour: false)}.join(", ")
800
- ]
801
-
802
- if @constraints.any? then
803
- a << 'c: ' + @constraints.map \
804
- {|x| x.to_summary(colour: false)}.join(", ")
805
- end
806
- end
807
-
808
-
809
-
810
- a.join("\n") + "\n"
811
-
812
- end
813
-
814
- private
815
-
816
- def guid()
817
- '-' + rand(1..9).to_s + 18.times.map { rand 9 }.join
818
- end
819
-
820
- def object(h={})
821
-
822
- puts ('inside object h:' + h.inspect).debug if @debug
823
- klass = Object.const_get h[:class_type]
824
- puts klass.inspect.highlight if $debug
825
-
826
- if klass == GeofenceTrigger then
827
- puts 'GeofenceTrigger found'.highlight if $debug
828
- GeofenceTrigger.new(h, geofences: @geofences)
829
- else
830
- puts 'before klass'
831
- h2 = h.merge( macro: self)
832
- puts 'h2: ' + h2.inspect
833
- r = klass.new h2
834
- puts 'r:' + r.inspect
835
- r
836
-
837
- end
838
-
839
- end
840
-
841
- end
842
344
 
843
345
 
844
346
  class MacroDroidError < Exception
@@ -901,6 +403,7 @@ class MacroDroid
901
403
  end
902
404
 
903
405
  xml = RowX.new(raw_macros).to_xml
406
+ puts 'xml: ' + xml if @debug
904
407
  import_rowxml(xml)
905
408
 
906
409
  elsif s =~ /^# /
@@ -1938,6 +1938,9 @@ class ToastAction < NotificationsAction
1938
1938
 
1939
1939
  h = if obj.is_a? Hash then
1940
1940
  obj
1941
+ elsif obj.is_a? Rexle::Element
1942
+ txt = obj.text('item/description')
1943
+ {msg: (txt || obj.text)}
1941
1944
  else
1942
1945
  {msg: obj}
1943
1946
  end
@@ -0,0 +1,514 @@
1
+ # file: ruby-macrodroid/macro.rb
2
+
3
+
4
+ # This file contains the following classes:
5
+ #
6
+ # ## Macro class
7
+ #
8
+ # Macro
9
+
10
+ class Macro
11
+ using ColouredText
12
+ using Params
13
+
14
+ attr_reader :local_variables, :triggers, :actions, :constraints,
15
+ :guid, :deviceid
16
+ attr_accessor :title, :description
17
+
18
+ def initialize(name=nil, geofences: nil, deviceid: nil, debug: false)
19
+
20
+ @title, @geofences, @deviceid, @debug = name, geofences, deviceid, debug
21
+
22
+ puts 'inside Macro#initialize' if @debug
23
+
24
+ @local_variables, @triggers, @actions, @constraints = [], [], [], []
25
+ @h = {}
26
+
27
+ end
28
+
29
+ def add(obj)
30
+
31
+ if obj.kind_of? Trigger then
32
+
33
+ puts 'trigger found' if @debug
34
+ @triggers << obj
35
+
36
+ elsif obj.kind_of? Action
37
+
38
+ puts 'action found' if @debug
39
+ @actions << obj
40
+
41
+ elsif obj.kind_of? Constraint
42
+
43
+ puts 'constraint found' if @debug
44
+ @constraints << obj
45
+
46
+ end
47
+
48
+ end
49
+
50
+ def to_h()
51
+
52
+ h = {
53
+ local_variables: @local_variables,
54
+ m_trigger_list: @triggers.map(&:to_h),
55
+ m_action_list: @actions.map(&:to_h),
56
+ m_category: @category,
57
+ m_constraint_list: @constraints.map(&:to_h),
58
+ m_description: '',
59
+ m_name: title(),
60
+ m_excludeLog: false,
61
+ m_GUID: guid(),
62
+ m_isOrCondition: false,
63
+ m_enabled: false,
64
+ m_descriptionOpen: false,
65
+ m_headingColor: 0
66
+ }
67
+
68
+ puts 'h: ' + h.inspect if @debug
69
+
70
+ @h.merge(h)
71
+ end
72
+
73
+ def import_h(h)
74
+
75
+ if @debug then
76
+ puts 'inside import_h'
77
+ puts 'h:' + h.inspect
78
+ end
79
+
80
+ @category = h[:category]
81
+ @title = h[:name]
82
+ @description = h[:description]
83
+
84
+ # fetch the local variables
85
+ if h[:local_variables].any? and h[:local_variables].first.any? then
86
+
87
+ @local_variables = h[:local_variables].map do |var|
88
+
89
+ val = case var[:type]
90
+ when 0 # boolean
91
+ var[:boolean_value]
92
+ when 1 # integer
93
+ var[:int_value]
94
+ when 2 # string
95
+ var[:string_value]
96
+ when 3 # decimal
97
+ var[:decimal_Value]
98
+ end
99
+
100
+ [var[:name], val]
101
+
102
+ end.to_h
103
+ end
104
+
105
+ # fetch the triggers
106
+ @triggers = h[:trigger_list].map do |trigger|
107
+ puts 'trigger: ' + trigger.inspect
108
+ #exit
109
+ object(trigger.to_snake_case)
110
+
111
+ end
112
+
113
+ @actions = h[:action_list].map do |action|
114
+ object(action.to_snake_case)
115
+ end
116
+ puts 'before fetch constraints' if @debug
117
+ # fetch the constraints
118
+ @constraints = h[:constraint_list].map do |constraint|
119
+ object(constraint.to_snake_case)
120
+ end
121
+ puts 'after fetch constraints' if @debug
122
+ @h = h
123
+
124
+ %i(local_variables m_trigger_list m_action_list m_constraint_list)\
125
+ .each {|x| @h[x] = [] }
126
+ puts 'after @h set' if @debug
127
+ @h
128
+
129
+ end
130
+
131
+ def import_xml(node)
132
+
133
+ if @debug then
134
+ puts 'inside Macro#import_xml'
135
+ puts 'node: ' + node.xml.inspect
136
+ end
137
+
138
+ if node.element('triggers') then
139
+
140
+ # level 2
141
+
142
+ @title = node.attributes[:name]
143
+ @category = node.attributes[:category]
144
+ @description = node.attributes[:description]
145
+
146
+
147
+ # get all the triggers
148
+ @triggers = node.xpath('triggers/*').map do |e|
149
+
150
+ puts 'e.name: ' + e.name.inspect if @debug
151
+ {timer: TimerTrigger}[e.name.to_sym].new(e.attributes.to_h)
152
+
153
+ end
154
+
155
+ # get all the actions
156
+ @actions = node.xpath('actions/*').map do |e|
157
+
158
+ if e.name == 'notification' then
159
+
160
+ case e.attributes[:type].to_sym
161
+ when :popup
162
+ e.attributes.delete :type
163
+ ToastAction.new e.attributes.to_h
164
+ end
165
+
166
+ end
167
+
168
+ end
169
+
170
+ # get all the constraints
171
+ @constraints = node.xpath('constraints/*').map do |e|
172
+
173
+ puts 'e.name: ' + e.name.inspect if @debug
174
+ {airplanemode: AirplaneModeConstraint}[e.name.to_sym].new(e.attributes.to_h)
175
+
176
+ end
177
+
178
+ else
179
+
180
+ # Level 1
181
+
182
+ puts 'import_xml: inside level 1' if @debug
183
+
184
+ @title = node.text('macro') || node.attributes[:name]
185
+
186
+ #@description = node.attributes[:description]
187
+
188
+ tp = TriggersNlp.new
189
+
190
+ @triggers = node.xpath('trigger').map do |e|
191
+
192
+ r = tp.find_trigger e.text
193
+
194
+ puts 'found trigger ' + r.inspect if @debug
195
+
196
+ if r then
197
+ if r[0] == GeofenceTrigger then
198
+ GeofenceTrigger.new(r[1], geofences: @geofences)
199
+ else
200
+ r[0].new(r[1])
201
+ end
202
+ end
203
+
204
+ end
205
+
206
+ ap = ActionsNlp.new
207
+
208
+ @actions = node.xpath('action').flat_map do |e|
209
+
210
+ puts 'action e: ' + e.xml.inspect if @debug
211
+ puts 'e.text ' + e.text if @debug
212
+
213
+ item = e.element('item')
214
+ if item then
215
+
216
+ if item.element('description') then
217
+
218
+ item.xpath('description').map do |description|
219
+
220
+ inner_lines = description.text.to_s.strip.lines
221
+ puts 'inner_lines: ' + inner_lines.inspect if @debug
222
+
223
+ action = if e.text.to_s.strip.empty? then
224
+ inner_lines.shift.strip
225
+ else
226
+ e.text.strip
227
+ end
228
+
229
+ r = ap.find_action action
230
+ r[0].new(description) if r
231
+
232
+ end
233
+
234
+ else
235
+
236
+ action = e.text.strip
237
+ r = ap.find_action action
238
+
239
+ a = e.xpath('item/*')
240
+
241
+ h = if a.any? then
242
+ a.map {|node| [node.name.to_sym, node.text.to_s]}.to_h
243
+ else
244
+ {}
245
+ end
246
+
247
+ r = ap.find_action action
248
+ r[0].new(h) if r
249
+
250
+ end
251
+
252
+ else
253
+
254
+ action = e.text.strip
255
+ r = ap.find_action action
256
+ r[0].new(r[1]) if r
257
+
258
+ end
259
+
260
+ end
261
+
262
+ cp = ConstraintsNlp.new
263
+
264
+ @constraints = node.xpath('constraint').map do |e|
265
+
266
+ r = cp.find_constraint e.text
267
+ puts 'found constraint ' + r.inspect if @debug
268
+
269
+ if r then
270
+ r[0].new(r[1])
271
+ end
272
+
273
+ end
274
+
275
+ end
276
+
277
+ self
278
+
279
+ end
280
+
281
+ def match?(triggerx, detail={time: $env[:time]}, model=nil )
282
+
283
+ if @triggers.any? {|x| x.type == triggerx and x.match?(detail, model) } then
284
+
285
+ if @debug then
286
+ puts 'checking constraints ...'
287
+ puts '@constraints: ' + @constraints.inspect
288
+ end
289
+
290
+ if @constraints.all? {|x| x.match?($env.merge(detail), model) } then
291
+
292
+ true
293
+
294
+ else
295
+
296
+ return false
297
+
298
+ end
299
+
300
+ end
301
+
302
+ end
303
+
304
+ # invokes the actions
305
+ #
306
+ def run()
307
+ @actions.map(&:invoke)
308
+ end
309
+
310
+ # prepares the environment in order for triggers to test fire successfully
311
+ # Used for testing
312
+ #
313
+ def set_env()
314
+ @triggers.each(&:set_env)
315
+ end
316
+
317
+ def to_pc()
318
+
319
+ heading = '# ' + @title
320
+ heading += '\n# ' + @description if @description
321
+ condition = @triggers.first.to_pc
322
+ actions = @actions.map(&:to_pc).join("\n")
323
+
324
+ <<EOF
325
+ #{heading}
326
+
327
+ if #{condition} then
328
+ #{actions}
329
+ end
330
+ EOF
331
+ end
332
+
333
+ def to_s(colour: false)
334
+
335
+ indent = 0 #@actions.map(&:to_s).join.lines.length > 0 ? 1 : 0
336
+
337
+ a = []
338
+ a << '# ' + @category + "\n" if @category
339
+ a << (colour ? "m".bg_cyan.gray.bold : 'm') + ': ' + @title
340
+
341
+
342
+ if @description and @description.length >= 1 then
343
+ a << (colour ? "d".bg_gray.gray.bold : 'd') + ': ' \
344
+ + @description.gsub(/\n/,"\n ")
345
+ end
346
+
347
+ if @local_variables.length >= 1 then
348
+
349
+ vars = @local_variables.map do |k,v|
350
+ label = colour ? 'v'.bg_magenta : 'v'
351
+ label += ': '
352
+ label + "%s: %s" % [k,v]
353
+ end
354
+
355
+ a << vars.join("\n")
356
+ end
357
+
358
+ a << @triggers.map do |x|
359
+ s =-x.to_s(colour: colour)
360
+
361
+ s2 = if s.lines.length > 1 then
362
+ "\n" + s.lines.map {|x| x.prepend (' ' * (indent+1)) }.join
363
+ else
364
+ ' ' + s
365
+ end
366
+ #s.lines > 1 ? "\n" + x : x
367
+ (colour ? "t".bg_red.gray.bold : 't') + ":" + s2
368
+ end.join("\n")
369
+
370
+ actions = @actions.map do |x|
371
+
372
+
373
+ s = x.to_s(colour: colour)
374
+ #puts 's: ' + s.inspect
375
+
376
+
377
+
378
+ r = if indent <= 0 then
379
+
380
+ lines = s.lines
381
+
382
+ if lines.length > 1 then
383
+ s = lines.map {|x| x.prepend (' ' * (indent+1)) }.join
384
+ end
385
+
386
+ s2 = s.lines.length > 1 ? "\n" + s : ' ' + s
387
+
388
+ if colour then
389
+ "a".bg_blue.gray.bold + ":" + s2
390
+ else
391
+ "a:" + s2
392
+ end
393
+
394
+ elsif indent > 0
395
+
396
+ if s =~ /^Else/ then
397
+ (' ' * (indent-1)) + "%s" % s
398
+ elsif s =~ /^End/
399
+ indent -= 1
400
+ (' ' * indent) + "%s" % s
401
+ else
402
+ s2 = s.lines[0] + s.lines[1..-1].map {|x| (' ' * indent) + x }.join
403
+ (' ' * indent) + "%s" % s2
404
+ end
405
+
406
+ end
407
+
408
+ if s =~ /^(?:If|DO \/ WHILE)/i then
409
+
410
+ if indent < 1 then
411
+
412
+ r = if colour then
413
+ "a".bg_blue.gray.bold + ":\n %s" % s
414
+ else
415
+ "a:\n %s" % s
416
+ end
417
+
418
+ indent += 1
419
+ else
420
+ r = (' ' * indent) + "%s" % s
421
+ end
422
+
423
+ indent += 1
424
+ end
425
+
426
+ r
427
+
428
+ end.join("\n")
429
+
430
+
431
+
432
+
433
+ a << actions
434
+
435
+
436
+ if @constraints.any? then
437
+ a << @constraints.map do |x|
438
+ (colour ? "c".bg_green.gray.bold : 'c') + ": %s" % x
439
+ end.join("\n")
440
+ end
441
+
442
+
443
+
444
+
445
+
446
+ a.join("\n") + "\n"
447
+
448
+ end
449
+
450
+ def to_summary(colour: false)
451
+
452
+ if colour then
453
+
454
+ a = [
455
+ 'm'.bg_cyan.gray.bold + ': ' + @title,
456
+ 't'.bg_red.gray.bold + ': ' + @triggers.map \
457
+ {|x| x.to_summary(colour: false)}.join(", "),
458
+ 'a'.bg_blue.gray.bold + ': ' + @actions.map \
459
+ {|x| x.to_summary(colour: false)}.join(", ")
460
+ ]
461
+
462
+ if @constraints.any? then
463
+ a << 'c'.bg_green.gray.bold + ': ' + @constraints.map \
464
+ {|x| x.to_summary(colour: false)}.join(", ")
465
+ end
466
+
467
+ else
468
+
469
+ a = [
470
+ 'm: ' + @title,
471
+ 't: ' + @triggers.map {|x| x.to_summary(colour: false)}.join(", "),
472
+ 'a: ' + @actions.map {|x| x.to_summary(colour: false)}.join(", ")
473
+ ]
474
+
475
+ if @constraints.any? then
476
+ a << 'c: ' + @constraints.map \
477
+ {|x| x.to_summary(colour: false)}.join(", ")
478
+ end
479
+ end
480
+
481
+
482
+
483
+ a.join("\n") + "\n"
484
+
485
+ end
486
+
487
+ private
488
+
489
+ def guid()
490
+ '-' + rand(1..9).to_s + 18.times.map { rand 9 }.join
491
+ end
492
+
493
+ def object(h={})
494
+
495
+ puts ('inside object h:' + h.inspect).debug if @debug
496
+ klass = Object.const_get h[:class_type]
497
+ puts klass.inspect.highlight if $debug
498
+
499
+ if klass == GeofenceTrigger then
500
+ puts 'GeofenceTrigger found'.highlight if $debug
501
+ GeofenceTrigger.new(h, geofences: @geofences)
502
+ else
503
+ puts 'before klass'
504
+ h2 = h.merge( macro: self)
505
+ puts 'h2: ' + h2.inspect
506
+ r = klass.new h2
507
+ puts 'r:' + r.inspect
508
+ r
509
+
510
+ end
511
+
512
+ end
513
+
514
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-macrodroid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.9
4
+ version: 0.8.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -35,7 +35,7 @@ cert_chain:
35
35
  NZ2kdBIUDnAM24e0/wXdVxg4HnsZbdymxyzMQ4P5pKYcpI6oisBxI37p/Xy+wAg3
36
36
  SBHno3GEuuD8ZWj24IMJpfbp
37
37
  -----END CERTIFICATE-----
38
- date: 2020-09-25 00:00:00.000000000 Z
38
+ date: 2020-09-28 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: glw
@@ -186,6 +186,7 @@ files:
186
186
  - lib/ruby-macrodroid.rb
187
187
  - lib/ruby-macrodroid/actions.rb
188
188
  - lib/ruby-macrodroid/base.rb
189
+ - lib/ruby-macrodroid/macro.rb
189
190
  - lib/ruby-macrodroid/triggers.rb
190
191
  homepage: https://github.com/jrobertson/ruby-macrodroid
191
192
  licenses:
metadata.gz.sig CHANGED
Binary file