blast_off 0.2.0 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1202d1d5e2f9986fe696bf9d5380561292d91e45
4
- data.tar.gz: 35baf8634c4c525a5e37220a8a5f85f5dd6beb5d
3
+ metadata.gz: 5a6e9251f16129eb15def3ec26795df792984bec
4
+ data.tar.gz: 188ebf9f63c74820302fdfeed8aa6ee678ea559f
5
5
  SHA512:
6
- metadata.gz: f63439b3cde6a62bb732e5c170efa7df41db779086f2031232ccb0a554e1d8eeb1c8cc23105b021753403acc483bc522364e03f7d8c10a6c9321cf6859edb9b8
7
- data.tar.gz: 041bff9493d50b1bdbc72abecd012042e1442f7fb7bb269b23346bbd2c229850e44f4e9b87850faa3ab0a4e1e52e07537e52040eedbb9d9d135f918e03567546
6
+ metadata.gz: 063fef30610b2bb1ec3002a57cd122a3a3da1fd3c75bd81669c5e3a4558642ab90c05f7da5120d4855a37aef7043f37b80d7e11a1259dfc2fb979817eb3b4772
7
+ data.tar.gz: 1f58707ce398a963e7d41217a0ff24b66f0d9a200d0d88d0e664d9cfd155e1456c24682bf3787cb5c7081a3c06f13d6e6e2293c10031bad09b0117f363500efa
@@ -2,6 +2,11 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## [v0.3.0](https://github.com/linjunpop/blast_off/tree/v0.3.0)
6
+
7
+ * Set correct file mime-types.
8
+ * Also include App short version on web page.
9
+
5
10
  ## [v0.2.0](https://github.com/linjunpop/blast_off/tree/v0.2.0)
6
11
 
7
12
  * Let services' `generate` method return URL address.
data/README.md CHANGED
@@ -69,6 +69,10 @@ Example:
69
69
 
70
70
  ## [Changelog](CHANGELOG.md)
71
71
 
72
+ ## Similar projects:
73
+
74
+ * https://github.com/lexrus/ios-makefile
75
+
72
76
  ## Contributing
73
77
 
74
78
  1. Fork it
@@ -21,9 +21,11 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "rspec", '~> 2.14'
24
+ spec.add_development_dependency "nokogiri", '~> 1.6'
24
25
 
25
26
  spec.add_runtime_dependency 'gli','~> 2.8.1'
26
27
  spec.add_runtime_dependency 'qiniu-rs', '~> 3.4.6'
27
28
  spec.add_runtime_dependency 'rainbow', '~> 1.1.4'
28
29
  spec.add_runtime_dependency 'ipa_reader', '~> 0.7.1'
30
+ spec.add_runtime_dependency 'CFPropertyList'
29
31
  end
@@ -2,6 +2,7 @@ require 'ipa_reader'
2
2
 
3
3
  require "blast_off/version"
4
4
  require "blast_off/services"
5
+ require "blast_off/template"
5
6
 
6
7
  module BlastOff
7
8
  end
@@ -9,37 +9,32 @@ module BlastOff
9
9
  def initialize(ipa_file_path:nil, access_key:'', secret_key:'', bucket:'')
10
10
  @ipa_file_path = ipa_file_path
11
11
  @ipa_file = ::IpaReader::IpaFile.new(ipa_file_path)
12
- @qiniu_bucket = bucket
12
+ @bucket = bucket
13
13
 
14
14
  ::Qiniu::RS.establish_connection!(
15
15
  enable_debug: false,
16
16
  access_key: access_key,
17
17
  secret_key: secret_key
18
18
  )
19
+ @upload_token = ::Qiniu::RS.generate_upload_token(scope: @bucket)
19
20
  end
20
21
 
21
22
  def distribute
22
- manifest_file = Tempfile.new('manifest')
23
- begin
24
- manifest_file.write(manifest_template)
25
- manifest_file.rewind
26
- upload(manifest_file.path, 'manifest.plist')
27
- ensure
28
- manifest_file.close
29
- manifest_file.unlink
30
- end
31
-
32
- html_file = Tempfile.new('html')
33
- begin
34
- html_file.write(html_template)
35
- html_file.rewind
36
- upload(html_file.path, 'index.html')
37
- ensure
38
- html_file.close
39
- html_file.unlink
40
- end
41
-
42
- upload(@ipa_file_path, "#{@ipa_file.name}.ipa")
23
+ upload_string(
24
+ template.manifest_plist("#{base_url}/#{@ipa_file.name}.ipa"),
25
+ 'manifest.plist',
26
+ 'application/octet-stream'
27
+ )
28
+ upload_string(
29
+ template.html("#{base_url}/manifest.plist"),
30
+ 'index.html',
31
+ 'text/html'
32
+ )
33
+ upload_file(
34
+ @ipa_file_path,
35
+ "#{@ipa_file.name}.ipa",
36
+ 'application/octet-stream'
37
+ )
43
38
 
44
39
  "#{base_url}/index.html"
45
40
  end
@@ -51,48 +46,34 @@ module BlastOff
51
46
  end
52
47
 
53
48
  def base_url
54
- "http://#{@qiniu_bucket}.qiniudn.com/#{base_path}"
49
+ "http://#{@bucket}.qiniudn.com/#{base_path}"
55
50
  end
56
51
 
57
- def upload(file, key)
58
- upload_token = ::Qiniu::RS.generate_upload_token scope: @qiniu_bucket
59
-
60
- ::Qiniu::RS.upload_file uptoken: upload_token,
61
- file: file,
62
- bucket: @qiniu_bucket,
63
- key: "#{base_path}/#{key}"
52
+ def upload_string(string, key, mime_type)
53
+ file = Tempfile.new(key)
54
+ begin
55
+ file.write(string)
56
+ file.rewind
57
+ upload_file(file.path, key, mime_type)
58
+ ensure
59
+ file.close
60
+ file.unlink
61
+ end
64
62
  end
65
63
 
66
- def manifest_template
67
- {
68
- items: [
69
- assets: [
70
- {
71
- kind: 'software-package',
72
- url: "#{base_url}/#{@ipa_file.name}.ipa"
73
- }
74
- ],
75
- metadata: {
76
- 'bundle-identifier' => @ipa_file.bundle_identifier,
77
- 'bundle-version' => @ipa_file.version,
78
- kind: 'software',
79
- title: @ipa_file.name
80
- }
81
- ]
82
- }.to_plist
64
+ def upload_file(filepath, key, mime_type)
65
+ ::Qiniu::RS.upload_file(
66
+ uptoken: @upload_token,
67
+ file: filepath,
68
+ mime_type: mime_type,
69
+ bucket: @bucket,
70
+ key: "#{base_path}/#{key}"
71
+ )
83
72
  end
84
73
 
85
- def html_template
86
- opts = OpenStruct.new({
87
- app_name: @ipa_file.name,
88
- app_version: @ipa_file.version,
89
- base_url: base_url
90
- })
91
- template_file = File.join(File.dirname(File.expand_path(__FILE__)), '../template/index.html.erb')
92
-
93
- ::ERB.new(File.read(template_file)).result(opts.instance_eval {binding})
74
+ def template
75
+ @template ||= Template.new(@ipa_file)
94
76
  end
95
-
96
77
  end
97
78
  end
98
79
  end
@@ -0,0 +1,41 @@
1
+ require 'cfpropertylist'
2
+ require 'uri'
3
+
4
+ module BlastOff
5
+ class Template
6
+ def initialize(ipa_file)
7
+ @ipa = ipa_file
8
+ end
9
+
10
+ def manifest_plist(ipa_file_url)
11
+ {
12
+ items: [
13
+ assets: [
14
+ {
15
+ kind: 'software-package',
16
+ url: ipa_file_url
17
+ }
18
+ ],
19
+ metadata: {
20
+ 'bundle-identifier' => @ipa.bundle_identifier,
21
+ 'bundle-version' => @ipa.version,
22
+ kind: 'software',
23
+ title: @ipa.name
24
+ }
25
+ ]
26
+ }.to_plist(plist_format: CFPropertyList::List::FORMAT_XML)
27
+ end
28
+
29
+ def html(manifest_plist_url)
30
+ opts = OpenStruct.new({
31
+ ipa: @ipa,
32
+ install_url: URI.escape(
33
+ "itms-services://?action=download-manifest&url=#{manifest_plist_url}"
34
+ )
35
+ })
36
+ template_file = File.join(File.dirname(File.expand_path(__FILE__)), 'template/index.html.erb')
37
+
38
+ ::ERB.new(File.read(template_file)).result(opts.instance_eval {binding})
39
+ end
40
+ end
41
+ end
@@ -33,18 +33,24 @@
33
33
  }
34
34
  </style>
35
35
 
36
- <title><%= app_name %></title>
36
+ <title><%= ipa.name %> | <%= ipa.short_version %> (<%= ipa.version %>)</title>
37
37
  </head>
38
38
 
39
39
  <body>
40
40
  <div class="container">
41
- <h1><%= app_name %></h1>
42
- <img src="http://api.qrserver.com/v1/create-qr-code/?size=250x250&data=<%= base_url %>/index.html" alt="" />
43
- <h2>Version: <%= app_version %></h2>
41
+ <h1><%= ipa.name %></h1>
42
+ <div class="qr-image"></div>
43
+ <h2>Version: <%= ipa.short_version %> (<%= ipa.version %>)</h2>
44
44
  <p>
45
- <a class="button" href="itms-services://?action=download-manifest&url=<%= base_url %>/manifest.plist">Install</a>
45
+ <a class="button" href="<%= install_url %>">Install</a>
46
46
  </p>
47
47
  </div>
48
+ <script type="text/javascript" charset="utf-8">
49
+ var qrImageUrl = "http://api.qrserver.com/v1/create-qr-code/?size=250x250&data=" + document.URL;
50
+ var qrImageNode = document.createElement("img");
51
+ qrImageNode.src = qrImageUrl;
52
+ document.querySelector('.qr-image').appendChild(qrImageNode);
53
+ </script>
48
54
  </body>
49
55
  </html>
50
56
 
@@ -1,3 +1,3 @@
1
1
  module BlastOff
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+ require 'nokogiri'
3
+
4
+ describe BlastOff::Template do
5
+ let(:ipa) {
6
+ double(
7
+ 'IPA',
8
+ name: 'Foobar',
9
+ bundle_identifier: 'com.example.Foobar',
10
+ version: '2013',
11
+ short_version: '1.0.0'
12
+ )
13
+ }
14
+ let(:template) {
15
+ BlastOff::Template.new(ipa)
16
+ }
17
+
18
+ describe '#html' do
19
+ let(:doc) {
20
+ Nokogiri::HTML(template.html('http://example.com/manifest.plist'))
21
+ }
22
+ let(:expected_install_url) {
23
+ "itms-services://?action=download-manifest&url=http://example.com/manifest.plist"
24
+ }
25
+
26
+ it 'generate correct install button' do
27
+ doc.at_css('.button')['href'].should eq expected_install_url
28
+ end
29
+
30
+ it 'generate correct version' do
31
+ doc.at_css('h2').text.should eq 'Version: 1.0.0 (2013)'
32
+ end
33
+
34
+ it 'generate correct title' do
35
+ doc.at_css('h1').text.should eq 'Foobar'
36
+ end
37
+ end
38
+
39
+ describe '#manifest_plist' do
40
+ let(:doc) {
41
+ Nokogiri::XML(template.manifest_plist('http://example.com/Foobar.ipa'))
42
+ }
43
+
44
+ it 'generate correct bundle-identifier' do
45
+ element = doc.
46
+ at_xpath('//key[contains(text(),"bundle-identifier")]').
47
+ next_element
48
+ element.text.should eq 'com.example.Foobar'
49
+ end
50
+
51
+ it 'generate correct url' do
52
+ element = doc.
53
+ at_xpath('//key[contains(text(),"url")]').
54
+ next_element
55
+ element.text.should eq 'http://example.com/Foobar.ipa'
56
+ end
57
+
58
+ it 'generate correct bundle-version' do
59
+ element = doc.
60
+ at_xpath('//key[contains(text(),"bundle-version")]').
61
+ next_element
62
+ element.text.should eq '2013'
63
+ end
64
+
65
+ it 'generate correct title' do
66
+ element = doc.
67
+ at_xpath('//key[contains(text(),"title")]').
68
+ next_element
69
+ element.text.should eq 'Foobar'
70
+ end
71
+ end
72
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blast_off
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jun Lin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-13 00:00:00.000000000 Z
11
+ date: 2013-11-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: '2.14'
55
+ - !ruby/object:Gem::Dependency
56
+ name: nokogiri
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.6'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '1.6'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: gli
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +122,20 @@ dependencies:
108
122
  - - ~>
109
123
  - !ruby/object:Gem::Version
110
124
  version: 0.7.1
125
+ - !ruby/object:Gem::Dependency
126
+ name: CFPropertyList
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
111
139
  description: An iOS beta distribution tool.
112
140
  email:
113
141
  - linjunpop@gmail.com
@@ -129,9 +157,11 @@ files:
129
157
  - lib/blast_off.rb
130
158
  - lib/blast_off/services.rb
131
159
  - lib/blast_off/services/qiniu.rb
160
+ - lib/blast_off/template.rb
132
161
  - lib/blast_off/template/index.html.erb
133
162
  - lib/blast_off/version.rb
134
163
  - spec/blast_off/services/qiniu_spec.rb
164
+ - spec/blast_off/template_spec.rb
135
165
  - spec/spec_helper.rb
136
166
  homepage: https://github.com/linjunpop/blast_off
137
167
  licenses:
@@ -159,5 +189,6 @@ specification_version: 4
159
189
  summary: An iOS beta distribution tool.
160
190
  test_files:
161
191
  - spec/blast_off/services/qiniu_spec.rb
192
+ - spec/blast_off/template_spec.rb
162
193
  - spec/spec_helper.rb
163
194
  has_rdoc: