MergeAsXML 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +5 -0
- data/MergeAsXML.gemspec +25 -0
- data/bin/MergeAsXML +133 -0
- data/lib/MergeAsXML.rb +67 -0
- data/lib/marker.xml.erb +17 -0
- data/readme.md +79 -0
- metadata +76 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA512:
|
3
|
+
metadata.gz: 9a7d718bf390dd637775aa9e006bacc4e7961d3dbe79bb73bdf1e051121b34694d299d7343a9359b215533a33435b47583abcca6a6be938164fe4b448c815be8
|
4
|
+
data.tar.gz: 4174ac6dbe6a2c963629efc077a11abe00497bc17f6de431861a93b73d082d0f6677d56bef71c2f9ac699b0e41d4efdee27a27dbe4ba8a3fb14500b3077153a8
|
5
|
+
SHA1:
|
6
|
+
metadata.gz: fc7c6b73892db829f0863d77fa83871fc2aadb08
|
7
|
+
data.tar.gz: 488371d5bd78fe88a3b16d7847bc5353824e6edd
|
data/Gemfile
ADDED
data/MergeAsXML.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'MergeAsXML'
|
3
|
+
s.version = '0.0.4'
|
4
|
+
s.date = '2013-05-16'
|
5
|
+
s.homepage = 'https://github.com/dmison/MergeAsXML'
|
6
|
+
s.summary = "CLI to takes data from a delimited text file and merges into XML"
|
7
|
+
s.description = "Takes data from a delimited text file and merges into XML"
|
8
|
+
s.authors = ["Darrin Mison"]
|
9
|
+
s.email = 'dmison@me.com'
|
10
|
+
s.executables << 'MergeAsXML'
|
11
|
+
s.files = [
|
12
|
+
"Gemfile",
|
13
|
+
"readme.md",
|
14
|
+
"MergeAsXML.gemspec",
|
15
|
+
"bin/MergeAsXML",
|
16
|
+
"lib/MergeAsXML.rb",
|
17
|
+
"lib/marker.xml.erb"
|
18
|
+
]
|
19
|
+
|
20
|
+
s.add_runtime_dependency("rainbow", [">= 1.1.4"])
|
21
|
+
s.add_runtime_dependency("erubis", [">= 2.7.0"])
|
22
|
+
|
23
|
+
|
24
|
+
end
|
25
|
+
|
data/bin/MergeAsXML
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
#!/usr/bin/env ruby -W0
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.dirname(__FILE__)
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'optparse'
|
7
|
+
require 'MergeAsXML.rb'
|
8
|
+
|
9
|
+
#process command line arguments and return options hash
|
10
|
+
def processCommandLine
|
11
|
+
options = {}
|
12
|
+
|
13
|
+
optparse = OptionParser.new do |opts|
|
14
|
+
opts.banner = "MergeAsXML v0.0.4".color("#800040").bright
|
15
|
+
|
16
|
+
options[:datafile] = ""
|
17
|
+
opts.on( '-i filename', '--input filename', 'File containing input data' ) do | datafile |
|
18
|
+
options[:datafile] = datafile
|
19
|
+
end
|
20
|
+
|
21
|
+
options[:delim] = "\t"
|
22
|
+
opts.on( '-s separator', 'The delimiter of each field in the input file (default: tab ''\\t'')') do | delim |
|
23
|
+
options[:delim] = "#{delim}"
|
24
|
+
end
|
25
|
+
|
26
|
+
options[:xmlfile] = ""
|
27
|
+
opts.on( '-X file', 'The XML file to merge the data into' ) do | xmlfile |
|
28
|
+
options[:xmlfile] = "#{xmlfile}"
|
29
|
+
end
|
30
|
+
|
31
|
+
options[:parentpath] = ""
|
32
|
+
opts.on( '-p parent path', 'The path of the parent node to insert at' ) do | parentpath |
|
33
|
+
options[:parentpath] = "#{parentpath}"
|
34
|
+
end
|
35
|
+
options[:prevsiblingpath] = ""
|
36
|
+
opts.on( '-b previous sibling path', 'The path of the sibling node to insert after' ) do | prevsiblingpath |
|
37
|
+
options[:prevsiblingpath] = "#{prevsiblingpath}"
|
38
|
+
end
|
39
|
+
options[:nextsiblingpath] = ""
|
40
|
+
opts.on( '-c next sibling path', 'The path of the sibling node to insert before' ) do | nextsiblingpath |
|
41
|
+
options[:nextsiblingpath] = "#{nextsiblingpath}"
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
options[:template] = ""
|
46
|
+
opts.on( '-t template', 'ERB template to populate (defaults to inbuilt default template)' ) do | template |
|
47
|
+
options[:template] = template
|
48
|
+
end
|
49
|
+
|
50
|
+
# options[:followXIInclude] = false
|
51
|
+
# opts.on( '-x', '--xiinclude', 'Follow' ) do
|
52
|
+
# options[:getSecurityLevels] = true
|
53
|
+
# end
|
54
|
+
|
55
|
+
opts.on( '-d', 'Dump default template to default.xml.erb' ) do
|
56
|
+
print "Saving built in template to "
|
57
|
+
print "default.xml.erb".bright.underline
|
58
|
+
puts "."
|
59
|
+
|
60
|
+
filename = File.expand_path "../../lib/marker.xml.erb", __FILE__
|
61
|
+
|
62
|
+
FileUtils.cp(filename, "default.xml.erb")
|
63
|
+
exit
|
64
|
+
end
|
65
|
+
|
66
|
+
opts.on( '-h', 'Display this screen' ) do
|
67
|
+
puts opts
|
68
|
+
exit
|
69
|
+
end
|
70
|
+
|
71
|
+
if (ARGV.size == 0) then
|
72
|
+
puts opts
|
73
|
+
exit
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
begin
|
79
|
+
optparse.parse!
|
80
|
+
rescue => error
|
81
|
+
puts "ERROR PARSING COMMANDLINE:".color("#ff0000")
|
82
|
+
puts "\t"+error.to_s
|
83
|
+
puts
|
84
|
+
puts optparse
|
85
|
+
exit
|
86
|
+
end
|
87
|
+
|
88
|
+
#check for other weirdness here
|
89
|
+
return options
|
90
|
+
end
|
91
|
+
|
92
|
+
options = processCommandLine
|
93
|
+
|
94
|
+
lines = fileToArray(options[:datafile])
|
95
|
+
data = stringsToArray(lines, options[:delim])
|
96
|
+
|
97
|
+
if options[:template] == ""
|
98
|
+
template_fn = File.expand_path "../../lib/marker.xml.erb", __FILE__
|
99
|
+
else
|
100
|
+
template_fn = "#{Dir.getwd}/#{options[:template]}"
|
101
|
+
end
|
102
|
+
|
103
|
+
puts template_fn
|
104
|
+
|
105
|
+
template = ERB.new File.new(template_fn).read, nil, "%"
|
106
|
+
output = template.result(binding)
|
107
|
+
|
108
|
+
if (options[:xmlfile] == "")
|
109
|
+
puts output
|
110
|
+
exit
|
111
|
+
end
|
112
|
+
|
113
|
+
if options[:prevsiblingpath] != ""
|
114
|
+
action = "after"
|
115
|
+
xpath = options[:prevsiblingpath]
|
116
|
+
end
|
117
|
+
if options[:nextsiblingpath] != ""
|
118
|
+
action = "before"
|
119
|
+
xpath = options[:nextsiblingpath]
|
120
|
+
end
|
121
|
+
if options[:parentpath] != ""
|
122
|
+
action = "as child of"
|
123
|
+
xpath = options[:parentpath]
|
124
|
+
end
|
125
|
+
|
126
|
+
puts "Merging data #{action.bright} #{xpath.underline} in #{options[:xmlfile]}"
|
127
|
+
|
128
|
+
|
129
|
+
outputstring = mergeOutputIntoXML(output, options[:xmlfile], xpath, action)
|
130
|
+
|
131
|
+
saveNewFileWithBackup(outputstring, options[:xmlfile])
|
132
|
+
|
133
|
+
puts "Done"
|
data/lib/MergeAsXML.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'rainbow'
|
2
|
+
require 'erb'
|
3
|
+
require 'FileUtils'
|
4
|
+
require 'rexml/document'
|
5
|
+
require 'rexml/XPath'
|
6
|
+
|
7
|
+
# takes a filename and returns an array of strings
|
8
|
+
def fileToArray (filename)
|
9
|
+
lines = Array.new
|
10
|
+
File.open(filename) do |fp|
|
11
|
+
fp.each do | line |
|
12
|
+
lines << line.strip
|
13
|
+
end
|
14
|
+
end
|
15
|
+
return lines
|
16
|
+
end
|
17
|
+
|
18
|
+
# takes an array of strings and a delimiter
|
19
|
+
# returns a two-dimensional array based on the delimiter
|
20
|
+
def stringsToArray(strings, delim)
|
21
|
+
lines = Array.new
|
22
|
+
|
23
|
+
strings.each do | string |
|
24
|
+
line = string.split(delim)
|
25
|
+
lines << line
|
26
|
+
end
|
27
|
+
return lines
|
28
|
+
end
|
29
|
+
|
30
|
+
def saveNewFileWithBackup(outputstring, filename)
|
31
|
+
#make backup, filename.backup
|
32
|
+
FileUtils.cp(filename, "#{filename}.backup")
|
33
|
+
# write output
|
34
|
+
File.open(filename, 'w') {|f| f.write(outputstring) }
|
35
|
+
end
|
36
|
+
|
37
|
+
#output is required to be a string containing valid XML
|
38
|
+
def mergeOutputIntoXML(output, xmlfilename, xpath, action)
|
39
|
+
|
40
|
+
#load XML doc from xmlfilename
|
41
|
+
doc = REXML::Document.new ( File.new(xmlfilename) ) #getSourceXMLDoc(xmlfilename)
|
42
|
+
fragment = REXML::Document.new("<wrapper>#{output}</wrapper>")
|
43
|
+
|
44
|
+
#insertpoint = doc.at_xpath(xpath)
|
45
|
+
insertpoint = REXML::XPath.first(doc, xpath)
|
46
|
+
|
47
|
+
fragment.root.elements.each do | child |
|
48
|
+
case action
|
49
|
+
when "after"
|
50
|
+
# insert as next siblings of specified xpath
|
51
|
+
insertpoint.insert_after(xpath, child)
|
52
|
+
|
53
|
+
when "before"
|
54
|
+
# insert as prev siblings of specified xpath
|
55
|
+
insertpoint.insert_before(xpath, child)
|
56
|
+
when "as child of"
|
57
|
+
# insert as child of specified xpath
|
58
|
+
insertpoint.add(child)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# return string
|
63
|
+
return doc.to_s
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
|
data/lib/marker.xml.erb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
<!-- generated data begins -->
|
3
|
+
<% data.each_index do | index | %>
|
4
|
+
<marker>
|
5
|
+
<name>Marker #<%= index %></name>
|
6
|
+
<comment><%= data[index][1] %></comment>
|
7
|
+
<color>
|
8
|
+
<alpha>0</alpha>
|
9
|
+
<red>255</red>
|
10
|
+
<green>0</green>
|
11
|
+
<blue>0</blue>
|
12
|
+
</color>
|
13
|
+
<in><%= data[index][0] %></in>
|
14
|
+
<out>-1</out>
|
15
|
+
</marker>
|
16
|
+
<% end %>
|
17
|
+
<!-- generated data ends -->
|
data/readme.md
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
## MergeAsXML
|
2
|
+
|
3
|
+
This is a simple Ruby based command line tool that takes a delimited data file (like a CSV file) and merges it into a already existing XML file.
|
4
|
+
|
5
|
+
MergeAsXML v1.0.0
|
6
|
+
-i, --input filename File containing input data
|
7
|
+
-s separator The delimiter of each field in the input file (default: tab \t)
|
8
|
+
-X file The XML file to merge the data into
|
9
|
+
-p parent path The path of the parent node to insert at
|
10
|
+
-b previous sibling path The path of the sibling node to insert after
|
11
|
+
-c next sibling path The path of the sibling node to insert before
|
12
|
+
-t template ERB template to populate (defaults to inbuilt default template)
|
13
|
+
-d Dump default template to default.xml.erb
|
14
|
+
-h Display this screen
|
15
|
+
|
16
|
+
The basic use case involves you having :
|
17
|
+
|
18
|
+
1. A delimited datafile, like a CSV file
|
19
|
+
2. An XML file
|
20
|
+
|
21
|
+
And you need to get the data from the datafile formatting and inserted into the right place in the XML file.
|
22
|
+
|
23
|
+
To do this you specify:
|
24
|
+
|
25
|
+
1. The datafile to use
|
26
|
+
2. The delimiter for the file. Default is tab.
|
27
|
+
3. An ERB template to control how the data is turned into XML.
|
28
|
+
4. The XML file to insert the output into.
|
29
|
+
5. An xpath expression to indicate where to insert the new XML. Only the first match is used.
|
30
|
+
6. Whether the xpath expression indicates the parent node for the new data (`-p`), or a sibling node to insert before (`-c`)or after (`-b`).
|
31
|
+
|
32
|
+
Here's an example of the command-line inserting CSV data as Markers into a Final Cut Pro XML export.
|
33
|
+
|
34
|
+
MergeAsXML -i timecode-data.csv -s , -X FC_XML_EXPORT.XML -b /xmeml/sequence/ismasterclip -t markers.xml.erb
|
35
|
+
|
36
|
+
A backup copy of the XML file is made with the suffix `.backup`.
|
37
|
+
|
38
|
+
### Installing
|
39
|
+
|
40
|
+
It's available as a Ruby Gem.
|
41
|
+
|
42
|
+
sudo gem install MergeAsXML
|
43
|
+
|
44
|
+
### Making templates
|
45
|
+
|
46
|
+
MergeAsXML uses ERB templates. You can read about ERB [here][1].
|
47
|
+
|
48
|
+
You can get a copy of the default template using the -d parameter. It saves a copy of the default template in your current directory.
|
49
|
+
|
50
|
+
MergeAsXML -d
|
51
|
+
|
52
|
+
The default template looks like this:
|
53
|
+
|
54
|
+
<!-- generated data begins -->
|
55
|
+
<% data.each_index do | index | %>
|
56
|
+
<marker>
|
57
|
+
<name>Marker #<%= index %></name>
|
58
|
+
<comment><%= data[index][1] %></comment>
|
59
|
+
<color>
|
60
|
+
<alpha>0</alpha>
|
61
|
+
<red>255</red>
|
62
|
+
<green>0</green>
|
63
|
+
<blue>0</blue>
|
64
|
+
</color>
|
65
|
+
<in><%= data[index][0] %></in>
|
66
|
+
<out>-1</out>
|
67
|
+
</marker>
|
68
|
+
<% end %>
|
69
|
+
<!-- generated data ends -->
|
70
|
+
|
71
|
+
The data from the input file goes into a simple 2D array called `data`. So each specific item can be accessed as such:
|
72
|
+
|
73
|
+
data[row][col]
|
74
|
+
|
75
|
+
And you can step through each item using the `.each_index` operation.
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
[1]: http://en.wikipedia.org/wiki/ERuby
|
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: MergeAsXML
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.4
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Darrin Mison
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2013-05-16 00:00:00 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rainbow
|
16
|
+
prerelease: false
|
17
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - ">="
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.1.4
|
22
|
+
type: :runtime
|
23
|
+
version_requirements: *id001
|
24
|
+
- !ruby/object:Gem::Dependency
|
25
|
+
name: erubis
|
26
|
+
prerelease: false
|
27
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - ">="
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: 2.7.0
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id002
|
34
|
+
description: Takes data from a delimited text file and merges into XML
|
35
|
+
email: dmison@me.com
|
36
|
+
executables:
|
37
|
+
- MergeAsXML
|
38
|
+
extensions: []
|
39
|
+
|
40
|
+
extra_rdoc_files: []
|
41
|
+
|
42
|
+
files:
|
43
|
+
- Gemfile
|
44
|
+
- readme.md
|
45
|
+
- MergeAsXML.gemspec
|
46
|
+
- bin/MergeAsXML
|
47
|
+
- lib/MergeAsXML.rb
|
48
|
+
- lib/marker.xml.erb
|
49
|
+
homepage: https://github.com/dmison/MergeAsXML
|
50
|
+
licenses: []
|
51
|
+
|
52
|
+
metadata: {}
|
53
|
+
|
54
|
+
post_install_message:
|
55
|
+
rdoc_options: []
|
56
|
+
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- &id003
|
62
|
+
- ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: "0"
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- *id003
|
68
|
+
requirements: []
|
69
|
+
|
70
|
+
rubyforge_project:
|
71
|
+
rubygems_version: 2.0.3
|
72
|
+
signing_key:
|
73
|
+
specification_version: 4
|
74
|
+
summary: CLI to takes data from a delimited text file and merges into XML
|
75
|
+
test_files: []
|
76
|
+
|