firebrew 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d60374125f704299bad2102f82186e95397ebd26
4
- data.tar.gz: 11c9f75973a885d728e389f0383f0b33f2b690c2
3
+ metadata.gz: 64ff3a699d6eb6038ac49fad26c13ea38d20f9b7
4
+ data.tar.gz: ead1c868230eee2dc80afe8595f17430715978f4
5
5
  SHA512:
6
- metadata.gz: d480f31e469ef6bd6b3f3fcd108138cc455b3cd4adf76e3c7c0308162011c5c7a18ea4ecd882ec8e82f6e11868932402f4ed64284f41fb46d7d0266f366e40e4
7
- data.tar.gz: d513c0fcaf40b6fe92d32c522e2ea577a24727c446c6182715985952ff109282494db9ab1d58123ed038690fcf31e73212dec6c2266bfc04cc150e186105c059
6
+ metadata.gz: b4fe6fbb93d9127d839c7917cd44ed6cf688e676d39d98933a2793c9464fc43452785463c3ba85bbcfc53998e530feeb1d6f3bc7d9c34835caa1ef8057c7b550
7
+ data.tar.gz: 83bd15df6e84aff5f351f2fdfdb9b16956bfcb385eaa5982b7597f204108e4991408973d71b88aecb324414bcc38ae7bc7017efaaca687cfb1703c7c34e409b4
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.1.3](https://github.com/mrk21/firebrew/tree/v0.1.3) - 2014-08-19
4
+
5
+ * Bugfix [#24](https://github.com/mrk21/firebrew/issues/24): When the `em:unpack` value of the install manifests was true, is unable to normally installing
6
+
3
7
  ## [0.1.2](https://github.com/mrk21/firebrew/tree/v0.1.2) - 2014-08-15
4
8
 
5
9
  * Bugfix [#23](https://github.com/mrk21/firebrew/issues/23): If the `install` element of the extension which was got by the generic AMO API was equal or greater than two, then occurs errors
@@ -26,4 +26,5 @@ Gem::Specification.new do |spec|
26
26
  spec.add_dependency "activeresource", "~> 4.0"
27
27
  spec.add_dependency "activemodel", "~> 4.1"
28
28
  spec.add_dependency "inifile", "~> 2.0"
29
+ spec.add_dependency "rubyzip", "~> 1.1"
29
30
  end
@@ -1,6 +1,8 @@
1
1
  require 'fileutils'
2
2
  require 'open-uri'
3
3
  require 'json'
4
+ require 'zip'
5
+ require 'rexml/document'
4
6
  require 'firebrew/firefox/basic_extension'
5
7
 
6
8
  module Firebrew::Firefox
@@ -22,7 +24,7 @@ module Firebrew::Firefox
22
24
  name: extension['defaultLocale']['name'],
23
25
  guid: extension['id'],
24
26
  version: extension['version'],
25
- uri: '%s.xpi' % File.join(self.profile.path, 'extensions', extension['id'])
27
+ uri: extension['descriptor'],
26
28
  }, self)
27
29
  end
28
30
  end
@@ -40,11 +42,31 @@ module Firebrew::Firefox
40
42
  def install(extension)
41
43
  dir = File.join(self.profile.path, 'extensions')
42
44
  FileUtils.mkdir_p dir
43
- install_path = '%s.xpi' % File.join(dir, extension.guid)
44
45
 
45
- open([extension.uri].flatten.first, 'rb') do |i|
46
- open(install_path, 'wb') do |o|
47
- o.write i.read
46
+ open([extension.uri].flatten.first, 'rb') do |r|
47
+ xpi = Zip::File.open(r)
48
+ install_manifests = xpi.find_entry('install.rdf')
49
+ install_manifests = install_manifests.get_input_stream.read
50
+ install_manifests = REXML::Document.new(install_manifests)
51
+ is_unpacking = REXML::XPath.match(install_manifests, '/RDF/Description/em:unpack/text()').first
52
+ is_unpacking = is_unpacking.nil? ? false : is_unpacking.value.strip == 'true'
53
+
54
+ if is_unpacking then
55
+ extension.uri = File.join(dir, extension.guid)
56
+ FileUtils.mkdir_p(extension.uri)
57
+ xpi.each do |entry|
58
+ next if entry.ftype == :directory
59
+ content = entry.get_input_stream.read
60
+ Dir.chdir(extension.uri) do
61
+ FileUtils.mkdir_p File.dirname(entry.name)
62
+ File.write(entry.name, content)
63
+ end
64
+ end
65
+ else
66
+ extension.uri = '%s.xpi' % File.join(dir, extension.guid)
67
+ open(extension.uri, 'wb') do |w|
68
+ w.write r.read
69
+ end
48
70
  end
49
71
  end
50
72
 
@@ -53,7 +75,7 @@ module Firebrew::Firefox
53
75
  end
54
76
 
55
77
  def uninstall(extension)
56
- FileUtils.rm_f extension.uri
78
+ FileUtils.rm_rf extension.uri
57
79
  self.remove(extension)
58
80
  self.push
59
81
  end
@@ -83,6 +105,7 @@ module Firebrew::Firefox
83
105
  'id'=> extension.guid,
84
106
  'location'=> 'app-profile',
85
107
  'version'=> extension.version,
108
+ 'descriptor'=> extension.uri,
86
109
  'defaultLocale'=> {
87
110
  'name'=> extension.name
88
111
  }
@@ -1,3 +1,3 @@
1
1
  module Firebrew
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
@@ -1,12 +1,13 @@
1
1
  require 'spec_helper'
2
2
  require 'fileutils'
3
+ require 'digest/md5'
3
4
 
4
5
  module Firebrew::Firefox
5
6
  describe Firebrew::Firefox::Extension do
6
7
  let(:manager) do
7
8
  Extension::Manager.new(
8
9
  profile: Profile.new(
9
- path: './tmp'
10
+ path: File.join(Dir.pwd, 'tmp')
10
11
  )
11
12
  )
12
13
  end
@@ -16,18 +17,19 @@ module Firebrew::Firefox
16
17
  name: 'Japanese Language Pack',
17
18
  guid: 'langpack-ja@firefox.mozilla.org',
18
19
  version: '30.0',
19
- uri: './tmp/extensions/langpack-ja@firefox.mozilla.org.xpi'
20
+ uri: File.join(Dir.pwd, 'tmp/extensions/langpack-ja@firefox.mozilla.org.xpi')
20
21
  }, self.manager),
21
22
  Extension.new({
22
23
  name: 'Vimperator',
23
24
  guid: 'vimperator@mozdev.org',
24
25
  version: '3.8.2',
25
- uri: './tmp/extensions/vimperator@mozdev.org.xpi'
26
+ uri: File.join(Dir.pwd, 'tmp/extensions/vimperator@mozdev.org.xpi')
26
27
  }, self.manager)
27
28
  ]}
28
29
 
29
30
  before do
30
- FileUtils.cp('./spec/fixtures/firefox/extension/extensions.v16.json', './tmp/extensions.json')
31
+ json = File.read('./spec/fixtures/firefox/extension/extensions.v16.json')
32
+ File.write('./tmp/extensions.json', json % {profile_path: self.manager.profile.path})
31
33
  end
32
34
 
33
35
  describe :Manager do
@@ -92,21 +94,24 @@ module Firebrew::Firefox
92
94
  let(:extension) do
93
95
  Extension.new({
94
96
  guid: 'hoge@example.org',
95
- uri: './spec/fixtures/amo_api/search/base.xml'
97
+ uri: File.join(Dir.pwd, 'spec/fixtures/firefox/extension/unpack_false.xpi')
96
98
  }, self.manager)
97
99
  end
98
100
 
99
- it 'should copy the `path/to/profile/extensions/guid.xpi`' do
101
+ let(:expected_path) do
102
+ File.join(self.instance.profile.path, 'extensions/%s.xpi' % self.extension.guid)
103
+ end
104
+
105
+ it 'should copy the `path/to/profile/extensions/<GUID>.xpi`' do
100
106
  subject
101
- path = File.join(self.instance.profile.path, 'extensions/%s.xpi' % self.extension.guid)
102
- expect(File.exists? path).to be_truthy
107
+ expect(File.exists? self.expected_path).to be_truthy
103
108
  end
104
109
 
105
110
  it 'should add the `extension` extension' do
106
111
  subject
107
112
  all = self.instance.all
108
113
  extension = self.extension
109
- extension.uri = './tmp/extensions/hoge@example.org.xpi'
114
+ extension.uri = File.join(Dir.pwd, 'tmp/extensions/hoge@example.org.xpi')
110
115
  expect(all.size).to eq(3)
111
116
  expect(all[0]).to eq(self.extensions[0])
112
117
  expect(all[1]).to eq(self.extensions[1])
@@ -118,8 +123,8 @@ module Firebrew::Firefox
118
123
  Extension.new({
119
124
  guid: 'hoge@example.org',
120
125
  uri: [
121
- './spec/fixtures/amo_api/search/base.xml',
122
- './spec/fixtures/amo_api/search/not_exists.xml'
126
+ File.join(Dir.pwd, 'spec/fixtures/firefox/extension/unpack_false.xpi'),
127
+ File.join(Dir.pwd, 'spec/fixtures/firefox/extension/not_exists.xpi'),
123
128
  ]
124
129
  }, self.manager)
125
130
  end
@@ -128,19 +133,89 @@ module Firebrew::Firefox
128
133
  expect{subject}.to_not raise_error
129
134
  end
130
135
  end
136
+
137
+ context 'when an `em:unpack` value of the `install.rdf` in the XPI package not exsisted' do
138
+ let(:extension) do
139
+ Extension.new({
140
+ guid: 'hoge@example.org',
141
+ uri: File.join(Dir.pwd, 'spec/fixtures/firefox/extension/unpack_null.xpi')
142
+ }, self.manager)
143
+ end
144
+
145
+ it 'should copy the `path/to/profile/extensions/<GUID>.xpi`' do
146
+ subject
147
+ expect(File.exists? self.expected_path).to be_truthy
148
+ end
149
+
150
+ it 'should add the `extension` extension' do
151
+ subject
152
+ all = self.instance.all
153
+ extension = self.extension
154
+ extension.uri = File.join(Dir.pwd, 'tmp/extensions/hoge@example.org.xpi')
155
+ expect(all.size).to eq(3)
156
+ expect(all[0]).to eq(self.extensions[0])
157
+ expect(all[1]).to eq(self.extensions[1])
158
+ expect(all[2]).to eq(self.extension)
159
+ end
160
+ end
161
+
162
+ context 'when an `em:unpack` value of the `install.rdf` in the XPI package was true' do
163
+ let(:extension) do
164
+ Extension.new({
165
+ guid: 'hoge@example.org',
166
+ uri: './spec/fixtures/firefox/extension/unpack_true.xpi'
167
+ }, self.manager)
168
+ end
169
+
170
+ let(:expected_path) do
171
+ File.join(self.instance.profile.path, 'extensions/%s' % self.extension.guid)
172
+ end
173
+
174
+ it 'should copy the `path/to/profile/extensions/<GUID>`' do
175
+ subject
176
+ expect(File.exists? self.expected_path).to be_truthy
177
+ end
178
+
179
+ it 'should unzip all files in the XPI package' do
180
+ subject
181
+ md5list = File.read('./spec/fixtures/firefox/extension/unpack_true.md5')
182
+ Dir.chdir(self.expected_path) do
183
+ md5list.each_line do |item|
184
+ md5, path = item.split(/\s+/)
185
+ expect(Digest::MD5.hexdigest(File.read path)).to eq(md5)
186
+ end
187
+ end
188
+ end
189
+
190
+ it 'should add the `extension` extension' do
191
+ subject
192
+ all = self.instance.all
193
+ extension = self.extension
194
+ extension.uri = File.join(Dir.pwd, 'tmp/extensions/hoge@example.org')
195
+ expect(all.size).to eq(3)
196
+ expect(all[0]).to eq(self.extensions[0])
197
+ expect(all[1]).to eq(self.extensions[1])
198
+ expect(all[2]).to eq(self.extension)
199
+ end
200
+ end
131
201
  end
132
202
 
133
203
  describe '#uninstall(extension)' do
134
204
  let(:extension) do
135
205
  Extension.new({
136
206
  guid: 'hoge@example.org',
137
- uri: './tmp/extensions/hoge@example.org.xpi'
207
+ uri: File.join(Dir.pwd, 'tmp/extensions/hoge@example.org.xpi')
138
208
  }, self.manager)
139
209
  end
140
210
 
141
- before do
142
- FileUtils.cp('./spec/fixtures/firefox/extension/extensions_added_hoge.v16.json', './tmp/extensions.json')
211
+ let(:create_xpi_block){->{
143
212
  File.write self.extension.uri, ''
213
+ }}
214
+
215
+ before do
216
+ json = File.read('./spec/fixtures/firefox/extension/extensions_added_hoge.v16.json')
217
+ File.write('./tmp/extensions.json', json % {profile_path: self.manager.profile.path})
218
+ self.create_xpi_block[]
144
219
  self.manager.uninstall(self.extension)
145
220
  end
146
221
 
@@ -154,6 +229,30 @@ module Firebrew::Firefox
154
229
  expect(all[0]).to eq(self.extensions[0])
155
230
  expect(all[1]).to eq(self.extensions[1])
156
231
  end
232
+
233
+ context 'when `em:unpack` value of the `install.rdf` in the `extension` was true' do
234
+ let(:extension) do
235
+ Extension.new({
236
+ guid: 'hoge@example.org',
237
+ uri: File.join(Dir.pwd, 'tmp/extensions/hoge@example.org')
238
+ }, self.manager)
239
+ end
240
+
241
+ let(:create_xpi_block){->{
242
+ FileUtils.mkdir_p self.extension.uri
243
+ }}
244
+
245
+ it 'should remove the `extension` file' do
246
+ expect(File.exists? self.extension.uri).to be_falsey
247
+ end
248
+
249
+ it 'should remove the `extension` extension' do
250
+ all = self.instance.all
251
+ expect(all.size).to eq(2)
252
+ expect(all[0]).to eq(self.extensions[0])
253
+ expect(all[1]).to eq(self.extensions[1])
254
+ end
255
+ end
157
256
  end
158
257
  end
159
258
 
@@ -147,7 +147,7 @@
147
147
  "active": true,
148
148
  "userDisabled": false,
149
149
  "appDisabled": false,
150
- "descriptor": "/Users/yuichi/Library/Application Support/Firefox/Profiles/k9l2swsk.default/extensions/langpack-ja@firefox.mozilla.org.xpi",
150
+ "descriptor": "%{profile_path}/extensions/langpack-ja@firefox.mozilla.org.xpi",
151
151
  "installDate": 1404466078000,
152
152
  "updateDate": 1404626257000,
153
153
  "applyBackgroundUpdates": 1,
@@ -197,7 +197,7 @@
197
197
  "active": true,
198
198
  "userDisabled": false,
199
199
  "appDisabled": false,
200
- "descriptor": "/Users/yuichi/Library/Application Support/Firefox/Profiles/k9l2swsk.default/extensions/vimperator@mozdev.org.xpi",
200
+ "descriptor": "%{profile_path}/extensions/vimperator@mozdev.org.xpi",
201
201
  "installDate": 1404474084000,
202
202
  "updateDate": 1404617815000,
203
203
  "applyBackgroundUpdates": 1,
@@ -147,7 +147,7 @@
147
147
  "active": true,
148
148
  "userDisabled": false,
149
149
  "appDisabled": false,
150
- "descriptor": "/Users/yuichi/Library/Application Support/Firefox/Profiles/k9l2swsk.default/extensions/langpack-ja@firefox.mozilla.org.xpi",
150
+ "descriptor": "%{profile_path}/extensions/langpack-ja@firefox.mozilla.org.xpi",
151
151
  "installDate": 1404466078000,
152
152
  "updateDate": 1404626257000,
153
153
  "applyBackgroundUpdates": 1,
@@ -197,7 +197,7 @@
197
197
  "active": true,
198
198
  "userDisabled": false,
199
199
  "appDisabled": false,
200
- "descriptor": "/Users/yuichi/Library/Application Support/Firefox/Profiles/k9l2swsk.default/extensions/vimperator@mozdev.org.xpi",
200
+ "descriptor": "%{profile_path}/extensions/vimperator@mozdev.org.xpi",
201
201
  "installDate": 1404474084000,
202
202
  "updateDate": 1404617815000,
203
203
  "applyBackgroundUpdates": 1,
@@ -226,6 +226,7 @@
226
226
  {
227
227
  "id": "hoge@example.org",
228
228
  "location": "app-profile",
229
+ "descriptor": "%{profile_path}/extensions/hoge@example.org.xpi",
229
230
  "version": null,
230
231
  "defaultLocale": {
231
232
  "name": null
@@ -0,0 +1,3 @@
1
+ 412a970e86db9c913b721a7a3c025d7f ./dir1/file2.txt
2
+ 984cd269de9bc8c6de7deb3c8fc7c393 ./file1.txt
3
+ f2354fba2476948c88385a564086b350 ./install.rdf
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: firebrew
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuichi Murata
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-15 00:00:00.000000000 Z
11
+ date: 2014-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '2.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubyzip
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.1'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.1'
111
125
  description: Firefox add-ons manager for CUI.
112
126
  email:
113
127
  - mrk21info+rubygems@gmail.com
@@ -151,6 +165,10 @@ files:
151
165
  - spec/fixtures/amo_api/search/single.xml
152
166
  - spec/fixtures/firefox/extension/extensions.v16.json
153
167
  - spec/fixtures/firefox/extension/extensions_added_hoge.v16.json
168
+ - spec/fixtures/firefox/extension/unpack_false.xpi
169
+ - spec/fixtures/firefox/extension/unpack_null.xpi
170
+ - spec/fixtures/firefox/extension/unpack_true.md5
171
+ - spec/fixtures/firefox/extension/unpack_true.xpi
154
172
  - spec/fixtures/firefox/profile/base.ini
155
173
  - spec/fixtures/firefox/profile/empty.ini
156
174
  - spec/spec_helper.rb
@@ -194,6 +212,10 @@ test_files:
194
212
  - spec/fixtures/amo_api/search/single.xml
195
213
  - spec/fixtures/firefox/extension/extensions.v16.json
196
214
  - spec/fixtures/firefox/extension/extensions_added_hoge.v16.json
215
+ - spec/fixtures/firefox/extension/unpack_false.xpi
216
+ - spec/fixtures/firefox/extension/unpack_null.xpi
217
+ - spec/fixtures/firefox/extension/unpack_true.md5
218
+ - spec/fixtures/firefox/extension/unpack_true.xpi
197
219
  - spec/fixtures/firefox/profile/base.ini
198
220
  - spec/fixtures/firefox/profile/empty.ini
199
221
  - spec/spec_helper.rb