marty 2.6.1 → 2.6.2

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: eb3ca7ab90c87f02efe558edd6cc4645ab3e9fa519ca047961b959d72c58d2b9
4
- data.tar.gz: 13ef9b0ebbe0f2e6de2de7e2b8684cadbef122ecc8fec8f1c5dee8240014191c
3
+ metadata.gz: d09559e9d5549c8ab9720fb91659a23af5eb2776cd4992d976a294573c2e7374
4
+ data.tar.gz: d8a8cfbd3ddb0a74733f5e68046548dd33aab183e6bea5963e6f8774442ca3a6
5
5
  SHA512:
6
- metadata.gz: 175f379edebcf299c9b6b0c9d3432bbabb16029f64d4d918b292f4812198efa47716ba88fd4e405230d52ffae5d44afb93fe614541d431f7ad20c47c82d3d5f6
7
- data.tar.gz: d4f24991b4876a9f4e97e9facb97d4c68025b3d89fe29fd2e731f3ebd265ff77b7377f3a494b47879119202515cc26f18f040ab0da97bc9717e15c55fb76d6c5
6
+ metadata.gz: c314f71f548391bfab763ab236d4f99dffe477c8dc90af831502caf36cd16439315df0906c454c3b7fb05d2967cac4481b46193c0f7aa461727c47186d4d1ff8
7
+ data.tar.gz: 2e0c6f94fa4989ec13c37cce0b836c72d7f1e9153dea3b53d6e4037c3caf66a5883fae6411aeb2eaa89f4658dc2e7fd73111b3b539dc680bbb3063340cc5e0a1
@@ -1,13 +1,13 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- marty (2.6.0)
4
+ marty (2.6.2)
5
5
  aws-sigv4 (~> 1.0, >= 1.0.2)
6
6
  axlsx (= 3.0.0pre)
7
7
  coderay
8
8
  daemons (~> 1.3.1)
9
9
  delayed_job_active_record
10
- delorean_lang (~> 0.5.0)
10
+ delorean_lang (~> 0.5.2)
11
11
  json-schema
12
12
  mcfly (~> 0.0.20)
13
13
  net-ldap (~> 0.16.1)
@@ -62,9 +62,7 @@ GEM
62
62
  io-like (~> 0.3.0)
63
63
  arel (8.0.0)
64
64
  ast (2.4.0)
65
- aws-eventstream (1.0.2)
66
- aws-sigv4 (1.1.0)
67
- aws-eventstream (~> 1.0, >= 1.0.2)
65
+ aws-sigv4 (1.0.3)
68
66
  axlsx (3.0.0.pre)
69
67
  htmlentities (~> 4.3, >= 4.3.4)
70
68
  mimemagic (~> 0.3)
@@ -99,7 +97,7 @@ GEM
99
97
  delayed_job_active_record (4.1.3)
100
98
  activerecord (>= 3.0, < 5.3)
101
99
  delayed_job (>= 3.0, < 5)
102
- delorean_lang (0.5.1)
100
+ delorean_lang (0.5.2)
103
101
  activerecord (>= 3.2)
104
102
  treetop (~> 1.5)
105
103
  diff-lcs (1.3)
@@ -238,7 +238,8 @@ class Marty::DataGrid < Marty::Base
238
238
 
239
239
  def self.lookup_grid_distinct_entry_h(
240
240
  pt, h, dgh, visited = nil, follow = true,
241
- return_grid_data = false, distinct = true)
241
+ return_grid_data = false, distinct = true
242
+ )
242
243
 
243
244
  # Perform grid lookup, if result is another data_grid, and follow is true,
244
245
  # then perform lookup on the resulting grid. Allows grids to be nested
@@ -4,7 +4,7 @@ class Marty::Script < Marty::Base
4
4
  validates_presence_of :name, :body
5
5
  mcfly_validates_uniqueness_of :name
6
6
  validates_format_of :name,
7
- with: /\A[A-Z][a-zA-Z0-9]*\z/,
7
+ with: /\A[A-Z][a-zA-Z0-9]*(::[A-Z][a-zA-Z0-9]*)*\z/,
8
8
  message: I18n.t('script.save_error')
9
9
 
10
10
  belongs_to :user, class_name: 'Marty::User'
@@ -12,112 +12,12 @@ class Marty::Script < Marty::Base
12
12
  gen_mcfly_lookup :lookup, [:name], cache: true
13
13
 
14
14
  # find script by name/tag (not cached)
15
- def self.find_script(sname, tag = nil)
16
- tag = Marty::Tag.map_to_tag(tag)
17
- Marty::Script.mcfly_pt(tag.created_dt).find_by(name: sname)
18
- end
19
15
 
20
16
  def find_tag
21
17
  # find the first tag created after this script.
22
18
  Marty::Tag.where('created_dt >= ?', created_dt).order(:created_dt).first
23
19
  end
24
20
 
25
- def self.create_script(name, body)
26
- script = new
27
- script.name = name
28
- script.body = body
29
- script.save
30
- script
31
- end
32
-
33
- def self.load_a_script(sname, body, dt = nil)
34
- s = Marty::Script.find_by(obsoleted_dt: 'infinity', name: sname)
35
-
36
- if !s
37
- s = Marty::Script.new
38
- s.body = body
39
- s.name = sname
40
- s.created_dt = dt if dt
41
- s.save!
42
- elsif s.body != body
43
- s.body = body
44
- s.created_dt = dt if dt
45
- s.save!
46
- end
47
- end
48
-
49
- def self.load_script_bodies(bodies, dt = nil)
50
- bodies.each do |sname, body|
51
- load_a_script(sname, body, dt)
52
- end
53
-
54
- # Create a new tag if scripts were modified after the last tag
55
- tag = Marty::Tag.get_latest1
56
- latest = Marty::Script.order('created_dt DESC').first
57
-
58
- tag_time = (dt || [latest.try(:created_dt), Time.now].compact.max) +
59
- 1.second
60
-
61
- # If no tag_time is provided, the tag created_dt will be the same
62
- # as the scripts.
63
- tag = Marty::Tag.do_create(tag_time, 'tagged from load scripts') if
64
- !(tag && latest) || tag.created_dt <= latest.created_dt
65
-
66
- tag
67
- end
68
-
69
- def self.load_scripts(path = nil, dt = nil)
70
- files = get_script_filenames(path)
71
-
72
- bodies = read_script_files(files)
73
-
74
- load_script_bodies(bodies, dt)
75
- end
76
-
77
- def self.read_script_files(files)
78
- files.collect do |fpath|
79
- fname = File.basename(fpath)[0..-4].camelize
80
- [fname, File.read(fpath)]
81
- end
82
- end
83
-
84
- def self.get_script_filenames(paths = nil)
85
- paths = get_script_paths(paths)
86
-
87
- filenames = {}
88
- paths.each do |path|
89
- Dir.glob("#{path}/*.dl").each do |filename|
90
- basename = File.basename(filename)
91
- filenames[basename] = filename unless filenames.key?(basename)
92
- end
93
- end
94
-
95
- filenames.values
96
- end
97
-
98
- def self.get_script_paths(paths)
99
- if paths
100
- paths = Array(paths)
101
- elsif Rails.configuration.marty.delorean_scripts_path
102
- paths = Rails.configuration.marty.delorean_scripts_path
103
- else
104
- paths = [
105
- "#{Rails.root}/delorean",
106
- # FIXME: HACKY, wouldn't it be better to use
107
- # Gem::Specification.find_by_name("marty").gem_dir??
108
- File.expand_path('../../../../delorean', __FILE__),
109
- ]
110
- end
111
- end
112
-
113
- def self.delete_scripts
114
- ActiveRecord::Base.connection.
115
- execute('ALTER TABLE marty_scripts DISABLE TRIGGER USER;')
116
- Marty::Script.delete_all
117
- ActiveRecord::Base.connection.
118
- execute('ALTER TABLE marty_scripts ENABLE TRIGGER USER;')
119
- end
120
-
121
21
  delorean_fn :eval_to_hash, sig: 5 do |dt, script, node, attrs, params|
122
22
  tag = Marty::Tag.find_match(dt) if dt.present?
123
23
  raise("no tag for #{dt}") if tag.nil? && dt.present?
@@ -156,4 +56,112 @@ class Marty::Script < Marty::Base
156
56
 
157
57
  CodeRay.scan(script.body, :ruby).div(line_numbers: :table)
158
58
  end
59
+
60
+ class << self
61
+ def find_script(sname, tag = nil)
62
+ tag = Marty::Tag.map_to_tag(tag)
63
+ Marty::Script.mcfly_pt(tag.created_dt).find_by(name: sname)
64
+ end
65
+
66
+ def create_script(name, body)
67
+ script = new
68
+ script.name = name
69
+ script.body = body
70
+ script.save
71
+ script
72
+ end
73
+
74
+ def load_a_script(sname, body, dt = nil)
75
+ s = Marty::Script.find_by(obsoleted_dt: 'infinity', name: sname)
76
+
77
+ if !s
78
+ s = Marty::Script.new
79
+ s.body = body
80
+ s.name = sname
81
+ s.created_dt = dt if dt
82
+ s.save!
83
+ elsif s.body != body
84
+ s.body = body
85
+ s.created_dt = dt if dt
86
+ s.save!
87
+ end
88
+ end
89
+
90
+ def load_script_bodies(bodies, dt = nil)
91
+ bodies.each do |sname, body|
92
+ load_a_script(sname, body, dt)
93
+ end
94
+
95
+ # Create a new tag if scripts were modified after the last tag
96
+ tag = Marty::Tag.get_latest1
97
+ latest = Marty::Script.order('created_dt DESC').first
98
+
99
+ tag_time = (dt || [latest.try(:created_dt), Time.now].compact.max) +
100
+ 1.second
101
+
102
+ # If no tag_time is provided, the tag created_dt will be the same
103
+ # as the scripts.
104
+ tag = Marty::Tag.do_create(tag_time, 'tagged from load scripts') if
105
+ !(tag && latest) || tag.created_dt <= latest.created_dt
106
+
107
+ tag
108
+ end
109
+
110
+ def load_scripts(path = nil, dt = nil)
111
+ files = get_script_file_paths(path)
112
+
113
+ bodies = read_script_files(files)
114
+
115
+ load_script_bodies(bodies, dt)
116
+ end
117
+
118
+ def read_script_files(files)
119
+ files.map do |fname, fpath|
120
+ script_name = fname.camelize
121
+ [script_name, File.read(fpath)]
122
+ end
123
+ end
124
+
125
+ def get_script_filenames(paths = nil)
126
+ get_script_file_paths(paths).values
127
+ end
128
+
129
+ def get_script_file_paths(paths = nil)
130
+ paths = get_script_paths(paths)
131
+
132
+ paths.each_with_object({}) do |path, filenames|
133
+ Dir.glob("#{path}/**/*.dl").each do |filename|
134
+ base_pathname = Pathname.new(path)
135
+ pathname = Pathname.new(filename).relative_path_from(base_pathname)
136
+ relative_file_name = pathname.sub_ext('').to_s
137
+
138
+ next if filenames.key?(relative_file_name)
139
+
140
+ filenames[relative_file_name] = filename
141
+ end
142
+ end
143
+ end
144
+
145
+ def get_script_paths(paths)
146
+ paths_from_config = Rails.configuration.marty.delorean_scripts_path
147
+
148
+ return Array(paths) if paths
149
+ return paths_from_config if paths_from_config.present?
150
+
151
+ [
152
+ "#{Rails.root}/delorean",
153
+ # FIXME: HACKY, wouldn't it be better to use
154
+ # Gem::Specification.find_by_name("marty").gem_dir??
155
+ File.expand_path('../../../../delorean', __FILE__),
156
+ ]
157
+ end
158
+
159
+ def delete_scripts
160
+ ActiveRecord::Base.connection.
161
+ execute('ALTER TABLE marty_scripts DISABLE TRIGGER USER;')
162
+ Marty::Script.delete_all
163
+ ActiveRecord::Base.connection.
164
+ execute('ALTER TABLE marty_scripts ENABLE TRIGGER USER;')
165
+ end
166
+ end
159
167
  end
@@ -1,3 +1,3 @@
1
1
  module Marty
2
- VERSION = '2.6.1'
2
+ VERSION = '2.6.2'
3
3
  end
@@ -9,20 +9,6 @@ namespace :marty do
9
9
  end
10
10
  end
11
11
 
12
- desc 'remove all loaded scripts from the database'
13
- task delete_scripts: :environment do
14
- Marty::Script.delete_scripts
15
- end
16
-
17
- desc 'load scripts from the LOAD_DIR directory'
18
- task load_scripts: :environment do
19
- Mcfly.whodunnit =
20
- Marty::User.find_by_login(Rails.configuration.marty.system_account)
21
- raise 'must have system user account seeded' unless Mcfly.whodunnit
22
- load_dir = ENV['LOAD_DIR']
23
- Marty::Script.load_scripts(load_dir)
24
- end
25
-
26
12
  # currently this is for delorean style rules only. if other types were ever
27
13
  # added (eg some sort of SQL rule like apollo has), that would probably be
28
14
  # a new rake task
@@ -0,0 +1,18 @@
1
+ namespace :marty do
2
+ desc 'remove all loaded scripts from the database'
3
+ task delete_scripts: :environment do
4
+ Marty::Script.delete_scripts
5
+ end
6
+
7
+ desc 'load scripts from the LOAD_DIR directory'
8
+ task load_scripts: :environment do
9
+ Mcfly.whodunnit = Marty::User.find_by_login(
10
+ Rails.configuration.marty.system_account
11
+ )
12
+
13
+ raise 'must have system user account seeded' unless Mcfly.whodunnit
14
+
15
+ load_dir = ENV['LOAD_DIR']
16
+ Marty::Script.load_scripts(load_dir)
17
+ end
18
+ end
@@ -5,6 +5,7 @@ require 'digest/md5'
5
5
  require 'base64'
6
6
  require 'zlib'
7
7
  require 'csv'
8
+ require 'pathname'
8
9
 
9
10
  Gem::Specification.new do |s|
10
11
  s.name = 'marty'
@@ -32,7 +33,7 @@ Gem::Specification.new do |s|
32
33
 
33
34
  s.add_dependency 'axlsx', '3.0.0pre'
34
35
 
35
- s.add_dependency 'delorean_lang', '~> 0.5.0'
36
+ s.add_dependency 'delorean_lang', '~> 0.5.2'
36
37
  s.add_dependency 'mcfly', '~> 0.0.20'
37
38
 
38
39
  s.add_dependency 'coderay'
@@ -0,0 +1 @@
1
+ # Empty script
@@ -113,7 +113,7 @@ describe Marty::Script do
113
113
 
114
114
  describe '.load_scripts' do
115
115
  before(:each) do
116
- allow(Marty::Script).to receive(:load_script_bodies)
116
+ allow(Marty::Script).to receive(:load_script_bodies).and_call_original
117
117
  end
118
118
 
119
119
  let(:scripts_path) do
@@ -122,11 +122,25 @@ describe Marty::Script do
122
122
  let(:now) { Time.zone.now - 1.minute }
123
123
  let(:ls1) { File.read("#{scripts_path}/script1.dl") }
124
124
  let(:ls2) { File.read("#{scripts_path}/script2.dl") }
125
+ let(:ls3) { File.read("#{scripts_path}/namespace/nested_namespace/script3.dl") }
125
126
 
126
127
  it 'reads in the files and loads the script bodies' do
127
128
  Marty::Script.load_scripts(scripts_path, now)
129
+ expected_args = match_array([
130
+ ['Script1', ls1],
131
+ ['Script2', ls2],
132
+ ['Namespace::NestedNamespace::Script3', ls3]
133
+ ])
134
+
128
135
  expect(Marty::Script).to have_received(:load_script_bodies).
129
- with(match_array([['Script1', ls1], ['Script2', ls2]]), now)
136
+ with(expected_args, now)
137
+
138
+ loaded_script_names = Marty::Script.pluck(:name).sort
139
+ expect(loaded_script_names).to eq [
140
+ 'Namespace::NestedNamespace::Script3',
141
+ 'Script1',
142
+ 'Script2'
143
+ ]
130
144
  end
131
145
  end
132
146
 
@@ -140,7 +154,7 @@ describe Marty::Script do
140
154
 
141
155
  it 'gets the files from the specified directory' do
142
156
  Marty::Script.get_script_filenames('/test')
143
- expect(Dir).to have_received(:glob).with('/test/*.dl')
157
+ expect(Dir).to have_received(:glob).with('/test/**/*.dl')
144
158
  end
145
159
 
146
160
  it 'returns the files in the given directory' do
@@ -151,9 +165,9 @@ describe Marty::Script do
151
165
 
152
166
  context 'with duplicate script file names' do
153
167
  it 'returns only the unique file names' do
154
- allow(Dir).to receive(:glob).with('/test1/*.dl').
168
+ allow(Dir).to receive(:glob).with('/test1/**/*.dl').
155
169
  and_return(['/test1/sc1.dl', '/test1/sc2.dl'])
156
- allow(Dir).to receive(:glob).with('/test2/*.dl').
170
+ allow(Dir).to receive(:glob).with('/test2/**/*.dl').
157
171
  and_return(['/test2/sc2.dl', '/test2/sc3.dl'])
158
172
  expect(Marty::Script.get_script_filenames(['/test1', '/test2'])).
159
173
  to match_array(['/test1/sc1.dl', '/test1/sc2.dl', '/test2/sc3.dl'])
@@ -164,9 +178,9 @@ describe Marty::Script do
164
178
  it 'gets the files from the default paths' do
165
179
  allow(Dir).to receive(:glob).and_return([])
166
180
  Marty::Script.get_script_filenames
167
- expect(Dir).to have_received(:glob).with("#{Rails.root}/delorean/*.dl")
181
+ expect(Dir).to have_received(:glob).with("#{Rails.root}/delorean/**/*.dl")
168
182
  expect(Dir).to have_received(:glob).
169
- with(File.expand_path('../../../delorean/*.dl', __FILE__))
183
+ with(File.expand_path('../../../delorean/**/*.dl', __FILE__))
170
184
  expect(Dir).to have_received(:glob).twice
171
185
  end
172
186
  end
@@ -180,7 +194,7 @@ describe Marty::Script do
180
194
  it 'gets the files from the specified path' do
181
195
  allow(Dir).to receive(:glob).and_return([])
182
196
  Marty::Script.get_script_filenames
183
- expect(Dir).to have_received(:glob).with('/conf_test/*.dl')
197
+ expect(Dir).to have_received(:glob).with('/conf_test/**/*.dl')
184
198
  end
185
199
  end
186
200
  end
@@ -8,7 +8,7 @@ describe Marty::Diagnostic::DelayedJobWorkers do
8
8
  ip || Marty::Helper.my_ip => {
9
9
  'Delayed Workers / Node' => {
10
10
  'description' => error ? '3' : '4',
11
- 'status' => status || true,
11
+ 'status' => status.nil? ? true : status,
12
12
  'consistent' => nil
13
13
  },
14
14
  }
@@ -68,15 +68,49 @@ module Marty; module RSpec; module Components
68
68
  find('#' + el).click
69
69
  end
70
70
 
71
- def get_col_vals(col, cnt = row_count, init = 0)
71
+ # filter_col and filter_col_toggle expect sortable column
72
+ # might need to allow to specify the number of :down to send.
73
+ # for now, four :downs to get to the filter, :right opens it
74
+ # then enter value and press return
75
+ def filter_col(col, value)
76
+ el = run_js <<-JS
77
+ #{ext_var(grid, 'grid')}
78
+ return #{ext_find(ext_arg('gridcolumn', text: col), 'grid')}.id
79
+ JS
80
+
81
+ c = find('#' + el)
82
+ c.send_keys([:down, :down, :down, :down, :right, value, :return])
83
+ sleep 1.0
84
+ c.click
85
+ end
86
+
87
+ def filter_col_toggle(col)
88
+ el = run_js <<-JS
89
+ #{ext_var(grid, 'grid')}
90
+ return #{ext_find(ext_arg('gridcolumn', text: col), 'grid')}.id
91
+ JS
92
+
93
+ c = find('#' + el)
94
+ c.send_keys([:down, :down, :down, :down, ' ', :escape])
95
+ sleep 1.0
96
+ end
97
+
98
+ def get_col_vals(col, cnt = row_count, init = 0, date_only = true)
72
99
  # NOTE: does not validate the # of rows
73
100
  run_js <<-JS
74
101
  var result = [];
75
102
  for (var i = #{init}; i < #{init.to_i + cnt.to_i}; i++) {
76
103
  #{ext_cell_val('i', col, grid)}
77
- if(value instanceof Date){
78
- result.push(value.toISOString().substring(0,value.toISOString().indexOf('T')));
79
- } else {
104
+ if(value instanceof Date) {
105
+ if (#{date_only}){
106
+ result.push(value.toISOString().split('T')[0]);
107
+ }
108
+ else
109
+ {
110
+ result.push(value.toISOString());
111
+ }
112
+ }
113
+ else {
80
114
  result.push(value);
81
115
  };
82
116
  };
@@ -113,6 +147,14 @@ module Marty; module RSpec; module Components
113
147
  el
114
148
  end
115
149
 
150
+ def select_row_range(st, en)
151
+ resid = run_js(<<-JS, 10.0)
152
+ #{ext_var(grid, 'grid')}
153
+ grid.getSelectionModel().selectRange(#{st-1}, #{en-1});
154
+ JS
155
+ wait_for_ajax
156
+ end
157
+
116
158
  def set_row_vals row, fields
117
159
  js_set_fields = fields.each_pair.map do |k, v|
118
160
  "r.set('#{k}', '#{v}');"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marty
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.1
4
+ version: 2.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arman Bostani
@@ -14,7 +14,7 @@ authors:
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
- date: 2019-03-29 00:00:00.000000000 Z
17
+ date: 2019-04-09 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: pg
@@ -64,14 +64,14 @@ dependencies:
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: 0.5.0
67
+ version: 0.5.2
68
68
  type: :runtime
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: 0.5.0
74
+ version: 0.5.2
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: mcfly
77
77
  requirement: !ruby/object:Gem::Requirement
@@ -424,6 +424,7 @@ files:
424
424
  - lib/pyxll/pyxll.cfg
425
425
  - lib/pyxll/sample.xlsx
426
426
  - lib/tasks/marty_tasks.rake
427
+ - lib/tasks/scripts_tasks.rake
427
428
  - make-dummy.mk
428
429
  - marty.gemspec
429
430
  - other/marty/api/base.rb
@@ -531,6 +532,8 @@ files:
531
532
  - spec/dummy/delorean/marty_fields.dl
532
533
  - spec/dummy/delorean/styles.dl
533
534
  - spec/dummy/delorean/table_report.dl
535
+ - spec/dummy/delorean/test_namespace/nested_namespace/test.dl
536
+ - spec/dummy/delorean/test_namespace/test.dl
534
537
  - spec/dummy/lib/assets/.gitkeep
535
538
  - spec/dummy/lib/class_list.rb
536
539
  - spec/dummy/lib/gemini/my_rule_script_set.rb
@@ -1563,6 +1566,7 @@ files:
1563
1566
  - spec/fixtures/csv/rule/XyzRule.csv
1564
1567
  - spec/fixtures/json/rpc_controller.json
1565
1568
  - spec/fixtures/misc/struct_compare_tests.txt
1569
+ - spec/fixtures/scripts/load_tests/namespace/nested_namespace/script3.dl
1566
1570
  - spec/fixtures/scripts/load_tests/script1.dl
1567
1571
  - spec/fixtures/scripts/load_tests/script2.dl
1568
1572
  - spec/job_helper.rb