ruby-xes 0.1.0

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.
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ html
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ruby-xes.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 NaU Data Institute Inc. and contributors.
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,41 @@
1
+ # ruby-xes
2
+
3
+ ruby-xes is a Ruby library for generating XES event log.
4
+
5
+ ## Installation
6
+
7
+ $ gem install ruby-xes
8
+
9
+ ## Usage
10
+
11
+ ```ruby
12
+ require 'xes'
13
+
14
+ XES::Document.new.tap do |doc|
15
+ doc.log = XES::Log.new.tap do |log|
16
+ log.traces << XES::Trace.new.tap do |trace|
17
+ trace.events << XES::Event.new.tap do |event|
18
+ event.attributes << XES.string("concept:name", "test")
19
+ end
20
+ end
21
+ end
22
+ end.format
23
+ ```
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create new Pull Request
32
+
33
+ ## Licence
34
+
35
+ ruby-xes is free software distributed under MIT licence.
36
+
37
+ ## Links
38
+
39
+ * [PIONE project homepage](http://pione.github.io/)
40
+ * [repository on github](https://github.com/pione/pione)
41
+ * [XES](http://www.xes-standard.org/start)
@@ -0,0 +1,16 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ desc 'Test specs'
4
+ task 'test' do
5
+ sh "bundle exec bacon -a"
6
+ end
7
+
8
+ desc 'Generate API document'
9
+ task 'html' do
10
+ sh "bundle exec yard doc -o html --hide-void-return --no-api"
11
+ end
12
+
13
+ desc 'Show undocumented function list'
14
+ task 'html:undoc' do
15
+ sh "bundle exec yard stats --list-undoc --no-api --compact"
16
+ end
@@ -0,0 +1,18 @@
1
+ require "rexml/document"
2
+ require "time"
3
+
4
+ require "xes/version"
5
+ require "xes/format-error"
6
+ require "xes/attribute-accessor"
7
+ require "xes/extension"
8
+ require "xes/classifier"
9
+ require "xes/attribute"
10
+ require "xes/global"
11
+ require "xes/event"
12
+ require "xes/trace"
13
+ require "xes/log"
14
+ require "xes/document"
15
+
16
+ # XES is a module for genereting XES event log.
17
+ module XES
18
+ end
@@ -0,0 +1,121 @@
1
+ module XES
2
+ # AttributeAccessor provides attribute accessors of standard extensions.
3
+ module AttributeAccessor
4
+ # Define an attribute accessor.
5
+ #
6
+ # @param name [String]
7
+ # attribute name
8
+ # @param type [String]
9
+ # attribute type
10
+ # @return [void]
11
+ def define_attribute(name, type)
12
+ _name = name.gsub(":", "_")
13
+
14
+ define_method(_name) do
15
+ var = instance_variables.include?(:@meta) ? :@meta : :@attributes
16
+ instance_variable_get(var).find do |attribute|
17
+ attribute.key == name
18
+ end.tap{|x| return x.value if x}
19
+ end
20
+
21
+ define_method("%s=" % _name) do |value|
22
+ var = instance_variables.include?(:@meta) ? :@meta : :@attributes
23
+ instance_variable_get(var).tap do |attributes|
24
+ if elt = __send__(_name)
25
+ attributes.delete(elt)
26
+ end
27
+ attributes << XES.send(type, name, value)
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ # EventAttributeAccessor provides attribute accessors for event or event global element.
34
+ module EventAttributeAccessor
35
+ extend AttributeAccessor
36
+
37
+ # @!attribute [rw] concept_name
38
+ # @return [String]
39
+ # the value of attribute "concept:name"
40
+ define_attribute "concept:name", "string"
41
+
42
+ # @!attribute [rw] concept_instance
43
+ # @return [String]
44
+ # the value of attribute "concept:instance"
45
+ define_attribute "concept:instance", "string"
46
+
47
+ # @!attribute [rw] lifecycle_transition
48
+ # @return [String]
49
+ # the value of attribute "lifecycle:transition"
50
+ define_attribute "lifecycle:transition", "string"
51
+
52
+ # @!attribute [rw] org_resource
53
+ # @return [String]
54
+ # the value of attribute "org:resource"
55
+ define_attribute "org:resource", "string"
56
+
57
+ # @!attribute [rw] org_role
58
+ # @return [String]
59
+ # the value of attribute "org:role"
60
+ define_attribute "org:role", "string"
61
+
62
+ # @!attribute [rw] org_group
63
+ # @return [String]
64
+ # the value of attribute "org:group"
65
+ define_attribute "org:group", "string"
66
+
67
+ # @!attribute [rw] time_timestamp
68
+ # @return [Time,String]
69
+ # the value of attribute "time:timestamp"
70
+ define_attribute "time:timestamp", "date"
71
+
72
+ # @!attribute [rw] semantic_modelReference
73
+ # @return [String]
74
+ # the value of attribute "semantic:modelReference"
75
+ define_attribute "semantic:modelReference", "string"
76
+
77
+ # @!attribute [rw] identity_id
78
+ # @return [String]
79
+ # the value of attribute "identity:id"
80
+ define_attribute "identity:id", "id"
81
+
82
+ # @!attribute [rw] cost_total
83
+ # @return [Float]
84
+ # the value of attribute "cost:total"
85
+ define_attribute "cost:total", "float"
86
+
87
+ # @!attribute [rw] cost_currency
88
+ # @return [String]
89
+ # the value of attribute "cost:currency"
90
+ define_attribute "cost:currency", "string"
91
+ end
92
+
93
+ # TraceAttributeAccessor provides attribute accessors for trace or trace global element.
94
+ module TraceAttributeAccessor
95
+ extend AttributeAccessor
96
+ # @!attribute [rw] concept_name
97
+ # @return [String]
98
+ # the value of attribute "concept:name"
99
+ define_attribute "concept:name", "string"
100
+
101
+ # @!attribute [rw] semantic_modelReference
102
+ # @return [String]
103
+ # the value of attribute "semantic:modelReference"
104
+ define_attribute "semantic:modelReference", "string"
105
+
106
+ # @!attribute [rw] identity_id
107
+ # @return [String]
108
+ # the value of attribute "identity:id"
109
+ define_attribute "identity:id", "id"
110
+
111
+ # @!attribute [rw] cost:total
112
+ # @return [Float]
113
+ # the value of attribute "cost:total"
114
+ define_attribute "cost:total", "float"
115
+
116
+ # @!attribute [rw] cost_currency
117
+ # @return [String]
118
+ # the value of attribute "cost:currency"
119
+ define_attribute "cost:currency", "string"
120
+ end
121
+ end
@@ -0,0 +1,201 @@
1
+ module XES
2
+ # Attribute represents attribute of XES.
3
+ class Attribute
4
+ extend AttributeAccessor
5
+
6
+ # @!attribute [rw] semantic_modelReference
7
+ # @return [String]
8
+ # the value of meta attribute "semantic:modelReference"
9
+ define_attribute "semantic:modelReference", "string"
10
+
11
+ # @!attribute [rw] identity_id
12
+ # @return [String]
13
+ # the value of meta attribute "identity:id"
14
+ define_attribute "identity:id", "id"
15
+
16
+ # @!attribute [rw] cost_amount
17
+ # @return [Float]
18
+ # the value of meta attribute "cost:amount"
19
+ define_attribute "cost:amount", "float"
20
+
21
+ # @!attribute [rw] cost_driver
22
+ # @return [String]
23
+ # the value of meta attribute "cost:driver"
24
+ define_attribute "cost:driver", "string"
25
+
26
+ # @!attribute [rw] cost_type
27
+ # @return [String]
28
+ # the value of meta attribute "cost:type"
29
+ define_attribute "cost:type", "string"
30
+
31
+ # @return [String]
32
+ # attribute type
33
+ attr_reader :type
34
+
35
+ # @return [String]
36
+ # attribute name
37
+ attr_accessor :key
38
+
39
+ # @return [String]
40
+ # attribute value
41
+ attr_accessor :value
42
+
43
+ # @return [Meta]
44
+ # attribute meta attributes
45
+ attr_accessor :meta
46
+
47
+ # @param type [String]
48
+ # attribute type
49
+ # @param key [String]
50
+ # attribute name
51
+ # @param value [String]
52
+ # attribute value
53
+ # @param meta [Array<Attribute>]
54
+ # meta attributes
55
+ def initialize(type, key, value, meta=[])
56
+ @type = type
57
+ @key = key
58
+ @value = value
59
+ @meta = meta
60
+ end
61
+
62
+ # Return true if the element is formattable.
63
+ #
64
+ # @return [Boolean]
65
+ # true if the element is formattable
66
+ def formattable?
67
+ not(@type.nil? or @key.nil? or @value.nil? or @meta.nil?)
68
+ end
69
+
70
+ # Format as a XML element.
71
+ def format
72
+ raise FormatError.new(self) unless formattable?
73
+
74
+ REXML::Element.new(type).tap do |attribute|
75
+ attribute.attributes["key"] = @key
76
+ attribute.attributes["value"] = format_value
77
+ meta.each {|m| attribute.elements << m.format if m.formattable?}
78
+ end
79
+ end
80
+
81
+ # @api private
82
+ def ==(other)
83
+ return false unless other.kind_of?(self.class)
84
+ @type == other.type and @key == other.key and @value == other.value and @meta == other.meta
85
+ end
86
+ alias :eql? :"=="
87
+
88
+ # @api private
89
+ def hash
90
+ @type.hash + @key.hash + @value.hash
91
+ end
92
+
93
+ private
94
+
95
+ # Format the value.
96
+ #
97
+ # @return [String]
98
+ def format_value
99
+ case @type
100
+ when "string"
101
+ @value
102
+ when "date"
103
+ @value.kind_of?(Time) ? @value.iso8601(3) : @value
104
+ when "int"
105
+ @value.kind_of?(Integer) ? @value : @value.to_i
106
+ when "float"
107
+ @value.kind_of?(Float) ? @value : @value.to_f
108
+ when "boolean"
109
+ @value
110
+ when "id"
111
+ @value
112
+ end.to_s
113
+ end
114
+ end
115
+
116
+ class << self
117
+ # Return string attribute object.
118
+ #
119
+ # @param key [String]
120
+ # attribute name
121
+ # @param value [Object]
122
+ # attribute value
123
+ # @param meta [Array<Attribute>]
124
+ # meta attributes
125
+ # @return [Attribute]
126
+ # string attribute
127
+ def string(key, value, meta=[])
128
+ Attribute.new("string", key, value, meta)
129
+ end
130
+
131
+ # Return date attribute object.
132
+ #
133
+ # @param key [String]
134
+ # attribute name
135
+ # @param value [Object]
136
+ # attribute value
137
+ # @param meta [Array<Attribute>]
138
+ # meta attributes
139
+ # @return [Attribute]
140
+ # date attribute
141
+ def date(key, value, meta=[])
142
+ Attribute.new("date", key, value, meta)
143
+ end
144
+
145
+ # Return int attribute object.
146
+ #
147
+ # @param key [String]
148
+ # attribute name
149
+ # @param value [Object]
150
+ # attribute value
151
+ # @param meta [Array<Attribute>]
152
+ # meta attributes
153
+ # @return [Attribute]
154
+ # int attribute
155
+ def int(key, value, meta=[])
156
+ Attribute.new("int", key, value, meta)
157
+ end
158
+
159
+ # Return float attribute object.
160
+ #
161
+ # @param key [String]
162
+ # attribute name
163
+ # @param value [Object]
164
+ # attribute value
165
+ # @param meta [Array<Attribute>]
166
+ # meta attributes
167
+ # @return [Attribute]
168
+ # float attribute
169
+ def float(key, value, meta=[])
170
+ Attribute.new("float", key, value, meta)
171
+ end
172
+
173
+ # Return boolean attribute object.
174
+ #
175
+ # @param key [String]
176
+ # attribute name
177
+ # @param value [Object]
178
+ # attribute value
179
+ # @param meta [Array<Attribute>]
180
+ # meta attributes
181
+ # @return [Attribute]
182
+ # boolean attribute
183
+ def boolean(key, value, meta=[])
184
+ Attribute.new("boolean", key, value, meta)
185
+ end
186
+
187
+ # Return id attribute object.
188
+ #
189
+ # @param key [String]
190
+ # attribute name
191
+ # @param value [Object]
192
+ # attribute value
193
+ # @param meta [Array<Attribute>]
194
+ # meta attributes
195
+ # @return [Attribute]
196
+ # id attribute
197
+ def id(key, value, meta=[])
198
+ Attribute.new("id", key, value, meta)
199
+ end
200
+ end
201
+ end