propane 0.9.0-java → 2.0.0.pre-java
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/.github/CONTRIBUTING.md +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +7 -1
- data/CHANGELOG.md +2 -1
- data/LICENSE +674 -0
- data/README.md +16 -22
- data/Rakefile +2 -2
- data/lib/propane.rb +1 -4
- data/lib/propane/app.rb +23 -31
- data/lib/propane/creators/sketch_writer.rb +8 -7
- data/lib/propane/helper_methods.rb +1 -2
- data/lib/propane/library_loader.rb +2 -1
- data/lib/propane/runner.rb +12 -54
- data/lib/propane/version.rb +1 -1
- data/library/video_event/video_event.rb +3 -0
- data/pom.rb +10 -9
- data/pom.xml +13 -8
- data/propane.gemspec +10 -10
- data/src/monkstone/videoevent/VideoInterface.java +42 -0
- data/src/monkstone/videoevent/package-info.java +20 -0
- data/test/create_test.rb +10 -3
- data/test/respond_to_test.rb +10 -1
- data/vendors/Rakefile +56 -48
- metadata +17 -17
- data/LICENSE.txt +0 -22
- data/src/monkstone/CodeListener.java +0 -7
- data/src/monkstone/WatchSketchDir.java +0 -190
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Propane
|
2
2
|
[](https://badge.fury.io/rb/propane)
|
3
3
|
|
4
|
-
A slim layer to communicate with Processing from JRuby, features a polyglot maven build, this started out as a non serious project by Phillip Cunningam called ribiprocessing. It has now morphed into an experimental project for ruby-processing so we can now "Cook with Gas". We have created a configuration free version of ruby processing,
|
4
|
+
A slim layer to communicate with Processing from JRuby, features a polyglot maven build, this started out as a non serious project by Phillip Cunningam called ribiprocessing. It has now morphed into an experimental project for ruby-processing so we can now "Cook with Gas". We have created a configuration free version of ruby processing, for processing-3.1+, where we get processing core from maven central (and opengl currently testing on linux64/mac). These jars are small enough to include in the gem distribution, and hence we should not require configuration. This has created a scriptable version, ie files get run direct from jruby, but you could use jruby-complete if you used the propane script (avoids need to give the absolute data path for the data folder, but would also be needed for a watch mode).
|
5
5
|
## Requirements
|
6
6
|
|
7
7
|
- jdk8+ since version 0.6.0
|
@@ -29,47 +29,41 @@ require 'propane'
|
|
29
29
|
|
30
30
|
class FlashingLightsSketch < Propane::App
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
def initialize opts={}
|
35
|
-
@random_background = opts.fetch :random_background, RandomBackground.new(self)
|
36
|
-
super
|
32
|
+
def settings
|
33
|
+
size(800, 600)
|
37
34
|
end
|
38
35
|
|
39
36
|
def setup
|
40
|
-
|
37
|
+
sketch_title 'Flashing Light Sketch'
|
41
38
|
end
|
42
39
|
|
43
40
|
def draw
|
44
|
-
random_background.generate
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
|
49
|
-
class RandomBackground
|
50
|
-
include Propane::Proxy
|
51
|
-
|
52
|
-
def generate
|
53
41
|
background(rand(255), rand(255), rand(255))
|
54
42
|
end
|
55
|
-
|
56
43
|
end
|
57
44
|
|
58
|
-
FlashingLightsSketch.new
|
45
|
+
FlashingLightsSketch.new
|
59
46
|
```
|
60
47
|
|
61
|
-
To install the samples
|
48
|
+
To install the samples. The samples get copied to `~/propane_samples`. Depends on wget.
|
62
49
|
```bash
|
63
|
-
propane --install
|
50
|
+
propane --install samples
|
64
51
|
```
|
65
52
|
There is a handy sketch creator tool
|
66
53
|
```bash
|
67
54
|
propane -c my_sketch 200 200 # for default renderer
|
68
55
|
propane -c my_sketch 200 200 p2d # for opengl 2D renderer
|
69
56
|
propane -c my_sketch 200 200 p3d # for opengl 3D renderer
|
57
|
+
```
|
58
|
+
|
59
|
+
To run sketches
|
70
60
|
|
71
|
-
To run sketches using the installed jruby-complete, you can also use shortform `-r`
|
72
61
|
```bash
|
73
|
-
propane --run my_sketch.rb # or
|
74
62
|
jruby -S propane --run my_sketch.rb # belt and braces version
|
75
63
|
```
|
64
|
+
To install the sound and video libraries `~/.propane/libraries`. Depends on wget.
|
65
|
+
```bash
|
66
|
+
propane --install sound
|
67
|
+
propane --install video
|
68
|
+
```
|
69
|
+
Other java libraries can be manually installed to the same folder (no need for processing ide)
|
data/Rakefile
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# frozen_string_literal: false
|
3
2
|
require_relative 'lib/propane/version'
|
4
3
|
|
@@ -8,7 +7,7 @@ def create_manifest
|
|
8
7
|
File.open('MANIFEST.MF', 'w') do |f|
|
9
8
|
f.puts(title)
|
10
9
|
f.puts(version)
|
11
|
-
f.puts('Class-Path: core-
|
10
|
+
f.puts('Class-Path: core-3.1.1.jar gluegen-rt-2.3.2.jar jog-all-2.3.2.jar')
|
12
11
|
end
|
13
12
|
end
|
14
13
|
|
@@ -48,6 +47,7 @@ end
|
|
48
47
|
desc 'Test'
|
49
48
|
task :test do
|
50
49
|
sh 'jruby test/respond_to_test.rb'
|
50
|
+
sh 'jruby test/create_test.rb'
|
51
51
|
end
|
52
52
|
|
53
53
|
desc 'clean'
|
data/lib/propane.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# frozen_string_literal: false
|
3
2
|
unless defined? PROPANE_ROOT
|
4
3
|
$LOAD_PATH << File.expand_path(File.dirname(__FILE__))
|
@@ -7,6 +6,4 @@ end
|
|
7
6
|
Dir["#{PROPANE_ROOT}/lib/*.jar"].each do |jar|
|
8
7
|
require jar
|
9
8
|
end
|
10
|
-
|
11
|
-
require 'propane/app'
|
12
|
-
require 'propane/helpers/numeric'
|
9
|
+
require_relative 'propane/app'
|
data/lib/propane/app.rb
CHANGED
@@ -19,7 +19,8 @@ module Propane
|
|
19
19
|
# their own sketch.
|
20
20
|
#
|
21
21
|
# i.e.
|
22
|
-
#
|
22
|
+
# require 'propane'
|
23
|
+
#
|
23
24
|
# class MySketch < Propane::App
|
24
25
|
#
|
25
26
|
# def draw
|
@@ -27,6 +28,8 @@ module Propane
|
|
27
28
|
# end
|
28
29
|
#
|
29
30
|
# end
|
31
|
+
#
|
32
|
+
# MySketch.new
|
30
33
|
|
31
34
|
# Watch the definition of these methods, to make sure
|
32
35
|
# that Processing is able to call them during events.
|
@@ -49,15 +52,27 @@ module Propane
|
|
49
52
|
alias stroke_width stroke_weight
|
50
53
|
alias rgb color
|
51
54
|
alias gray color
|
52
|
-
|
55
|
+
field_reader :surface
|
56
|
+
|
57
|
+
def sketch_class
|
58
|
+
self.class.sketch_class
|
59
|
+
end
|
60
|
+
|
61
|
+
# Keep track of what inherits from the Processing::App, because we're
|
62
|
+
# going to want to instantiate one.
|
63
|
+
def self.inherited(subclass)
|
64
|
+
super(subclass)
|
65
|
+
@sketch_class = subclass
|
66
|
+
end
|
67
|
+
|
53
68
|
# App should be instantiated with an optional list of options
|
54
69
|
# and array of arguments.
|
55
70
|
#
|
56
|
-
# App.new
|
71
|
+
# App.new
|
57
72
|
#
|
58
73
|
class << self
|
59
74
|
# Handy getters and setters on the class go here:
|
60
|
-
attr_accessor :sketch_class, :library_loader
|
75
|
+
attr_accessor :sketch_class, :library_loader, :title, :arguments, :options
|
61
76
|
|
62
77
|
def load_libraries(*args)
|
63
78
|
library_loader ||= LibraryLoader.new
|
@@ -99,7 +114,6 @@ module Propane
|
|
99
114
|
$app = self
|
100
115
|
@arguments = arguments
|
101
116
|
@options = options
|
102
|
-
configure_sketch
|
103
117
|
run_sketch
|
104
118
|
end
|
105
119
|
|
@@ -111,6 +125,10 @@ module Propane
|
|
111
125
|
import_opengl if /opengl/ =~ mode
|
112
126
|
super(*args)
|
113
127
|
end
|
128
|
+
|
129
|
+
def sketch_title(title)
|
130
|
+
surface.set_title(title)
|
131
|
+
end
|
114
132
|
|
115
133
|
def data_path(dat)
|
116
134
|
dat_root = File.join(SKETCH_ROOT, 'data')
|
@@ -118,12 +136,6 @@ module Propane
|
|
118
136
|
File.join(dat_root, dat)
|
119
137
|
end
|
120
138
|
|
121
|
-
# This method runs the processing sketch.
|
122
|
-
#
|
123
|
-
def run_sketch
|
124
|
-
PApplet.run_sketch(arguments, self)
|
125
|
-
end
|
126
|
-
|
127
139
|
private
|
128
140
|
|
129
141
|
def import_opengl
|
@@ -135,26 +147,6 @@ module Propane
|
|
135
147
|
end
|
136
148
|
end
|
137
149
|
|
138
|
-
# This method configures the sketch title and and presentation mode.
|
139
|
-
#
|
140
|
-
def configure_sketch
|
141
|
-
set_sketch_title
|
142
|
-
set_presentation_mode
|
143
|
-
end
|
144
|
-
|
145
|
-
# This method sets the sketch presentation mode.
|
146
|
-
#
|
147
|
-
def set_presentation_mode
|
148
|
-
arguments.concat ['--present'] if options[:fullscreen]
|
149
|
-
end
|
150
|
-
|
151
|
-
# This method sets the sketch title.
|
152
|
-
#
|
153
|
-
def set_sketch_title
|
154
|
-
title_string = options.fetch(:title, 'processing sketch')
|
155
|
-
arguments.concat [title_string]
|
156
|
-
end
|
157
|
-
|
158
150
|
def proxy_java_fields
|
159
151
|
fields = %w(sketchPath key frameRate mousePressed keyPressed)
|
160
152
|
methods = fields.map { |field| java_class.declared_field(field) }
|
@@ -11,8 +11,9 @@ class SketchParameters
|
|
11
11
|
name.split('_').collect(&:capitalize).join
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
15
|
-
name.split('_').collect(&:capitalize).join(' ')
|
14
|
+
def sketch_title
|
15
|
+
human = name.split('_').collect(&:capitalize).join(' ')
|
16
|
+
format("sketch_title '%s'", human)
|
16
17
|
end
|
17
18
|
|
18
19
|
def sketch_size
|
@@ -47,14 +48,15 @@ class ClassSketch
|
|
47
48
|
''
|
48
49
|
]
|
49
50
|
lines << format('class %s < Propane::App', param.class_name)
|
50
|
-
lines.concat method_lines('
|
51
|
+
lines.concat method_lines('settings', param.sketch_size)
|
52
|
+
lines.concat method_lines('setup', param.sketch_title)
|
51
53
|
lines.concat method_lines('draw', '')
|
52
54
|
lines << 'end'
|
53
55
|
lines.concat new(param)
|
54
56
|
end
|
55
|
-
|
57
|
+
|
56
58
|
private
|
57
|
-
|
59
|
+
|
58
60
|
def method_lines(name, content)
|
59
61
|
one = format('%sdef %s', INDENT, name)
|
60
62
|
two = content.empty? ? '' : format(' %s%s', INDENT, content)
|
@@ -64,7 +66,6 @@ class ClassSketch
|
|
64
66
|
end
|
65
67
|
|
66
68
|
def new(param)
|
67
|
-
['', format(
|
69
|
+
['', format('%s.new', param.class_name)]
|
68
70
|
end
|
69
71
|
end
|
70
|
-
|
@@ -100,7 +100,8 @@ module Propane
|
|
100
100
|
[
|
101
101
|
"#{PROPANE_ROOT}/library/#{library_name}",
|
102
102
|
"#{PROPANE_ROOT}/library/#{library_name}/library",
|
103
|
-
"#{PROPANE_ROOT}/library/#{library_name}"
|
103
|
+
"#{PROPANE_ROOT}/library/#{library_name}",
|
104
|
+
"#{ENV['HOME']}/.propane/libraries/#{library_name}/library"
|
104
105
|
].each do |jpath|
|
105
106
|
if File.exist?(jpath) && !Dir.glob(format('%s/*.%s', jpath, ext)).empty?
|
106
107
|
return jpath
|
data/lib/propane/runner.rb
CHANGED
@@ -1,13 +1,9 @@
|
|
1
1
|
# frozen_string_literal: false
|
2
|
-
require "#{PROPANE_ROOT}/lib/propane"
|
3
|
-
require "#{PROPANE_ROOT}/lib/propane/app"
|
4
2
|
require 'optparse'
|
3
|
+
require_relative 'version'
|
5
4
|
|
6
5
|
module Propane
|
7
|
-
|
8
|
-
java_import 'java.nio.file.StandardWatchEventKinds'
|
9
|
-
# Utility class to handle the different commands that the 'rp5' command
|
10
|
-
# offers. Able to run, watch, live, create, app, and unpack
|
6
|
+
# Utility class to handle the different commands that the 'propane' offers
|
11
7
|
class Runner
|
12
8
|
attr_reader :options, :argc, :filename
|
13
9
|
|
@@ -15,7 +11,7 @@ module Propane
|
|
15
11
|
@options = {}
|
16
12
|
end
|
17
13
|
|
18
|
-
# Start running a propane
|
14
|
+
# Start running a propane command from the passed-in arguments
|
19
15
|
def self.execute
|
20
16
|
runner = new
|
21
17
|
runner.parse_options(ARGV)
|
@@ -26,8 +22,6 @@ module Propane
|
|
26
22
|
def execute!
|
27
23
|
show_help if options.empty?
|
28
24
|
show_version if options[:version]
|
29
|
-
run_sketch if options[:run]
|
30
|
-
watch_sketch if options[:watch]
|
31
25
|
create if options[:create]
|
32
26
|
install if options[:install]
|
33
27
|
end
|
@@ -46,20 +40,11 @@ module Propane
|
|
46
40
|
end
|
47
41
|
|
48
42
|
options[:install] = false
|
49
|
-
|
43
|
+
message = '<Samples><Video><Sound> Install samples or library'
|
44
|
+
opts.on('-i', '--install', message) do
|
50
45
|
options[:install] = true
|
51
46
|
end
|
52
47
|
|
53
|
-
options[:watch] = false
|
54
|
-
opts.on('-w', '--watch', 'Watch the sketch') do
|
55
|
-
options[:watch] = true
|
56
|
-
end
|
57
|
-
|
58
|
-
options[:run] = false
|
59
|
-
opts.on('-r', '--run', 'Run the sketch using jruby-complete') do
|
60
|
-
options[:run] = true
|
61
|
-
end
|
62
|
-
|
63
48
|
options[:create] = false
|
64
49
|
opts.on('-c', '--create', 'Create new sketch outline') do
|
65
50
|
options[:create] = true
|
@@ -75,39 +60,6 @@ module Propane
|
|
75
60
|
@argc = opt_parser.parse(args)
|
76
61
|
@filename = argc.shift
|
77
62
|
end
|
78
|
-
|
79
|
-
def watch_sketch
|
80
|
-
run_sketch
|
81
|
-
root = File.absolute_path(File.dirname(filename))
|
82
|
-
watcher = WatchSketchDir.watch(root)
|
83
|
-
count = 0 # guard against a duplicate event
|
84
|
-
watcher.add_listener do |event|
|
85
|
-
if event.kind == StandardWatchEventKinds::ENTRY_MODIFY
|
86
|
-
if count == 0
|
87
|
-
puts 'reloading sketch...'
|
88
|
-
run_sketch
|
89
|
-
end
|
90
|
-
count += 1
|
91
|
-
count = 0 if count == 2
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def run_sketch
|
97
|
-
# root = File.absolute_path(File.dirname(filename))
|
98
|
-
# sketch = File.join(root, filename)
|
99
|
-
sketch = File.join(SKETCH_ROOT, filename)
|
100
|
-
warn_format = 'File %s does not not Exist!'
|
101
|
-
return warn(format(warn_format, sketch)) unless File.exist?(sketch)
|
102
|
-
command = [
|
103
|
-
'java',
|
104
|
-
'-cp',
|
105
|
-
"#{PROPANE_ROOT}/lib/ruby/jruby-complete.jar",
|
106
|
-
'org.jruby.Main',
|
107
|
-
sketch.to_s
|
108
|
-
].flatten
|
109
|
-
exec(*command)
|
110
|
-
end
|
111
63
|
|
112
64
|
def create
|
113
65
|
require_relative 'creators/sketch_writer'
|
@@ -121,7 +73,13 @@ module Propane
|
|
121
73
|
end
|
122
74
|
|
123
75
|
def install
|
124
|
-
|
76
|
+
choice = filename.downcase
|
77
|
+
samples = "cd #{PROPANE_ROOT}/vendors && rake"
|
78
|
+
sound = "cd #{PROPANE_ROOT}/vendors && rake download_and_copy_sound"
|
79
|
+
video = "cd #{PROPANE_ROOT}/vendors && rake download_and_copy_video"
|
80
|
+
system samples if /samples/ =~ choice
|
81
|
+
system video if /video/ =~ choice
|
82
|
+
system sound if /sound/ =~ choice
|
125
83
|
end
|
126
84
|
end # class Runner
|
127
85
|
end # module Propane
|
data/lib/propane/version.rb
CHANGED
data/pom.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
project 'rp5extras', 'https://github.com/monkstone/propane' do
|
3
3
|
model_version '4.0.0'
|
4
|
-
id 'propane:rp5extras', '0.
|
4
|
+
id 'propane:rp5extras', '2.0.0'
|
5
5
|
packaging 'jar'
|
6
6
|
description 'rp5extras for propane'
|
7
7
|
organization 'ruby-processing', 'https://ruby-processing.github.io'
|
@@ -13,12 +13,12 @@ project 'rp5extras', 'https://github.com/monkstone/propane' do
|
|
13
13
|
end
|
14
14
|
license 'MIT', 'http://www.opensource.org/licenses/mit-license.php'
|
15
15
|
license 'GPL 3', 'http://www.gnu.org/licenses/gpl-3.0-standalone.html'
|
16
|
-
issue_management 'https://github.com/
|
16
|
+
issue_management 'https://github.com/ruby-processing/propane/issues', 'Github'
|
17
17
|
|
18
18
|
source_control(
|
19
|
-
url: 'https://github.com/
|
20
|
-
connection: 'scm:git:git://github.com/
|
21
|
-
developer_connection: 'scm:git:git@github.com/
|
19
|
+
url: 'https://github.com/ruby-processing/propane',
|
20
|
+
connection: 'scm:git:git://github.com/ruby-processing/propane.git',
|
21
|
+
developer_connection: 'scm:git:git@github.com/ruby-processing/propane.git'
|
22
22
|
)
|
23
23
|
|
24
24
|
properties('source.directory' => 'src',
|
@@ -30,11 +30,12 @@ project 'rp5extras', 'https://github.com/monkstone/propane' do
|
|
30
30
|
'jruby.api' => 'http://jruby.org/apidocs/',
|
31
31
|
'processing.api' => 'http://processing.github.io/processing-javadocs/core/',
|
32
32
|
'jruby.api' => 'http://jruby.org/apidocs/',
|
33
|
-
'jogl.version' => '2.
|
33
|
+
'jogl.version' => '2.3.2'
|
34
34
|
)
|
35
35
|
|
36
|
-
pom
|
37
|
-
jar
|
36
|
+
pom 'org.jruby:jruby:9.1.2.0'
|
37
|
+
jar 'org.processing:core:3.1.1'
|
38
|
+
jar 'org.processing:video:3.0.2'
|
38
39
|
jar('org.jogamp.jogl:jogl-all:${jogl.version}')
|
39
40
|
jar('org.jogamp.gluegen:gluegen-rt-main:${jogl.version}')
|
40
41
|
|
@@ -44,7 +45,7 @@ project 'rp5extras', 'https://github.com/monkstone/propane' do
|
|
44
45
|
execute_goals( id: 'default-cli',
|
45
46
|
artifactItems: [ { groupId: 'org.processing',
|
46
47
|
artifactId: 'core',
|
47
|
-
version: '
|
48
|
+
version: '3.1.1',
|
48
49
|
type: 'jar',
|
49
50
|
outputDirectory: '${propane.basedir}/lib'
|
50
51
|
},
|
data/pom.xml
CHANGED
@@ -11,7 +11,7 @@ DO NOT MODIFIY - GENERATED CODE
|
|
11
11
|
<modelVersion>4.0.0</modelVersion>
|
12
12
|
<groupId>propane</groupId>
|
13
13
|
<artifactId>rp5extras</artifactId>
|
14
|
-
<version>0.
|
14
|
+
<version>2.0.0</version>
|
15
15
|
<name>rp5extras</name>
|
16
16
|
<description>rp5extras for propane</description>
|
17
17
|
<url>https://github.com/monkstone/propane</url>
|
@@ -46,16 +46,16 @@ DO NOT MODIFIY - GENERATED CODE
|
|
46
46
|
</developer>
|
47
47
|
</developers>
|
48
48
|
<scm>
|
49
|
-
<connection>scm:git:git://github.com/
|
50
|
-
<developerConnection>scm:git:git@github.com/
|
51
|
-
<url>https://github.com/
|
49
|
+
<connection>scm:git:git://github.com/ruby-processing/propane.git</connection>
|
50
|
+
<developerConnection>scm:git:git@github.com/ruby-processing/propane.git</developerConnection>
|
51
|
+
<url>https://github.com/ruby-processing/propane</url>
|
52
52
|
</scm>
|
53
53
|
<issueManagement>
|
54
54
|
<system>Github</system>
|
55
|
-
<url>https://github.com/
|
55
|
+
<url>https://github.com/ruby-processing/propane/issues</url>
|
56
56
|
</issueManagement>
|
57
57
|
<properties>
|
58
|
-
<jogl.version>2.
|
58
|
+
<jogl.version>2.3.2</jogl.version>
|
59
59
|
<jruby.api>http://jruby.org/apidocs/</jruby.api>
|
60
60
|
<source.directory>src</source.directory>
|
61
61
|
<maven.compiler.target>1.8</maven.compiler.target>
|
@@ -75,7 +75,12 @@ DO NOT MODIFIY - GENERATED CODE
|
|
75
75
|
<dependency>
|
76
76
|
<groupId>org.processing</groupId>
|
77
77
|
<artifactId>core</artifactId>
|
78
|
-
<version>
|
78
|
+
<version>3.1.1</version>
|
79
|
+
</dependency>
|
80
|
+
<dependency>
|
81
|
+
<groupId>org.processing</groupId>
|
82
|
+
<artifactId>video</artifactId>
|
83
|
+
<version>3.0.2</version>
|
79
84
|
</dependency>
|
80
85
|
<dependency>
|
81
86
|
<groupId>org.jogamp.jogl</groupId>
|
@@ -109,7 +114,7 @@ DO NOT MODIFIY - GENERATED CODE
|
|
109
114
|
<artifactItem>
|
110
115
|
<groupId>org.processing</groupId>
|
111
116
|
<artifactId>core</artifactId>
|
112
|
-
<version>
|
117
|
+
<version>3.1.1</version>
|
113
118
|
<type>jar</type>
|
114
119
|
<outputDirectory>${propane.basedir}/lib</outputDirectory>
|
115
120
|
</artifactItem>
|