cpee-model-management 1.0.14 → 1.0.18

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: 9db0f107cad7e45a47d7d197523ebfcc9f493512f614777573c3d567c3270b6c
4
- data.tar.gz: fed6d38fc3a757e2dd074bad56f579a5a0b7d3863bb14a2ef325a5df28ca2526
3
+ metadata.gz: a0f20ba70c3f8b275794d93cc37318ea2c9a2f6cac142b97955b7df37bf19c78
4
+ data.tar.gz: 727d1d7684b81ce572a09fb6afa63365e74c7f9d40d231fb8495d7797f3f2057
5
5
  SHA512:
6
- metadata.gz: 30d3c26a3b7a13afacf601ae8fa99178610ec37296be9ae4de888770a07245df77f031b5368f95dbd338cef03752d0c34c3e2ee7c62e79b05775dfc89bd53123
7
- data.tar.gz: e958d85ebbdf708c35accd0fcaed6fdd79f34702042c00f67aee5d3d39f6dcbfdd0fd81b8a64c0bce9728bbd1b55161a8fe85d8832bb98de55b4015153867f3e
6
+ metadata.gz: 6d765472f0d8e08bbc6a43e2e6fb779065ee86606cd5030ff82a9e69134f29a01afcad618c81d089a66d06b893f6f64133555ef578ed2a9e9c1504faedd8f65f
7
+ data.tar.gz: 522152b30e278e976ae047cd4a355f40f73e19d8abf7ddb809e1385bd39007e9f6b1904b3f98d8334dd031f1d1fb30af4952581978128219f521741c401669f4
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "cpee-model-management"
3
- s.version = "1.0.14"
3
+ s.version = "1.0.18"
4
4
  s.platform = Gem::Platform::RUBY
5
5
  s.license = "LGPL-3.0"
6
6
  s.summary = "(Lifecycle) manage your process models in a directory or git repo."
@@ -22,4 +22,5 @@ Gem::Specification.new do |s|
22
22
 
23
23
  s.add_runtime_dependency 'riddl', '~> 0.99'
24
24
  s.add_runtime_dependency 'json', '~> 2.1'
25
+ s.add_runtime_dependency 'cpee', '~> 2.1', '>= 2.1.7'
25
26
  end
@@ -7,8 +7,6 @@ new = File.basename(new)
7
7
  `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple add "#{new}" 2>/dev/null`
8
8
  `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple add "#{new}.active" 2>/dev/null`
9
9
  `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple add "#{new}.active-uuid" 2>/dev/null`
10
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple add "#{new}.author" 2>/dev/null`
11
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple add "#{new}.creator" 2>/dev/null`
12
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple add "#{new}.stage" 2>/dev/null`
10
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple add "#{new}.attrs" 2>/dev/null`
13
11
  `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple commit -m "#{author.gsub(/"/,"'")}"`
14
12
  `GIT_TERMINAL_PROMPT=0 git push` rescue nil
@@ -38,12 +38,10 @@ module CPEE
38
38
  p2 = Pathname.new(File.dirname(new))
39
39
  told = File.basename(old)
40
40
  tnew = File.join(p1.relative_path_from(p1).to_s,File.basename(new))
41
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple mv "#{told}" "#{tnew}" 2>/dev/null`
42
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{told + '.active'}" 2>/dev/null`
43
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{told + '.active-uuid'}" 2>/dev/null`
44
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple mv "#{told + '.author'}" "#{tnew + '.author'}" 2>/dev/null`
45
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple mv "#{told + '.creator'}" "#{tnew + '.creator'}" 2>/dev/null`
46
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple mv "#{told + '.stage'}" "#{tnew + '.stage'}" 2>/dev/null`
41
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple mv "#{told}" "#{tnew}" 2>/dev/null`
42
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{told + '.active'}" 2>/dev/null`
43
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{told + '.active-uuid'}" 2>/dev/null`
44
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple mv "#{told + '.attrs'}" "#{tnew + '.attrs'}" 2>/dev/null`
47
45
  Dir.chdir(cdir)
48
46
  CPEE::ModelManagement::fs_mv(models,old,new) # fallback
49
47
  end
@@ -55,9 +53,7 @@ module CPEE
55
53
  FileUtils.rm_rf(tnew)
56
54
  `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{tnew}.active" 2>/dev/null`
57
55
  `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{tnew}.active-uuid" 2>/dev/null`
58
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{tnew}.author" 2>/dev/null`
59
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{tnew}.creator" 2>/dev/null`
60
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{tnew}.stage" 2>/dev/null`
56
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{tnew}.attrs" 2>/dev/null`
61
57
  Dir.chdir(cdir)
62
58
  CPEE::ModelManagement::fs_rm(models,new) # fallback
63
59
  end
@@ -81,9 +77,7 @@ module CPEE
81
77
  FileUtils.mv(fname,fnname) rescue nil
82
78
  File.delete(fname + '.active',fnname + '.active') rescue nil
83
79
  File.delete(fname + '.active-uuid',fnname + '.active-uuid') rescue nil
84
- FileUtils.mv(fname + '.author',fnname + '.author') rescue nil
85
- FileUtils.mv(fname + '.creator',fnname + '.creator') rescue nil
86
- FileUtils.mv(fname + '.stage',fnname + '.stage') rescue nil
80
+ FileUtils.mv(fname + '.attrs',fnname + '.attrs') rescue nil
87
81
  end
88
82
  def self::fs_cp(models,old,new)
89
83
  fname = File.join(models,old)
@@ -91,18 +85,14 @@ module CPEE
91
85
  FileUtils.cp(fname,fnname)
92
86
  File.delete(fname + '.active',fnname + '.active') rescue nil
93
87
  File.delete(fname + '.active-uuid',fnname + '.active-uuid') rescue nil
94
- FileUtils.cp(fname + '.author',fnname + '.author') rescue nil
95
- FileUtils.cp(fname + '.creator',fnname + '.creator') rescue nil
96
- FileUtils.cp(fname + '.stage',fnname + '.stage') rescue nil
88
+ FileUtils.cp(fname + '.attrs',fnname + '.attrs') rescue nil
97
89
  end
98
90
  def self::fs_rm(models,new)
99
91
  fname = File.join(models,new)
100
92
  FileUtils.rm_rf(fname)
101
93
  File.delete(fname + '.active') rescue nil
102
94
  File.delete(fname + '.active-uuid') rescue nil
103
- File.delete(fname + '.author') rescue nil
104
- File.delete(fname + '.creator') rescue nil
105
- File.delete(fname + '.stage') rescue nil
95
+ File.delete(fname + '.attrs') rescue nil
106
96
  end
107
97
  def self::fs_shift(models,new)
108
98
  fname = File.join(models,new)
@@ -169,14 +159,16 @@ module CPEE
169
159
  if op == 'delete'
170
160
  { :op => op, :type => :dir, :name => File.basename(f) }
171
161
  else
172
- { :op => op, :type => :dir, :name => File.basename(f), :creator => File.read(f + '.creator'), :date => File.mtime(f).xmlschema }
162
+ attrs = JSON::load File.open(f + '.attrs')
163
+ { :op => op, :type => :dir, :name => File.basename(f), :creator => attrs['creator'], :date => File.mtime(f).xmlschema }
173
164
  end
174
165
  else
175
166
  if op == 'delete'
176
167
  { :op => op, :type => :file, :name => f.sub(Regexp.compile(File.join(models,'/')),'') }
177
168
  else
178
- fstage = File.read(f + '.stage').strip rescue 'draft'
179
- { :op => op, :type => :file, :name => f.sub(Regexp.compile(File.join(models,'/')),''), :creator => File.read(f + '.creator'), :author => File.read(f + '.author'), :stage => fstage, :date => File.mtime(f).xmlschema }
169
+ attrs = JSON::load File.open(f + '.attrs')
170
+ fstage = attrs['design_stage'] rescue 'draft'
171
+ { :op => op, :type => :file, :name => f.sub(Regexp.compile(File.join(models,'/')),''), :creator => attrs['creator'], :author => attrs['author'], :stage => fstage, :date => File.mtime(f).xmlschema }
180
172
  end
181
173
  end
182
174
  what[:source] = s.sub(/models\//,'') unless s.nil?
@@ -193,12 +185,13 @@ module CPEE
193
185
  stage = [@p[0]&.value] || ['draft']
194
186
  stage << views[stage[0]] if views && views[stage[0]]
195
187
 
196
-
197
188
  names = Dir.glob(File.join(models,where,'*.dir')).map do |f|
198
- { :type => :dir, :name => File.basename(f), :creator => File.read(f + '.creator'), :date => File.mtime(f).xmlschema }
189
+ attrs = JSON::load File.open(f + '.attrs')
190
+ { :type => :dir, :name => File.basename(f), :creator => attrs['creator'], :date => File.mtime(f).xmlschema }
199
191
  end.compact.uniq.sort_by{ |e| e[:name] } + Dir.glob(File.join(models,where,'*.xml')).map do |f|
200
- fstage = File.read(f + '.stage').strip rescue 'draft'
201
- { :type => :file, :name => File.basename(f), :creator => File.read(f + '.creator'), :author => File.read(f + '.author'), :stage => fstage, :date => File.mtime(f).xmlschema } if stage.include?(fstage)
192
+ attrs = JSON::load File.open(f + '.attrs')
193
+ fstage = attrs['design_stage'] rescue 'draft'
194
+ { :type => :file, :name => File.basename(f), :creator => attrs['creator'], :author => attrs['author'], :guarded => attrs['guarded'], :guarded_id => attrs['guarded_id'], :stage => fstage, :date => File.mtime(f).xmlschema } if stage.include?(fstage)
202
195
  end.compact.uniq.sort_by{ |e| e[:name] }
203
196
 
204
197
  Riddl::Parameter::Complex.new('list','application/json',JSON::pretty_generate(names))
@@ -212,10 +205,12 @@ module CPEE
212
205
  stage << views[stage[0]] if views && views[stage[0]]
213
206
 
214
207
  names = Dir.glob(File.join(models,'*.dir/*.xml')).map do |f|
215
- { :type => :file, :name => File.join(File.basename(File.dirname(f)),File.basename(f)), :creator => File.read(f + '.creator'), :date => File.mtime(f).xmlschema }
208
+ attrs = JSON::load File.open(f + '.attrs')
209
+ { :type => :file, :name => File.join(File.basename(File.dirname(f)),File.basename(f)), :creator => attrs['creator'], :date => File.mtime(f).xmlschema }
216
210
  end.compact.uniq.sort_by{ |e| e[:name] } + Dir.glob(File.join(models,'*.xml')).map do |f|
217
- fstage = File.read(f + '.stage').strip rescue 'draft'
218
- { :type => :file, :name => File.basename(f), :creator => File.read(f + '.creator'), :author => File.read(f + '.author'), :stage => fstage, :date => File.mtime(f).xmlschema } if stage.include?(fstage)
211
+ attrs = JSON::load File.open(f + '.attrs')
212
+ fstage = attrs['design_stage'] rescue 'draft'
213
+ { :type => :file, :name => File.basename(f), :creator => attrs['creator'], :author => attrs['author'], :guarded => attrs['guarded'], :guarded_id => attrs['guarded_id'], :stage => fstage, :date => File.mtime(f).xmlschema } if stage.include?(fstage)
219
214
  end.compact.uniq.sort_by{ |e| e[:name] }
220
215
 
221
216
  Riddl::Parameter::Complex.new('list','application/json',JSON::pretty_generate(names))
@@ -241,6 +236,7 @@ module CPEE
241
236
  dn = CPEE::ModelManagement::get_dn @h['DN']
242
237
  author = dn['GN'] + ' ' + dn['SN']
243
238
 
239
+ attrs = {}
244
240
  XML::Smart::modify(fname) do |doc|
245
241
  doc.register_namespace 'p', 'http://cpee.org/ns/properties/2.0'
246
242
  doc.find('/p:testset/p:attributes/p:author').each do |ele|
@@ -252,9 +248,11 @@ module CPEE
252
248
  doc.find('/p:testset/p:attributes/p:theme').each do |ele|
253
249
  ele.text = themes[nstage] || 'model'
254
250
  end
251
+ attrs = doc.find('/p:testset/p:attributes/*').map do |e|
252
+ [e.qname.name,e.text]
253
+ end.to_h
255
254
  end
256
- File.write(fname + '.author',author)
257
- File.write(fname + '.stage',nstage)
255
+ File.write(fname + '.attrs',JSON::pretty_generate(attrs))
258
256
 
259
257
  CPEE::ModelManagement::op author, 'shift', models, File.join('.', where, name + '.xml'), File.join('.', where, name + '.xml')
260
258
  CPEE::ModelManagement::notify conns, 'shift', models, fname, fname
@@ -281,6 +279,7 @@ module CPEE
281
279
  dn = CPEE::ModelManagement::get_dn @h['DN']
282
280
  author = dn['GN'] + ' ' + dn['SN']
283
281
 
282
+ attrs = {}
284
283
  XML::Smart::modify(fname) do |doc|
285
284
  doc.register_namespace 'p', 'http://cpee.org/ns/properties/2.0'
286
285
  doc.find('/p:testset/p:attributes/p:info').each do |ele|
@@ -289,8 +288,11 @@ module CPEE
289
288
  doc.find('/p:testset/p:attributes/p:author').each do |ele|
290
289
  ele.text = author
291
290
  end
291
+ attrs = doc.find('/p:testset/p:attributes/*').map do |e|
292
+ [e.qname.name,e.text]
293
+ end.to_h
292
294
  end
293
- File.write(fname + '.author',author)
295
+ File.write(fname + '.attrs',JSON::pretty_generate(attrs))
294
296
 
295
297
  CPEE::ModelManagement::op author, 'mv', models, File.join('.', where, nname + '.xml'), File.join('.', where, name + '.xml')
296
298
  CPEE::ModelManagement::notify conns, 'rename', models, fnname, fname
@@ -313,7 +315,23 @@ module CPEE
313
315
 
314
316
  dn = CPEE::ModelManagement::get_dn @h['DN']
315
317
  author = dn['GN'] + ' ' + dn['SN']
316
- File.write(fname + '.author',author)
318
+
319
+ attrs = JSON::load File.open(fname + '.attrs')
320
+ attrs['author'] = author
321
+ File.write(fname + '.attrs',JSON::pretty_generate(attrs))
322
+
323
+ Dir.glob(File.join(fname + '/*.xml')).each do |f|
324
+ XML::Smart::modify(f) do |doc|
325
+ doc.register_namespace 'p', 'http://cpee.org/ns/properties/2.0'
326
+ doc.find('/p:testset/p:attributes/p:design_dir').each do |ele|
327
+ ele.text = nname + '.dir'
328
+ end
329
+ attrs = doc.find('/p:testset/p:attributes/*').map do |e|
330
+ [e.qname.name,e.text]
331
+ end.to_h
332
+ end
333
+ File.write(f + '.attrs',JSON::pretty_generate(attrs))
334
+ end
317
335
 
318
336
  CPEE::ModelManagement::op author, 'mv', models, File.join(nname + '.dir'), File.join(name + '.dir')
319
337
  CPEE::ModelManagement::notify conns, 'rename', models, fnname, fname
@@ -339,8 +357,11 @@ module CPEE
339
357
 
340
358
  Dir.mkdir(fname)
341
359
  FileUtils.touch(File.join(fname,'.gitignore'))
342
- File.write(fname + '.creator',creator)
343
- File.write(fname + '.author',creator)
360
+
361
+ attrs = {}
362
+ attrs['creator'] = creator
363
+ attrs['author'] = creator
364
+ File.write(fname + '.attrs',JSON::pretty_generate(attrs))
344
365
 
345
366
  CPEE::ModelManagement::op creator, 'add', models, name + '.dir'
346
367
  CPEE::ModelManagement::notify conns, 'create', models, fname
@@ -364,7 +385,8 @@ module CPEE
364
385
  source = @p[1] ? File.join(models,where,@p[1].value) : (templates[stage] ? templates[stage] : 'testset.xml')
365
386
  fname = File.join(models,where,name + '.xml')
366
387
 
367
- stage = File.read(source + '.stage') if stage.nil? && File.exists?(source + '.stage')
388
+ attrs = JSON::load File.open(fname + '.attrs') rescue {}
389
+ stage = attrs['design_stage'] if stage.nil? && attrs['design_stage']
368
390
  stage = views[stage] if views && views[stage]
369
391
 
370
392
  counter = 0
@@ -376,6 +398,7 @@ module CPEE
376
398
  dn = CPEE::ModelManagement::get_dn @h['DN']
377
399
  creator = dn['GN'] + ' ' + dn['SN']
378
400
  FileUtils.cp(source,fname)
401
+ attrs = {}
379
402
  XML::Smart::modify(fname) do |doc|
380
403
  doc.register_namespace 'p', 'http://cpee.org/ns/properties/2.0'
381
404
  doc.find('/p:testset/p:attributes/p:info').each do |ele|
@@ -398,10 +421,11 @@ module CPEE
398
421
  ele.text = stage
399
422
  end
400
423
  end
424
+ attrs = doc.find('/p:testset/p:attributes/*').map do |e|
425
+ [e.qname.name,e.text]
426
+ end.to_h
401
427
  end
402
- File.write(fname + '.creator',creator)
403
- File.write(fname + '.author',creator)
404
- File.write(fname + '.stage',stage)
428
+ File.write(fname + '.attrs',JSON::pretty_generate(attrs))
405
429
 
406
430
  CPEE::ModelManagement::op creator, 'add', models, File.join('.', where, name + '.xml')
407
431
  CPEE::ModelManagement::notify conns, 'create', models, fname
@@ -496,13 +520,17 @@ module CPEE
496
520
  dn = CPEE::ModelManagement::get_dn @h['DN']
497
521
  author = dn['GN'] + ' ' + dn['SN']
498
522
  if !File.exist?(File.join(models,to,name + '.xml'))
523
+ attrs = {}
499
524
  XML::Smart::modify(fname) do |doc|
500
525
  doc.register_namespace 'p', 'http://cpee.org/ns/properties/2.0'
501
526
  doc.find('/p:testset/p:attributes/p:design_dir').each do |ele|
502
527
  ele.text = to
503
528
  end
529
+ attrs = doc.find('/p:testset/p:attributes/*').map do |e|
530
+ [e.qname.name,e.text]
531
+ end.to_h
504
532
  end
505
- File.write(fname + '.author',author)
533
+ File.write(fname + '.attrs',JSON::pretty_generate(attrs))
506
534
 
507
535
  CPEE::ModelManagement::op author, 'mv', models, File.join('.', to, name + '.xml'), File.join('.', where, name + '.xml')
508
536
  CPEE::ModelManagement::notify conns, 'move', models, File.join(models,to,name + '.xml'), fname
@@ -522,20 +550,25 @@ module CPEE
522
550
 
523
551
  if File.exists?(fname)
524
552
  author = dn['GN'] + ' ' + dn['SN']
553
+ attrs = {}
525
554
  XML::Smart.string(cont) do |doc|
526
555
  doc.register_namespace 'p', 'http://cpee.org/ns/properties/2.0'
527
- unless File.exists?(File.join(models,where,name + '.xml.creator'))
528
- doc.find('/p:testset/p:attributes/p:author').each do |ele|
529
- File.write(File.join(models,where,name + '.xml.creator'),ele.text)
530
- end
531
- end
532
556
  doc.find('/p:testset/p:attributes/p:author').each do |ele|
533
557
  ele.text = dn['GN'] + ' ' + dn['SN']
534
558
  end
559
+ if doc.find('/p:testset/p:attributes/p:design_stage').empty?
560
+ doc.find('/p:testset/p:attributes').first.add('p:design_stage','draft')
561
+ else
562
+ doc.find('/p:testset/p:attributes/p:design_stage').each do |ele|
563
+ ele.text = 'draft' if ele.text.strip == ''
564
+ end
565
+ end
566
+ attrs = doc.find('/p:testset/p:attributes/*').map do |e|
567
+ [e.qname.name,e.text]
568
+ end.to_h
535
569
  File.write(fname,doc.to_s)
536
- File.write(fname + '.author',author)
537
- File.write(fname + '.stage',doc.find('string(/p:testset/p:attributes/p:design_stage)').sub(/^$/,'draft'))
538
570
  end
571
+ File.write(fname + '.attrs',JSON::pretty_generate(attrs))
539
572
  CPEE::ModelManagement::op author, 'add', models, File.join('.', where, name + '.xml')
540
573
  CPEE::ModelManagement::notify conns, 'put', models, fname
541
574
  else
data/server/model.xml CHANGED
@@ -25,8 +25,8 @@
25
25
  <info>none</info>
26
26
  <creator>Juergen Mangler</creator>
27
27
  <author>Juergen Mangler</author>
28
- <resource_restriction>none</resource_restriction>
29
- <resource_id></resource_id>
28
+ <guarded>none</guarded>
29
+ <guarded_id></guarded_id>
30
30
  <model_uuid></model_uuid>
31
31
  <model_version></model_version>
32
32
  <modeltype>CPEE</modeltype>
data/server/moma.conf CHANGED
@@ -1,5 +1,6 @@
1
1
  :port: 9316
2
2
  :models: models
3
+ :location: https://cpee.org/design/server/
3
4
  :instantiate: https://cpee.org/flow/start/
4
5
  :cockpit:
5
6
  draft: https://cpee.org/flow/model.html?monitor=
data/server/testset.xml CHANGED
@@ -18,8 +18,8 @@
18
18
  <creator>Juergen Mangler</creator>
19
19
  <author>Juergen Mangler</author>
20
20
  <modeltype>CPEE</modeltype>
21
- <resource_restriction>none</resource_restriction>
22
- <resource_id></resource_id>
21
+ <guarded>none</guarded>
22
+ <guarded_id></guarded_id>
23
23
  <model_uuid></model_uuid>
24
24
  <model_version></model_version>
25
25
  <theme>extended</theme>
data/tools/cpee-moma CHANGED
@@ -6,6 +6,7 @@ require 'fileutils'
6
6
  require 'xml/smart'
7
7
  require 'zip'
8
8
  require 'typhoeus'
9
+ require 'json'
9
10
  require 'securerandom'
10
11
 
11
12
  def wrap(s, width=78, indent=18)
@@ -85,7 +86,7 @@ if command == 'cpui'
85
86
  js_libs(p1)
86
87
  elsif command == 'convert'
87
88
  Dir['*.xml'].each do |f|
88
- XML::Smart.modify(f) do |doc|
89
+ XML::Smart.open(f) do |doc|
89
90
  doc.register_namespace 'x', 'http://cpee.org/ns/properties/2.0'
90
91
  if doc.root.qname.name == 'testset'
91
92
  name = File.basename(f,'.xml')
@@ -118,7 +119,6 @@ elsif command == 'convert'
118
119
  e.add('x:creator',creator)
119
120
  end
120
121
  end
121
- File.write(f + '.creator',creator)
122
122
 
123
123
  if (dt = doc.find('/x:testset/x:attributes/x:author')).length > 0
124
124
  dt.each do |e|
@@ -130,7 +130,6 @@ elsif command == 'convert'
130
130
  e.add('x:author',author)
131
131
  end
132
132
  end
133
- File.write(f + '.author',author)
134
133
 
135
134
  if (dt = doc.find('/x:testset/x:attributes/x:design_stage')).length > 0
136
135
  dt.each do |e|
@@ -142,7 +141,6 @@ elsif command == 'convert'
142
141
  e.add('x:design_stage',design_stage)
143
142
  end
144
143
  end
145
- File.write(f + '.stage',design_stage)
146
144
 
147
145
  dd = ENV['PWD'] || Dir.pwd
148
146
  ma = dd.scan(/\/([^\/]+\.dir)/)
@@ -162,9 +160,28 @@ elsif command == 'convert'
162
160
  e.text = name
163
161
  end
164
162
  end
163
+
164
+
165
+ attrs = doc.find('/x:testset/x:attributes/*').map do |e|
166
+ [e.qname.name,e.text]
167
+ end.to_h
168
+ File.write(f + '.attrs',JSON::pretty_generate(attrs))
169
+
170
+ File.unlink(f + '.creator') rescue nil
171
+ File.unlink(f + '.author') rescue nil
172
+ File.unlink(f + '.stage') rescue nil
165
173
  end
166
174
  end
167
175
  end
176
+ Dir['*.dir'].each do |f|
177
+ attrs = JSON::load File.open(f + '.attrs') rescue {}
178
+ attrs['creator'] = File.read(f + '.creator') if File.exists?(f + '.creator')
179
+ attrs['author'] = File.read(f + '.author') if File.exists?(f + '.author')
180
+ File.write(f + '.attrs',JSON::pretty_generate(attrs))
181
+
182
+ File.unlink(f + '.creator') rescue nil
183
+ File.unlink(f + '.author') rescue nil
184
+ end
168
185
  elsif command == 'new'
169
186
  if !File.exists?(p1)
170
187
  FileUtils.mkdir(File.join(p1)) rescue nil
data/ui/css/design.css CHANGED
@@ -22,6 +22,12 @@ form input {
22
22
 
23
23
  ui-behind {
24
24
  text-transform: capitalize;
25
+ font-weight: bold;
26
+ color: #d0d0d0;
27
+ }
28
+
29
+ ui-behind span {
30
+ cursor: pointer;
25
31
  }
26
32
 
27
33
  [is="x-ui-"] table.ui-table {
@@ -50,3 +56,7 @@ ui-behind {
50
56
  }
51
57
 
52
58
  [is="x-ui-"] ui-rest > ui-content > ui-area { padding: 1em; }
59
+
60
+ tr.contextmenuitem .capitalized {
61
+ text-transform: capitalize;
62
+ }
data/ui/index.html CHANGED
@@ -61,20 +61,35 @@
61
61
  <ui-tab class="" data-tab="models" >Models</ui-tab>
62
62
  <ui-tab class="inactive" data-tab="newmodel">New Model</ui-tab>
63
63
  <ui-tab class="inactive" data-tab="newdir" >New Dir</ui-tab>
64
- <ui-behind ></ui-behind>
64
+ <ui-space ></ui-space>
65
+ <ui-tab class="inactive" data-tab="running" >Running</ui-tab>
66
+ <ui-tab class="inactive" data-tab="stopped" >Stopped</ui-tab>
67
+ <ui-behind ><span></span></ui-behind>
65
68
  <ui-last ><a class="logo" href=".."></a></ui-last>
66
69
  </ui-tabbar>
67
70
  <ui-content class="noselect">
68
71
  <ui-area data-belongs-to-tab="models">
69
72
  <p>Your Models are saved/versioned in <a target='_blank' href='https://git-scm.com/'>GIT</a>. So fret not. Just send an email to <a href="mail:helpdesk@acdp.at">helpdesk@acdp.at</a> if you are lost. And as always: <a target='_blank' href='https://www.youtube.com/watch?v=kkxj5xVLyj0&feature=youtu.be&t=56'>get dressed for success</a>.</p>
70
73
  <table id="models" class='ui-table'>
74
+ <thead>
75
+ <th></th>
76
+ <th>Name</th>
77
+ <th><abbr title='force new instance'>F</abbr></th>
78
+ <th><abbr title='link to model source'>M</abbr></th>
79
+ <th>Changed By</th>
80
+ <th><abbr title='Guarded'>G</abbr></th>
81
+ <th><abbr title='Resource'>R</abbr></th>
82
+ <th>Changed At</th>
83
+ <th><abbr title='Operations'>Op</abbr></th>
84
+ </thead>
71
85
  <template id="up">
72
86
  <tr>
73
87
  <td data-class='folder' class="noselect">📁</td>
74
88
  <td data-class='name' data-full-name=''><a href=''></a></td>
75
89
  <td></td>
76
90
  <td></td>
77
- <td data-class='creator'></td>
91
+ <td></td>
92
+ <td></td>
78
93
  <td></td>
79
94
  <td data-class='date'></td>
80
95
  <td data-class=''></td>
@@ -86,7 +101,8 @@
86
101
  <td data-class='name' data-full-name=''><a href=''></a></td>
87
102
  <td></td>
88
103
  <td></td>
89
- <td data-class='creator'></td>
104
+ <td></td>
105
+ <td></td>
90
106
  <td></td>
91
107
  <td data-class='date'></td>
92
108
  <td data-class='ops' class="noselect"><span>…</span></td>
@@ -98,8 +114,9 @@
98
114
  <td data-class='name' data-full-name=''><a target='_blank' href=''></a></td>
99
115
  <td data-class='force'>[<a target='_blank' href='' title='force new instance'>F</a>]</td>
100
116
  <td data-class='raw'>[<a target='_blank' href='' title='link to model source'>M</a>]</td>
101
- <td data-class='creator'></td>
102
117
  <td data-class='author'></td>
118
+ <td data-class='guarded'><abbr title=''></abbr></td>
119
+ <td data-class='resource'></td>
103
120
  <td data-class='date'></td>
104
121
  <td data-class='ops' class="noselect"><span>…</span></td>
105
122
  </tr>
data/ui/js/design.js CHANGED
@@ -84,8 +84,17 @@ function paint(gdir,gstage) {
84
84
  $('[data-class=name] a',clone).attr('href','server/' + gdir + data['name'] + '/open?stage=' + gstage);
85
85
  $('[data-class=force] a',clone).attr('href','server/' + gdir + data['name'] + '/open-new?stage=' + gstage);
86
86
  $('[data-class=raw] a',clone).attr('href','server/' + gdir + data['name']);
87
+
88
+ $('[data-class=guarded] abbr',clone).attr('title',data['guarded'] || '');
89
+ $('[data-class=guarded] abbr',clone).text((data['guarded'] || '').match(/none/i) ? '' : (data['guarded'] || '').charAt(0).toUpperCase());
90
+ $('[data-class=resource]',clone).text(data['guarded_id'] || '');
91
+
92
+ if (data['guarded']) {
93
+ $('[data-class=guarded] abbr',clone).attr('title',data['guarded']);
94
+ $('[data-class=guarded] abbr',clone).text(data['guarded'].match(/none/i) ? '' : data['guarded'].charAt(0).toUpperCase());
95
+ $('[data-class=resource]',clone).text(data['guarded_what']);
96
+ }
87
97
  }
88
- $('[data-class=creator]',clone).text(data['creator']);
89
98
  $('[data-class=author]',clone).text(data['author']);
90
99
  $('[data-class=date]',clone).text(new Date(data['date']).strftime('%Y-%m-%d, %H:%M:%S'));
91
100
  $('#models tbody').append(clone);
@@ -94,6 +103,10 @@ function paint(gdir,gstage) {
94
103
  });
95
104
  }
96
105
 
106
+ function change_it(gdir,gstage) {
107
+ window.location.href = window.location.pathname + '?stage=' + gstage + '&dir=' + gdir;
108
+ }
109
+
97
110
  $(document).ready(function() {
98
111
  const queryString = window.location.search;
99
112
  const urlParams = new URLSearchParams(queryString);
@@ -103,9 +116,39 @@ $(document).ready(function() {
103
116
 
104
117
  es_init(gdir,gstage);
105
118
 
119
+ var shifts = []
120
+ $.ajax({
121
+ type: "GET",
122
+ url: "server/",
123
+ data: { stages: 'stages' },
124
+ success: (r) => {
125
+ shifts = shifts.concat(r);
126
+ shifts = shifts.filter(item => item !== gstage);
127
+ }
128
+ });
129
+
106
130
  $('input[name=stage]').val(gstage);
107
131
  $('input[name=dir]').val(gdir);
108
- $('ui-behind').text(gstage);
132
+ $('ui-behind span').text(gstage);
133
+ $('ui-behind span').click((e) => {
134
+ if (shifts.length > 0) {
135
+ var menu = {};
136
+ menu['Change to'] = [];
137
+ shifts.forEach(ele => {
138
+ menu['Change to'].push(
139
+ {
140
+ 'label': ele,
141
+ 'function_call': change_it,
142
+ 'text_icon': '➔',
143
+ 'type': undefined,
144
+ 'class': 'capitalized',
145
+ 'params': [gdir,ele]
146
+ }
147
+ );
148
+ });
149
+ new CustomMenu(e).contextmenu(menu);
150
+ }
151
+ });
109
152
 
110
153
  var dragged;
111
154
  $('#models').on('drag','td[data-class=model]',false);
@@ -117,7 +160,6 @@ $(document).ready(function() {
117
160
  e.preventDefault();
118
161
  e.stopPropagation();
119
162
  if (dragged) {
120
- console.log(dragged);
121
163
  var todir = $(e.currentTarget).parents('tr').find('td[data-class=name]').text();
122
164
  todir = todir.replace(/\./g,'');
123
165
  if (todir != '') {
@@ -127,16 +169,6 @@ $(document).ready(function() {
127
169
  dragged = undefined;
128
170
  }
129
171
  });
130
- var shifts = []
131
- $.ajax({
132
- type: "GET",
133
- url: "server/",
134
- data: { stages: 'stages' },
135
- success: (r) => {
136
- shifts = shifts.concat(r);
137
- shifts = shifts.filter(item => item !== gstage);
138
- }
139
- });
140
172
  $('#models').on('click','td[data-class=ops]',(e) => {
141
173
  var menu = {};
142
174
  var name = $(e.currentTarget).parents('tr').find('td[data-class=name]').attr('data-full-name');
@@ -181,7 +213,6 @@ $(document).ready(function() {
181
213
  );
182
214
  });
183
215
  }
184
- console.log(shifts);
185
216
  new CustomMenu(e).contextmenu(menu);
186
217
  });
187
218
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cpee-model-management
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.14
4
+ version: 1.0.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juergen eTM Mangler
8
8
  autorequire:
9
9
  bindir: tools
10
10
  cert_chain: []
11
- date: 2021-06-17 00:00:00.000000000 Z
11
+ date: 2021-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: riddl
@@ -38,6 +38,26 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '2.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: cpee
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.1'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 2.1.7
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '2.1'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 2.1.7
41
61
  description: see http://cpee.org
42
62
  email: juergen.mangler@gmail.com
43
63
  executables:
@@ -82,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
82
102
  - !ruby/object:Gem::Version
83
103
  version: '0'
84
104
  requirements: []
85
- rubygems_version: 3.1.6
105
+ rubygems_version: 3.2.22
86
106
  signing_key:
87
107
  specification_version: 4
88
108
  summary: "(Lifecycle) manage your process models in a directory or git repo."