cpee-logging-xes-yaml 1.3.4 → 1.3.5
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
- data/cpee-logging-xes-yaml.gemspec +1 -1
- data/tools/cpee-logging-xes-yaml +114 -41
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ddf89052e93d9c38c178377595703e815e14bc16a05b2c57cbf9ff73f65f12ad
|
4
|
+
data.tar.gz: c1fc949892594dd764c55338ddbe9d0eb74aa84a49799503c4a2cc5764f0f2c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: afa34dc21a86f7112a81958620b49d9dfb0457dbaba778d876b4cb24a9e8f31685168111e610848a73c5d26ca4efe38b1c509d2fd4065acec49ea8c6daec64e3
|
7
|
+
data.tar.gz: 1da376713380410325754f2dd18e8d70653ce0f0026b56c347ae1062ca8aeba7e7660568031df9fe0efa150a51239e98ce739329adafcf52fd7fd27fbff7fcfa
|
data/tools/cpee-logging-xes-yaml
CHANGED
@@ -25,6 +25,8 @@ require 'typhoeus'
|
|
25
25
|
require 'stringio'
|
26
26
|
require 'typhoeus'
|
27
27
|
require 'date'
|
28
|
+
require 'msgpack'
|
29
|
+
require 'csv'
|
28
30
|
|
29
31
|
def wrap(s, width=78, indent=19, extra_indent=2)
|
30
32
|
lines = []
|
@@ -46,7 +48,7 @@ def wrap(s, width=78, indent=19, extra_indent=2)
|
|
46
48
|
return lines.join "\n"
|
47
49
|
end
|
48
50
|
|
49
|
-
def follow(fname,io,copy,deep=0)
|
51
|
+
def follow(fname,io,copy,deep=0,index=nil)
|
50
52
|
tname = if fname =~ /\.xes\.shift\.yaml/
|
51
53
|
File.basename(fname,'.xes.shift.yaml')
|
52
54
|
elsif fname =~ /\.xes\.yaml/
|
@@ -58,7 +60,7 @@ def follow(fname,io,copy,deep=0)
|
|
58
60
|
end
|
59
61
|
YAML.load_stream(io) do |e|
|
60
62
|
if name = e.dig('log','trace','cpee:name')
|
61
|
-
|
63
|
+
index.write " " * deep + name + " (#{tname}) - #{e.dig('log','trace','concept:name')}\n"
|
62
64
|
end
|
63
65
|
if e.dig('event','cpee:lifecycle:transition') == 'task/instantiation'
|
64
66
|
base = e.dig('event','raw')
|
@@ -68,13 +70,14 @@ def follow(fname,io,copy,deep=0)
|
|
68
70
|
end
|
69
71
|
uuid = base.dig('CPEE-INSTANCE-UUID') rescue nil
|
70
72
|
if uuid
|
71
|
-
react File.dirname(fname) + "/#{uuid}.xes.yaml",copy,deep + 2
|
73
|
+
react File.dirname(fname) + "/#{uuid}.xes.yaml", copy, deep + 2, index
|
72
74
|
end
|
73
75
|
end
|
74
76
|
end
|
75
77
|
end
|
76
78
|
|
77
|
-
def react(name,copy=false,deep=0)
|
79
|
+
def react(name,copy=false,deep=0,index=nil)
|
80
|
+
index ||= File.open('index.txt','w')
|
78
81
|
if name.nil?
|
79
82
|
help
|
80
83
|
elsif name =~ /^https?:\/\//
|
@@ -83,59 +86,72 @@ def react(name,copy=false,deep=0)
|
|
83
86
|
file = Tempfile.new('sic')
|
84
87
|
file.write(res.body)
|
85
88
|
file.rewind
|
86
|
-
follow name, file, copy, deep
|
89
|
+
follow name, file, copy, deep, index
|
87
90
|
file.close
|
88
91
|
file.unlink
|
89
92
|
end
|
90
93
|
elsif File.exist? name
|
91
|
-
follow name, File.open(name), copy, deep
|
94
|
+
follow name, File.open(name), copy, deep, index
|
92
95
|
else
|
93
96
|
help
|
94
97
|
end
|
95
98
|
end
|
96
99
|
|
97
100
|
def extract(path)
|
101
|
+
unlink = false
|
98
102
|
if path =~ /^http.*/
|
99
|
-
|
100
|
-
|
101
|
-
|
103
|
+
unlink = true
|
104
|
+
text = Tempfile.new('extract-model-download')
|
105
|
+
request = Typhoeus::Request.new("www.example.com/huge.iso")
|
106
|
+
request.on_headers do |response|
|
107
|
+
if response.code != 200
|
108
|
+
raise "Request failed"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
request.on_body do |chunk|
|
112
|
+
text.write(chunk)
|
113
|
+
end
|
114
|
+
request.on_complete do |response|
|
115
|
+
text.rewind
|
102
116
|
end
|
117
|
+
request.run
|
103
118
|
else
|
104
|
-
text = File.
|
119
|
+
text = File.open(path)
|
105
120
|
end
|
106
121
|
yaml = Psych.load_stream(text)
|
107
122
|
changes = []
|
108
123
|
|
109
|
-
info = yaml.shift
|
124
|
+
info = yaml.shift
|
110
125
|
uuid = info.dig('log','trace','cpee:instance')
|
111
|
-
yaml.each
|
112
|
-
if
|
126
|
+
yaml.each do |el|
|
127
|
+
if el['event']['id:id'] == 'external' && (el.dig('event','cpee:lifecycle:transition') == 'endpoints/change' || el.dig('event','cpee:lifecycle:transition') == 'dataelements/change'|| el.dig('event','cpee:lifecycle:transition') == 'description/change')
|
113
128
|
changes.push(el)
|
114
129
|
end
|
115
130
|
end
|
116
|
-
#puts "found #{changes.size()} changes"
|
117
131
|
|
118
|
-
changes.sort!
|
119
|
-
#p changes.map() {|el| el.dig('event','time:timestamp')}
|
132
|
+
changes.sort! { |a,b| DateTime.strptime(a.dig('event','time:timestamp'),'%Y-%m-%dT%H:%M:%S.%L%:z') <=> DateTime.strptime(b.dig('event','time:timestamp'),'%Y-%m-%dT%H:%M:%S.%L%:z') }
|
120
133
|
|
121
134
|
de = ep = desc = nil
|
122
135
|
counter = 0
|
123
|
-
changes.each
|
124
|
-
if
|
136
|
+
changes.each do |change|
|
137
|
+
if change.dig('event','cpee:lifecycle:transition') == 'dataelements/change'
|
125
138
|
de = change.dig('event','data')
|
126
139
|
end
|
127
|
-
if
|
140
|
+
if change.dig('event','cpee:lifecycle:transition') == 'endpoints/change'
|
128
141
|
ep = change.dig('event','data')
|
129
142
|
end
|
130
|
-
if
|
143
|
+
if change.dig('event','cpee:lifecycle:transition') == 'description/change'
|
131
144
|
desc = change.dig('event','cpee:description')
|
132
145
|
end
|
133
|
-
if
|
146
|
+
if change.dig('event','cpee:lifecycle:transition') == 'description/change' || change.dig('event','cpee:lifecycle:transition') == 'endpoints/change'
|
134
147
|
yield uuid, de, ep, desc, counter if block_given?
|
135
148
|
counter += 1
|
136
149
|
end
|
137
150
|
end
|
138
151
|
|
152
|
+
text.close
|
153
|
+
text.unlink if unlink
|
154
|
+
|
139
155
|
[de, ep, desc]
|
140
156
|
end
|
141
157
|
|
@@ -153,21 +169,26 @@ ARGV.options { |opt|
|
|
153
169
|
opt.on("")
|
154
170
|
opt.on(wrap("new [DIR] scaffolds a sample logging service. Add a handler to a cpee instance to experience the pleasure."))
|
155
171
|
opt.on("")
|
156
|
-
opt.on(wrap("view [
|
172
|
+
opt.on(wrap("view [LOG] view the dependencies between processes and subprocesses. Works for local and remote logs. Examples:\n#{exname} view https://cpee.org/log/123.xes.yaml\n#{exname} view https://cpee.org/log/a.xes.yaml > index.txt\n#{exname} view ~/log/logs/456.xes.yaml"))
|
157
173
|
opt.on("")
|
158
|
-
opt.on(wrap("copy [
|
174
|
+
opt.on(wrap("copy [LOG] copy dependent processes and subprocesses to the current directory. Works for local and remote logs. Examples: \n#{exname} copy https://cpee.org/log/123.xes.yaml\n#{exname} copy ~/log/logs/456.xes.yaml"))
|
159
175
|
opt.on("")
|
160
176
|
opt.on(wrap("extract-all [LOG] extract cpee testset from cpee xes-yaml log. Works for local and remote logs. Write logs to files in folder named like the instance uuid contained in the log. Examples: \n#{exname} extract https://cpee.org/log/123.xes.yaml\n#{exname} extract ~/log/logs/456.xes.yaml"))
|
161
177
|
opt.on("")
|
162
|
-
opt.on(wrap("extract-last [LOG] extract cpee testset from cpee xes-yaml log. Works for local and remote logs. Write last revision of the model to stdout. Examples:\n#{exname} extract https://cpee.org/log/123.xes.yaml\n#{exname} extract ~/log/logs/456.xes.yaml"))
|
178
|
+
opt.on(wrap("extract-last [LOG] extract cpee testset from cpee xes-yaml log. Works for local and remote logs. Write last revision of the model to stdout. When called with out [LOG], models for all log files in the current directory are extracted. Examples:\n#{exname} extract https://cpee.org/log/123.xes.yaml\n#{exname} extract ~/log/logs/456.xes.yaml"))
|
179
|
+
opt.on("")
|
180
|
+
opt.on(wrap("index [LOG] creates an index for a log file, for more efficient parsing. When called without [LOG], indexes all log files in the current directory. Examples:\n#{exname} index https://cpee.org/log/123.xes.yaml\n#{exname} index ~/log/logs/456.xes.yaml"))
|
163
181
|
opt.parse!
|
164
182
|
}
|
165
|
-
|
183
|
+
|
184
|
+
if (ARGV.length < 1 || ARGV.length > 2)
|
166
185
|
puts ARGV.options
|
167
186
|
exit
|
168
|
-
|
187
|
+
elsif ARGV.length == 2
|
169
188
|
command = ARGV[0]
|
170
189
|
path = ARGV[1]
|
190
|
+
elsif ARGV.length == 1 && %w{index extract-last}.include?(ARGV[0])
|
191
|
+
command = ARGV[0]
|
171
192
|
end
|
172
193
|
|
173
194
|
if command == 'new'
|
@@ -206,27 +227,79 @@ elsif command == 'extract-all'
|
|
206
227
|
File.write(filename, xml.to_s())
|
207
228
|
end
|
208
229
|
elsif command == 'extract-last'
|
209
|
-
|
230
|
+
path = if path
|
231
|
+
[path]
|
232
|
+
else
|
233
|
+
Dir.glob('*.xes.yaml')
|
234
|
+
end
|
210
235
|
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
236
|
+
path.each do |f|
|
237
|
+
de, ep, desc = extract(f)
|
238
|
+
|
239
|
+
xml = XML::Smart.string('<testset xmlns="http://cpee.org/ns/properties/2.0"><executionhandler>ruby</executionhandler></testset>')
|
240
|
+
dataelements = xml.root().add('dataelements')
|
241
|
+
endpoints = xml.root().add('endpoints')
|
242
|
+
description = xml.root().add('description').add(XML::Smart.string('<description xmlns="http://cpee.org/ns/description/1.0"/>').root())
|
243
|
+
unless de.nil?
|
244
|
+
de.each do |d|
|
245
|
+
dataelements.add(d['name'],d['value'])
|
246
|
+
end
|
218
247
|
end
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
248
|
+
unless ep.nil?
|
249
|
+
ep.each do |e|
|
250
|
+
endpoints.add(e['name'],e['value'])
|
251
|
+
end
|
223
252
|
end
|
253
|
+
unless desc.nil?
|
254
|
+
description.replace_by(XML::Smart.string(desc).root())
|
255
|
+
end
|
256
|
+
|
257
|
+
File.write(f + '.model', xml.to_s)
|
224
258
|
end
|
225
|
-
|
226
|
-
|
259
|
+
elsif command == 'index'
|
260
|
+
path = if path
|
261
|
+
[path]
|
262
|
+
else
|
263
|
+
Dir.glob('*.xes.yaml')
|
227
264
|
end
|
228
265
|
|
229
|
-
|
266
|
+
path.each do |f|
|
267
|
+
index = []
|
268
|
+
io = File.open(f)
|
269
|
+
while not io.eof?
|
270
|
+
start = io.pos
|
271
|
+
docs = io.readline("---\n",chomp: true)
|
272
|
+
doc = YAML::load(docs, permitted_classes: [Time])
|
273
|
+
if doc
|
274
|
+
transition = doc.dig('event','cpee:lifecycle:transition')
|
275
|
+
if transition =~ /^(activity\/calling|activity\/receiving|task\/instantiation)/
|
276
|
+
endpoint = doc.dig('event','concept:endpoint')
|
277
|
+
uuid = doc.dig('event','cpee:activity_uuid')
|
278
|
+
transition = case transition
|
279
|
+
when 'activity/calling'
|
280
|
+
'c'
|
281
|
+
when 'activity/receiving'
|
282
|
+
'r'
|
283
|
+
when 'task/instantiation'
|
284
|
+
'i'
|
285
|
+
end
|
286
|
+
index << { :e => endpoint.to_s, :u => uuid.to_s, :t => transition.to_s, :s => start.to_i, :l => docs.length.to_i }
|
287
|
+
end
|
288
|
+
end
|
289
|
+
end
|
290
|
+
io.close
|
291
|
+
CSV.open(f + '.index.csv', 'w') do |csv|
|
292
|
+
index.each do |e|
|
293
|
+
csv << e.values
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
nindex = index.group_by{ |a| a[:u] }.collect do |k,v|
|
298
|
+
[v[0][:e], v.collect{ |a| [ a[:t], {:s => a[:s], :l => a[:l]} ] } ]
|
299
|
+
end
|
300
|
+
|
301
|
+
File.write(f + '.index', MessagePack.pack(nindex))
|
302
|
+
end
|
230
303
|
else
|
231
304
|
puts ARGV.options
|
232
305
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cpee-logging-xes-yaml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juergen eTM Mangler
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: tools
|
11
11
|
cert_chain: []
|
12
|
-
date: 2024-01-
|
12
|
+
date: 2024-01-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: riddl
|