cpee-logging-xes-yaml 1.3.3 → 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 +128 -51
- 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
@@ -16,7 +16,6 @@
|
|
16
16
|
# CPEE-LOGGING-XES-YAML (file LICENSE in the main directory). If not, see
|
17
17
|
# <http://www.gnu.org/licenses/>.
|
18
18
|
|
19
|
-
curpath = __dir__
|
20
19
|
require 'rubygems'
|
21
20
|
require 'optparse'
|
22
21
|
require 'fileutils'
|
@@ -26,17 +25,21 @@ require 'typhoeus'
|
|
26
25
|
require 'stringio'
|
27
26
|
require 'typhoeus'
|
28
27
|
require 'date'
|
28
|
+
require 'msgpack'
|
29
|
+
require 'csv'
|
29
30
|
|
30
|
-
def wrap(s, width=78, indent=19, extra_indent=
|
31
|
+
def wrap(s, width=78, indent=19, extra_indent=2)
|
31
32
|
lines = []
|
32
|
-
line, s = s[0..indent-
|
33
|
-
s.split(/\n/).
|
34
|
-
ss.split(/[ \t]+/).
|
33
|
+
line, s = s[0..indent-1], s[indent..-1]
|
34
|
+
s.split(/\n/).each_with_index do |ss,i|
|
35
|
+
ss.split(/[ \t]+/).each_with_index do |word,j|
|
35
36
|
if line.size + word.size >= width
|
36
37
|
lines << line
|
37
|
-
line = (" " * (indent
|
38
|
+
line = (" " * (indent)) + word
|
38
39
|
else
|
39
|
-
line << " "
|
40
|
+
line << " " if i > 0 || j != 0
|
41
|
+
line << (" " * (extra_indent)) if i > 0 && j == 0
|
42
|
+
line << word
|
40
43
|
end
|
41
44
|
end
|
42
45
|
lines << line if line
|
@@ -45,7 +48,7 @@ def wrap(s, width=78, indent=19, extra_indent=4)
|
|
45
48
|
return lines.join "\n"
|
46
49
|
end
|
47
50
|
|
48
|
-
def follow(fname,io,copy,deep=0)
|
51
|
+
def follow(fname,io,copy,deep=0,index=nil)
|
49
52
|
tname = if fname =~ /\.xes\.shift\.yaml/
|
50
53
|
File.basename(fname,'.xes.shift.yaml')
|
51
54
|
elsif fname =~ /\.xes\.yaml/
|
@@ -57,7 +60,7 @@ def follow(fname,io,copy,deep=0)
|
|
57
60
|
end
|
58
61
|
YAML.load_stream(io) do |e|
|
59
62
|
if name = e.dig('log','trace','cpee:name')
|
60
|
-
|
63
|
+
index.write " " * deep + name + " (#{tname}) - #{e.dig('log','trace','concept:name')}\n"
|
61
64
|
end
|
62
65
|
if e.dig('event','cpee:lifecycle:transition') == 'task/instantiation'
|
63
66
|
base = e.dig('event','raw')
|
@@ -67,13 +70,14 @@ def follow(fname,io,copy,deep=0)
|
|
67
70
|
end
|
68
71
|
uuid = base.dig('CPEE-INSTANCE-UUID') rescue nil
|
69
72
|
if uuid
|
70
|
-
react File.dirname(fname) + "/#{uuid}.xes.yaml",copy,deep + 2
|
73
|
+
react File.dirname(fname) + "/#{uuid}.xes.yaml", copy, deep + 2, index
|
71
74
|
end
|
72
75
|
end
|
73
76
|
end
|
74
77
|
end
|
75
78
|
|
76
|
-
def react(name,copy=false,deep=0)
|
79
|
+
def react(name,copy=false,deep=0,index=nil)
|
80
|
+
index ||= File.open('index.txt','w')
|
77
81
|
if name.nil?
|
78
82
|
help
|
79
83
|
elsif name =~ /^https?:\/\//
|
@@ -82,59 +86,72 @@ def react(name,copy=false,deep=0)
|
|
82
86
|
file = Tempfile.new('sic')
|
83
87
|
file.write(res.body)
|
84
88
|
file.rewind
|
85
|
-
follow name, file, copy, deep
|
89
|
+
follow name, file, copy, deep, index
|
86
90
|
file.close
|
87
91
|
file.unlink
|
88
92
|
end
|
89
93
|
elsif File.exist? name
|
90
|
-
follow name, File.open(name), copy, deep
|
94
|
+
follow name, File.open(name), copy, deep, index
|
91
95
|
else
|
92
96
|
help
|
93
97
|
end
|
94
98
|
end
|
95
99
|
|
96
100
|
def extract(path)
|
101
|
+
unlink = false
|
97
102
|
if path =~ /^http.*/
|
98
|
-
|
99
|
-
|
100
|
-
|
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
|
101
116
|
end
|
117
|
+
request.run
|
102
118
|
else
|
103
|
-
text = File.
|
119
|
+
text = File.open(path)
|
104
120
|
end
|
105
121
|
yaml = Psych.load_stream(text)
|
106
122
|
changes = []
|
107
123
|
|
108
|
-
info = yaml.shift
|
124
|
+
info = yaml.shift
|
109
125
|
uuid = info.dig('log','trace','cpee:instance')
|
110
|
-
yaml.each
|
111
|
-
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')
|
112
128
|
changes.push(el)
|
113
129
|
end
|
114
130
|
end
|
115
|
-
#puts "found #{changes.size()} changes"
|
116
131
|
|
117
|
-
changes.sort!
|
118
|
-
#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') }
|
119
133
|
|
120
134
|
de = ep = desc = nil
|
121
135
|
counter = 0
|
122
|
-
changes.each
|
123
|
-
if
|
136
|
+
changes.each do |change|
|
137
|
+
if change.dig('event','cpee:lifecycle:transition') == 'dataelements/change'
|
124
138
|
de = change.dig('event','data')
|
125
139
|
end
|
126
|
-
if
|
140
|
+
if change.dig('event','cpee:lifecycle:transition') == 'endpoints/change'
|
127
141
|
ep = change.dig('event','data')
|
128
142
|
end
|
129
|
-
if
|
143
|
+
if change.dig('event','cpee:lifecycle:transition') == 'description/change'
|
130
144
|
desc = change.dig('event','cpee:description')
|
131
145
|
end
|
132
|
-
if
|
146
|
+
if change.dig('event','cpee:lifecycle:transition') == 'description/change' || change.dig('event','cpee:lifecycle:transition') == 'endpoints/change'
|
133
147
|
yield uuid, de, ep, desc, counter if block_given?
|
134
148
|
counter += 1
|
135
149
|
end
|
136
150
|
end
|
137
151
|
|
152
|
+
text.close
|
153
|
+
text.unlink if unlink
|
154
|
+
|
138
155
|
[de, ep, desc]
|
139
156
|
end
|
140
157
|
|
@@ -147,28 +164,36 @@ ARGV.options { |opt|
|
|
147
164
|
opt.on("Options:")
|
148
165
|
opt.on("--help", "-h", "This text") { puts opt; exit }
|
149
166
|
opt.on("")
|
167
|
+
opt.on(wrap("\"#{exname}\" will be call \"c\" in the examples for each command."))
|
168
|
+
exname = 'c'
|
169
|
+
opt.on("")
|
150
170
|
opt.on(wrap("new [DIR] scaffolds a sample logging service. Add a handler to a cpee instance to experience the pleasure."))
|
151
171
|
opt.on("")
|
152
|
-
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"))
|
153
173
|
opt.on("")
|
154
|
-
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"))
|
155
175
|
opt.on("")
|
156
|
-
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
|
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"))
|
157
177
|
opt.on("")
|
158
|
-
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"))
|
159
181
|
opt.parse!
|
160
182
|
}
|
161
|
-
|
183
|
+
|
184
|
+
if (ARGV.length < 1 || ARGV.length > 2)
|
162
185
|
puts ARGV.options
|
163
186
|
exit
|
164
|
-
|
187
|
+
elsif ARGV.length == 2
|
165
188
|
command = ARGV[0]
|
166
189
|
path = ARGV[1]
|
190
|
+
elsif ARGV.length == 1 && %w{index extract-last}.include?(ARGV[0])
|
191
|
+
command = ARGV[0]
|
167
192
|
end
|
168
193
|
|
169
194
|
if command == 'new'
|
170
195
|
if !File.exist?(path)
|
171
|
-
FileUtils.cp_r(File.join(
|
196
|
+
FileUtils.cp_r(File.join(__dir__,'..','server'),path)
|
172
197
|
FileUtils.mkdir(File.join(path,'logs')) rescue nil
|
173
198
|
else
|
174
199
|
puts 'Directory already exists.'
|
@@ -196,33 +221,85 @@ elsif command == 'extract-all'
|
|
196
221
|
unless desc.nil?
|
197
222
|
description.replace_by(XML::Smart.string(desc).root())
|
198
223
|
end
|
199
|
-
dirname = File.join(
|
224
|
+
dirname = File.join(uuid)
|
200
225
|
filename = File.join(dirname,"#{uuid}_#{version}.xml")
|
201
226
|
Dir.mkdir(dirname) unless Dir.exist?(dirname)
|
202
227
|
File.write(filename, xml.to_s())
|
203
228
|
end
|
204
229
|
elsif command == 'extract-last'
|
205
|
-
|
230
|
+
path = if path
|
231
|
+
[path]
|
232
|
+
else
|
233
|
+
Dir.glob('*.xes.yaml')
|
234
|
+
end
|
235
|
+
|
236
|
+
path.each do |f|
|
237
|
+
de, ep, desc = extract(f)
|
206
238
|
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
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
|
214
247
|
end
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
248
|
+
unless ep.nil?
|
249
|
+
ep.each do |e|
|
250
|
+
endpoints.add(e['name'],e['value'])
|
251
|
+
end
|
219
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)
|
220
258
|
end
|
221
|
-
|
222
|
-
|
259
|
+
elsif command == 'index'
|
260
|
+
path = if path
|
261
|
+
[path]
|
262
|
+
else
|
263
|
+
Dir.glob('*.xes.yaml')
|
223
264
|
end
|
224
265
|
|
225
|
-
|
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
|
226
303
|
else
|
227
304
|
puts ARGV.options
|
228
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
|