adobe_crx 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/bin/crx ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ $: << File.dirname(__FILE__) + "/../lib"
3
+
4
+ require 'adobe_crx/cli'
@@ -0,0 +1,29 @@
1
+ command :export do |c|
2
+ c.syntax = 'crx export [options] <root path>'
3
+ c.description = 'Exports a simple package for the given root path'
4
+ c.option "--output_file OUTPUT_FILE", String, "package output file"
5
+ c.action do |args, options|
6
+ if !args[0]
7
+ say_error "no root path specified. Use --help for more information"
8
+ exit 1
9
+ end
10
+ validate_global_options c, options
11
+ output_file = options.output_file
12
+ if output_file
13
+ if File.exists? output_file
14
+ overwrite = ask("File #{output_file} exists. Overwrite? (Y/N)")
15
+ if overwrite == 'Y'
16
+ File.delete output_file
17
+ else
18
+ exit 1
19
+ end
20
+ end
21
+ end
22
+
23
+ package = AdobeCRX::Package.new "export-#{Time.now.strftime('%Y%m%d%H%M%S')}-#{args[0]}".gsub('/', '-').gsub(' ', '_').gsub("%20", '_')
24
+ package.filters << AdobeCRX::PackageFilter.new(args[0])
25
+
26
+ client = AdobeCRX::Client.new options.host, options.port, options.username, options.password
27
+ client.export_package package, output_file
28
+ end
29
+ end
@@ -0,0 +1,27 @@
1
+ command :export_uber do |c|
2
+ c.syntax = 'crx export_uber [options] <uber manifest location>'
3
+ c.description = 'Exports an "uber" package based on a manifest file (see the generate_uber_manifest command).'
4
+ c.option "--output_dir OUTPUT_DIR", String, "uber package output directory"
5
+ c.action do |args, options|
6
+ if !args[0]
7
+ say_error "no uber manifest specified. Use --help for more information"
8
+ exit 1
9
+ end
10
+ if !File.exist? args[0]
11
+ say_error "uber manifest file (#{args[0]}) does not exist"
12
+ exit 1
13
+ end
14
+ validate_global_options c, options
15
+ output_dir = options.output_dir
16
+ if output_dir
17
+ if !File.writable? output_dir
18
+ say_error "unable to write to output directory #{output_dir}"
19
+ exit 1
20
+ end
21
+ end
22
+
23
+ client = AdobeCRX::Client.new options.host, options.port, options.username, options.password
24
+ upm = AdobeCRX::UberPackageManager.new client
25
+ json = upm.export_uber_package args[0], output_dir
26
+ end
27
+ end
@@ -0,0 +1,47 @@
1
+ command :generate_uber_manifest do |c|
2
+ c.syntax = 'crx generate_uber_manifest [options] <root path>'
3
+ c.description = 'Generates an uber package manifest.'
4
+ c.option "--output_file OUTPUT_FILE", String, "uber manifest output file location"
5
+ c.option "--export_name EXPORT_NAME", String, "export name"
6
+ c.option "--root_package_depth ROOT_PACKAGE_DEPTH", String, "specify the node depth of the root package. defaults to '1'"
7
+ c.option "--target_package_size TARGET_PACKAGE_SIZE", String, "specify the desired size of 'leaf' packages. defaults to '0', which means to not check content size (results in faster manifest creation)"
8
+ c.action do |args, options|
9
+ if !args[0]
10
+ say_error "no root path specified. Use --help for more information"
11
+ exit 1
12
+ end
13
+ validate_global_options c, options
14
+ output_file = options.output_file
15
+ if output_file
16
+ if File.exists? output_file
17
+ overwrite = ask("File #{output_file} exists. Overwrite? (Y/N)")
18
+ if overwrite == 'Y'
19
+ File.delete output_file
20
+ else
21
+ exit 1
22
+ end
23
+ end
24
+ end
25
+ export_name = options.export_name
26
+ export_name = 'export' if !export_name
27
+
28
+ uber_options = {}
29
+ if options.root_package_depth
30
+ uber_options[:root_package_depth] = options.root_package_depth.to_i
31
+ end
32
+ if options.target_package_size
33
+ uber_options[:target_package_size] = options.target_package_size.to_i
34
+ end
35
+
36
+ client = AdobeCRX::Client.new options.host, options.port, options.username, options.password
37
+ upm = AdobeCRX::UberPackageManager.new client
38
+ json = upm.generate_uber_package_definition export_name, args[0], uber_options
39
+ if output_file
40
+ File.open output_file, 'w' do |f|
41
+ f.write(json)
42
+ end
43
+ else
44
+ puts json
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,18 @@
1
+ command :import do |c|
2
+ c.syntax = 'crx import [options] <package file>'
3
+ c.description = 'Imports a package to the target crx instance'
4
+ c.action do |args, options|
5
+ if !args[0]
6
+ say_error "no package file specified. Use --help for more information"
7
+ exit 1
8
+ end
9
+ if !File.exist? args[0]
10
+ say_error "package file (#{args[0]}) does not exist"
11
+ exit 1
12
+ end
13
+ validate_global_options c, options
14
+
15
+ client = AdobeCRX::Client.new options.host, options.port, options.username, options.password
16
+ client.import_package args[0]
17
+ end
18
+ end
@@ -0,0 +1,27 @@
1
+ command :import_uber do |c|
2
+ c.syntax = 'crx import_uber [options] <uber package dir> [uber manifest file]'
3
+ c.description = 'Imports an "uber" package from a given directory (and optional manifest file--if not specified the manifest is assumed to be <uber package dir>/manifest.json).'
4
+ c.action do |args, options|
5
+ if !args[0]
6
+ say_error "no uber manifest directory. Use --help for more information"
7
+ exit 1
8
+ end
9
+ if !File.directory? args[0]
10
+ say_error "uber manifest directory (#{args[0]}) does not exist"
11
+ exit 1
12
+ end
13
+ manifest_file = args[1]
14
+ if !manifest_file
15
+ manifest_file = "#{args[0]}/manifest.json"
16
+ end
17
+ if !File.exist? manifest_file
18
+ say_error "uber manifest file (#{manifest_file}) does not exist"
19
+ exit 1
20
+ end
21
+ validate_global_options c, options
22
+
23
+ client = AdobeCRX::Client.new options.host, options.port, options.username, options.password
24
+ upm = AdobeCRX::UberPackageManager.new client
25
+ upm.import_uber_package manifest_file, args[0]
26
+ end
27
+ end
@@ -0,0 +1,36 @@
1
+ require 'rubygems'
2
+ require 'commander/import'
3
+ require 'adobe_crx'
4
+
5
+ program :name, 'crx'
6
+ program :version, '0.0.1'
7
+ program :description, 'Command line tools for Adobe CRX.'
8
+
9
+ global_option "--host HOSTNAME", String, "crx HOSTNAME"
10
+ global_option "--port PORT", Float, "crx PORT"
11
+ global_option "--username USERNAME", String, "crx USERNAME"
12
+ global_option "--password PASSWORD", String, "crx PASSWORD"
13
+
14
+ def validate_global_options(command, options)
15
+ if !options.host
16
+ options.host = ask 'CRX host:'
17
+ end
18
+ if !options.port
19
+ options.port = ask 'CRX port:'
20
+ else
21
+ options.port = options.port.to_i
22
+ end
23
+ if !options.username
24
+ options.username = ask 'CRX username:'
25
+ end
26
+ if !options.password
27
+ options.password = password('CRX password:')
28
+ end
29
+ end
30
+
31
+ Dir.foreach(File.dirname(__FILE__) + '/cli') do |filename|
32
+ to_require = File.basename(filename, '.rb')
33
+ if !to_require.match(/^\./)
34
+ require "adobe_crx/cli/#{to_require}"
35
+ end
36
+ end
@@ -0,0 +1,228 @@
1
+ require 'rubygems'
2
+ require 'rexml/document'
3
+ require 'net/http'
4
+ require 'net/http/post/multipart'
5
+ require 'net/dav'
6
+ require 'json'
7
+ require 'tmpdir'
8
+
9
+ # monkey-patch so that we can take advantage of the innards of Net::DAV
10
+ module Net
11
+ class DAV
12
+ class NetHttpHandler
13
+ alias_method :handle_request_original, :handle_request
14
+
15
+ def handle_request(req, headers, limit = MAX_REDIRECTS, &block)
16
+ if @user && @pass
17
+ req.basic_auth @user, @pass
18
+ end
19
+ handle_request_original(req, headers, limit, &block)
20
+ end
21
+ end
22
+
23
+ def propfind_size(path)
24
+ headers = {'Depth' => 'infinity'}
25
+ body = '<?xml version="1.0" encoding="utf-8"?><DAV:propfind xmlns:DAV="DAV:"><DAV:prop><DAV:getcontentlength/></DAV:prop></DAV:propfind>'
26
+ res = @handler.request(:propfind, path, body, headers)
27
+ total_size = 0
28
+ xml = Nokogiri::XML.parse(res.body)
29
+ namespaces = {'x' => "DAV:"}
30
+ xml./('.//x:response', namespaces).each do |item|
31
+ begin
32
+ total_size = total_size + item.%(".//x:getcontentlength", namespaces).inner_text.to_i
33
+ rescue Exception
34
+ #nothing
35
+ end
36
+ end
37
+ total_size
38
+ end
39
+ end
40
+ end
41
+
42
+ class AdobeCRX::Client
43
+ def initialize(host, port, username, password)
44
+ @host = host
45
+ @port = port
46
+ @username = username
47
+ @password = password
48
+ end
49
+
50
+ #package management methods
51
+ def list_packages
52
+ xml_data = Net::HTTP.get_response(URI.parse("http://#{@username}:#{@password}@#{@host}:#{@port}/crx/packmgr/service.jsp?cmd=ls")).body
53
+ doc = REXML::Document.new(xml_data)
54
+
55
+ packages = Array.new
56
+ doc.elements.each("//response/data/packages/package") do |ele|
57
+ package = Hash.new
58
+ packages << package
59
+ ele.elements.each do |child|
60
+ package[child.name] = child.text
61
+ end
62
+ end
63
+ return packages
64
+ end
65
+
66
+ def upload_package(package_file)
67
+ results = AdobeCRX::PackageUtils.get_package_properties(package_file)
68
+ File.open(package_file) do |package|
69
+ req = Net::HTTP::Post::Multipart.new(
70
+ '/crx/packmgr/service/.json/?cmd=upload',
71
+ 'force' => 'true',
72
+ 'package' => UploadIO.new(package, 'application/zip', File.basename(package_file))
73
+ )
74
+ req.basic_auth(@username, @password)
75
+ Net::HTTP.start(@host, @port) do |http|
76
+ response = http.request(req)
77
+ results.merge! JSON.parse(response.body)
78
+ end
79
+ end
80
+ results
81
+ end
82
+
83
+ def install_package(path)
84
+ req = Net::HTTP::Post.new("/crx/packmgr/service/.json#{path}?cmd=install")
85
+ req.basic_auth(@username, @password)
86
+ result = Hash.new
87
+ Net::HTTP.start(@host, @port) do |http|
88
+ response = http.request(req)
89
+ result.merge! JSON.parse(response.body)
90
+ end
91
+ result
92
+ end
93
+
94
+ def remove_package(path)
95
+ req = Net::HTTP::Post.new("/crx/packmgr/service/.json#{path}?cmd=delete")
96
+ req.basic_auth(@username, @password)
97
+ result = Hash.new
98
+ Net::HTTP.start(@host, @port) do |http|
99
+ response = http.request(req)
100
+ result.merge! JSON.parse(response.body)
101
+ end
102
+ result
103
+ end
104
+
105
+ def export_package(package, dest_file = nil)
106
+ #create the package
107
+ req = Net::HTTP::Post.new('/crx/packmgr/service/.json/etc/packages/my_packages?cmd=create')
108
+ req.basic_auth(@username, @password)
109
+ params = Hash.new
110
+ params['packageName'] = package.name
111
+ params['groupName'] = 'automated-exports'
112
+ req.set_form_data(params)
113
+ create_result = nil
114
+ Net::HTTP.start(@host, @port) do |http|
115
+ response = http.request(req)
116
+ create_result = JSON.parse(response.body)
117
+ if !create_result['success']
118
+ raise AdobeCRX::CRXException, create_result['msg']
119
+ end
120
+ end
121
+
122
+ #add the filters
123
+ req = Net::HTTP::Post::Multipart.new(
124
+ '/crx/packmgr/update.jsp',
125
+ '_charset_' => 'utf-8',
126
+ 'path' => create_result['path'],
127
+ 'packageName' => package.name,
128
+ 'groupName' => 'automated-exports',
129
+ 'filter' => package.filters.to_json
130
+ )
131
+ req.basic_auth(@username, @password)
132
+ Net::HTTP.start(@host, @port) do |http|
133
+ response = http.request(req)
134
+ result = JSON.parse(response.body)
135
+ if !result['success']
136
+ raise AdobeCRX::CRXException, create_result['msg']
137
+ end
138
+ end
139
+
140
+ #build the package
141
+ req = Net::HTTP::Post.new("/crx/packmgr/service/.json#{create_result['path']}?cmd=build")
142
+ req.basic_auth(@username, @password)
143
+ Net::HTTP.start(@host, @port) do |http|
144
+ http.read_timeout = 1800
145
+ response = http.request(req)
146
+ result = JSON.parse(response.body)
147
+ if !result['success']
148
+ raise AdobeCRX::CRXException, create_result['msg']
149
+ end
150
+ end
151
+
152
+ #download the package
153
+ file_path = dest_file ? dest_file : "#{Dir.tmpdir}/#{package.name}"
154
+ req = Net::HTTP::Get.new(create_result['path'])
155
+ req.basic_auth(@username, @password)
156
+ Net::HTTP.start(@host, @port) do |http|
157
+ f = File.open(file_path, 'w')
158
+ begin
159
+ http.request(req) do |resp|
160
+ resp.read_body do |segment|
161
+ f.write(segment)
162
+ end
163
+ end
164
+ ensure
165
+ f.close()
166
+ end
167
+ end
168
+
169
+ #delete the package
170
+ remove_package(create_result['path'])
171
+
172
+ file_path
173
+ end
174
+
175
+ def import_package(package_file)
176
+ upload_result = upload_package(package_file)
177
+ if !upload_result['success'] || upload_result['path'] == nil
178
+ raise AdobeCRX::CRXException, "Error uploading package: #{upload_result['msg']}"
179
+ end
180
+ install_result = install_package(upload_result['path'])
181
+ if !install_result['success']
182
+ raise AdobeCRX::CRXException, "Error installing package: #{install_result['msg']}"
183
+ end
184
+ remove_package(upload_result['path'])
185
+ result = "successfully deployed package at #{package_file}:"
186
+ upload_result.each do |key, value|
187
+ result << "\n #{key}: #{value}"
188
+ end
189
+ result
190
+ end
191
+
192
+ #content methods
193
+ def get_child_resources(path)
194
+ if !@dav
195
+ @dav = Net::DAV.new("http://#{@host}:#{@port}", :curl => false)
196
+ @dav.credentials(@username, @password)
197
+ end
198
+
199
+ resources = Array.new
200
+ @dav.find(path,:recursive=>false,:suppress_errors=>true) do | item |
201
+ resources << item.uri.path.sub(/\/$/, '')
202
+ end
203
+ resources
204
+ end
205
+
206
+ def get_node_structure(path, parent = nil)
207
+ if !@dav
208
+ @dav = Net::DAV.new("http://#{@host}:#{@port}", :curl => false)
209
+ @dav.credentials(@username, @password)
210
+ end
211
+ node = AdobeCRX::Node.new path
212
+ if parent
213
+ parent.children << node
214
+ end
215
+ begin
216
+ node.size = @dav.propfind_size("#{path}/jcr:content")
217
+ rescue Exception
218
+ #nothing
219
+ end
220
+ @dav.find(path,:recursive=>false,:suppress_errors=>true) do | item |
221
+ if path != item.uri.path
222
+ get_node_structure(item.uri.path.sub(/\/$/, ''), node)
223
+ end
224
+ end
225
+ node
226
+ end
227
+
228
+ end
@@ -0,0 +1,21 @@
1
+ class AdobeCRX::Node
2
+ attr_accessor :path, :size, :children
3
+
4
+ def initialize(path)
5
+ @path = path
6
+ @size = 0
7
+ @children = []
8
+ @cached_size = nil
9
+ end
10
+
11
+ def children_size
12
+ @children.inject(0) {|sum, n| sum + n.size }
13
+ end
14
+
15
+ def total_size
16
+ if !@cached_size
17
+ @cached_size = @size + (@children.inject(0) {|sum, n| sum + n.total_size })
18
+ end
19
+ @cached_size
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ class AdobeCRX::Package
2
+ attr_accessor :name, :filters, :properties
3
+
4
+ def initialize(name)
5
+ @name = name
6
+ @filters = []
7
+ @properties = {}
8
+ end
9
+
10
+ def to_json(*a)
11
+ {
12
+ 'name' => name,
13
+ 'filters' => filters
14
+ }.to_json(*a)
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ class AdobeCRX::PackageFilter
2
+ attr_accessor :root, :rules
3
+
4
+ def initialize(root, rules = [])
5
+ @root = root
6
+ @rules = rules
7
+ end
8
+
9
+ def to_json(*a)
10
+ {
11
+ 'root' => root,
12
+ 'rules' => rules
13
+ }.to_json(*a)
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ class AdobeCRX::PackageFilterRule
2
+ attr_accessor :modifier, :pattern
3
+
4
+ def initialize(modifier, pattern)
5
+ @modifier = modifier
6
+ @pattern = pattern
7
+ end
8
+
9
+ def to_json(*a)
10
+ {
11
+ 'modifier' => modifier,
12
+ 'pattern' => pattern
13
+ }.to_json(*a)
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'zip/zip'
2
+ require 'rexml/document'
3
+
4
+ class AdobeCRX::PackageUtils
5
+ def self.get_package_properties(package_file)
6
+ Zip::ZipFile.open(package_file, Zip::ZipFile::CREATE) do |zipfile|
7
+ doc = REXML::Document.new(zipfile.read("META-INF/vault/properties.xml"))
8
+ properties = Hash.new
9
+ doc.elements.each("//properties/entry") do |ele|
10
+ properties[ele.attributes['key']] = ele.text
11
+ end
12
+ return properties
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,32 @@
1
+ class AdobeCRX::UberPackage
2
+ attr_accessor :name, :packages
3
+
4
+ def initialize(name)
5
+ @name = name
6
+ @packages = []
7
+ end
8
+
9
+ def to_json(*a)
10
+ {
11
+ 'name' => name,
12
+ 'packages' => packages
13
+ }.to_json(*a)
14
+ end
15
+
16
+ def self.from_json(json)
17
+ data = JSON.parse(json)
18
+ uber = AdobeCRX::UberPackage.new data['name']
19
+ data['packages'].each do |p|
20
+ package = AdobeCRX::Package.new p['name']
21
+ uber.packages << package
22
+ p['filters'].each do |f|
23
+ filter = AdobeCRX::PackageFilter.new f['root']
24
+ package.filters << filter
25
+ f['rules'].each do |r|
26
+ filter.rules << AdobeCRX::PackageFilterRule.new(r['modifier'], r['pattern'])
27
+ end
28
+ end
29
+ end
30
+ uber
31
+ end
32
+ end
@@ -0,0 +1,121 @@
1
+ require 'json'
2
+
3
+ class AdobeCRX::UberPackageManager
4
+ def initialize(client)
5
+ @client = client
6
+ end
7
+
8
+ def generate_uber_package_definition(name, root_path, options = {})
9
+ opts = {
10
+ :target_package_size => 0,
11
+ :root_package_depth => 1 #if 0, what's the point of creating an uber package?
12
+ }.merge(options)
13
+
14
+ root_node = get_node_structure(root_path, opts, 0)
15
+
16
+ uber = AdobeCRX::UberPackage.new name
17
+ root_package = AdobeCRX::Package.new "#{name}-root"
18
+ uber.packages << root_package
19
+ root_filter = AdobeCRX::PackageFilter.new root_path
20
+ root_package.filters << root_filter
21
+ root_package.properties[:size] = root_node.size
22
+ process_node_for_uber(name, root_node, uber.packages, root_package, opts, 0)
23
+
24
+ JSON.pretty_generate(JSON.parse(uber.to_json))
25
+ end
26
+
27
+ def export_uber_package(uber_package_definition, dest_dir = nil)
28
+ manifest_file = File.open(uber_package_definition, "rb")
29
+ uber = AdobeCRX::UberPackage.from_json manifest_file.read
30
+
31
+ uber_dir = dest_dir ? dest_dir : "#{Dir.tmpdir}/uber_packages/#{uber.name}"
32
+ FileUtils.mkpath uber_dir
33
+
34
+ #export the packages to the uber_dir
35
+ uber.packages.each do |package|
36
+ puts "exporting #{package.name}..."
37
+ @client.export_package package, "#{uber_dir}/#{package.name}.zip"
38
+ end
39
+ end
40
+
41
+ def import_uber_package(uber_package_definition, uber_package_dir)
42
+ manifest_file = File.open(uber_package_definition, "rb")
43
+ uber = AdobeCRX::UberPackage.from_json manifest_file.read
44
+
45
+ #import the packages to the target crx instance
46
+ uber.packages.each do |package|
47
+ puts "importing #{package.name}..."
48
+ p_file = "#{uber_package_dir}/#{package.name}.zip"
49
+ if File.exist? p_file
50
+ @client.import_package p_file
51
+ else
52
+ puts "ERROR: package does not exist at '#{p_file}'"
53
+ end
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ def get_node_structure(path, options, current_level, parent_node = nil)
60
+ if options[:root_package_depth] > current_level
61
+ node = AdobeCRX::Node.new path
62
+ @client.get_child_resources(path).each do |child_path|
63
+ get_node_structure(child_path, options, current_level + 1, node)
64
+ end
65
+ elsif options[:target_package_size] > 0
66
+ node = @client.get_node_structure path
67
+ else
68
+ node = AdobeCRX::Node.new path
69
+ @client.get_child_resources(path).each do |child_path|
70
+ node.children << AdobeCRX::Node.new(child_path)
71
+ end
72
+ end
73
+ if parent_node
74
+ parent_node.children << node
75
+ end
76
+ node
77
+ end
78
+
79
+ def process_node_for_uber(name, node, packages, current_package, options, current_level)
80
+ #puts "#{node.path}: #{current_package.properties[:size]}, #{node.size}, #{node.children_size}, #{node.total_size}"
81
+ if options[:root_package_depth] > 0 && options[:root_package_depth] > current_level
82
+ node.children.each do |child|
83
+ process_node_for_uber(name, child, packages, current_package, options, current_level + 1)
84
+ end
85
+ elsif options[:root_package_depth] > 0 && options[:root_package_depth] == current_level
86
+ current_package.filters[0].rules << AdobeCRX::PackageFilterRule.new('exclude', node.path)
87
+ current_package.filters[0].rules << AdobeCRX::PackageFilterRule.new('exclude', "#{node.path}/.*")
88
+ new_package = AdobeCRX::Package.new "#{name}-#{node.path}".gsub('/', '-').gsub(' ', '_').gsub("%20", '_')
89
+ packages << new_package
90
+ new_filter = AdobeCRX::PackageFilter.new node.path
91
+ new_package.filters << new_filter
92
+ new_package.properties[:size] = node.size
93
+ node.children.each do |child|
94
+ process_node_for_uber(name, child, packages, new_package, options, current_level + 1)
95
+ end
96
+ elsif node.total_size > 0
97
+ branch_to_new_package = (
98
+ ((node.size + current_package.properties[:size]) > options[:target_package_size]) ||
99
+ ((node.children_size + current_package.properties[:size]) > options[:target_package_size])
100
+ )
101
+
102
+ if branch_to_new_package
103
+ current_package.filters[0].rules << AdobeCRX::PackageFilterRule.new('exclude', node.path)
104
+ current_package.filters[0].rules << AdobeCRX::PackageFilterRule.new('exclude', "#{node.path}/.*")
105
+ new_package = AdobeCRX::Package.new "#{name}-#{node.path}".gsub('/', '-').gsub(' ', '_').gsub("%20", '_')
106
+ packages << new_package
107
+ new_filter = AdobeCRX::PackageFilter.new node.path
108
+ new_package.filters << new_filter
109
+ new_package.properties[:size] = node.size
110
+ node.children.each do |child|
111
+ process_node_for_uber(name, child, packages, new_package, options, current_level + 1)
112
+ end
113
+ else
114
+ current_package.properties[:size] = current_package.properties[:size] + node.size
115
+ node.children.each do |child|
116
+ process_node_for_uber(name, child, packages, current_package, options, current_level + 1)
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1 @@
1
+ ADOBE_CRX_VERSION = "0.0.1"
data/lib/adobe_crx.rb ADDED
@@ -0,0 +1,14 @@
1
+ module AdobeCRX
2
+ class CRXException < RuntimeError
3
+
4
+ end
5
+ end
6
+
7
+ require 'adobe_crx/client'
8
+ require 'adobe_crx/node'
9
+ require 'adobe_crx/package'
10
+ require 'adobe_crx/package_filter'
11
+ require 'adobe_crx/package_filter_rule'
12
+ require 'adobe_crx/package_utils'
13
+ require 'adobe_crx/uber_package'
14
+ require 'adobe_crx/uber_package_manager'
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: adobe_crx
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Todd Tomkinson
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-09 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: json
16
+ requirement: &24061300 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *24061300
25
+ - !ruby/object:Gem::Dependency
26
+ name: rubyzip
27
+ requirement: &24060880 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *24060880
36
+ - !ruby/object:Gem::Dependency
37
+ name: multipart-post
38
+ requirement: &24060460 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *24060460
47
+ - !ruby/object:Gem::Dependency
48
+ name: net_dav
49
+ requirement: &24060040 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *24060040
58
+ - !ruby/object:Gem::Dependency
59
+ name: commander
60
+ requirement: &24059620 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *24059620
69
+ description: Ruby client used to manage day/adobe crx instances. Also includes utilities
70
+ for performing common maintenance tasks.
71
+ email:
72
+ - todd.g.tomkinson@gmail.com
73
+ executables:
74
+ - crx
75
+ extensions: []
76
+ extra_rdoc_files: []
77
+ files:
78
+ - lib/adobe_crx.rb
79
+ - lib/adobe_crx/uber_package.rb
80
+ - lib/adobe_crx/cli/import_uber.rb
81
+ - lib/adobe_crx/cli/import.rb
82
+ - lib/adobe_crx/cli/export.rb
83
+ - lib/adobe_crx/cli/generate_uber_manifest.rb
84
+ - lib/adobe_crx/cli/export_uber.rb
85
+ - lib/adobe_crx/client.rb
86
+ - lib/adobe_crx/package.rb
87
+ - lib/adobe_crx/version.rb
88
+ - lib/adobe_crx/cli.rb
89
+ - lib/adobe_crx/package_filter.rb
90
+ - lib/adobe_crx/package_utils.rb
91
+ - lib/adobe_crx/package_filter_rule.rb
92
+ - lib/adobe_crx/node.rb
93
+ - lib/adobe_crx/uber_package_manager.rb
94
+ - bin/crx
95
+ homepage: https://github.com/toddtomkinson/adobe_crx
96
+ licenses:
97
+ - Apache License (2.0)
98
+ post_install_message:
99
+ rdoc_options: []
100
+ require_paths:
101
+ - lib
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ! '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ none: false
111
+ requirements:
112
+ - - ! '>='
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ requirements: []
116
+ rubyforge_project:
117
+ rubygems_version: 1.8.10
118
+ signing_key:
119
+ specification_version: 3
120
+ summary: ruby client used to manage day/adobe crx instances
121
+ test_files: []