sparkle_appcast 0.1.0 → 0.1.1

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
  SHA256:
3
- metadata.gz: 1371a567e13d8c53f4625dc93c5a85a05121fcc8229f7d715abada093726da47
4
- data.tar.gz: d6d952e901c2abe3fa1f1035b3ff900c68f963d0804475da26e3db6405889dd3
3
+ metadata.gz: d53602018aca02ede32180faa6f1793ce88007cfe917f0b49dd8ff7569dbad34
4
+ data.tar.gz: 1cf9b9ac1d6674d4db17ab007da8e3ae9dd37e5ed7bd2d3f13db197358827c37
5
5
  SHA512:
6
- metadata.gz: 67a6eaed29a811a75075f3b47b61667d6e0fcd484641524a4b10dfc471310b6fb6ccf9d614c1ca28202bd0d4b29584342c11f01997c6219d114a8822470fec43
7
- data.tar.gz: fb6649d00d9bd4be1fe454a9471781fb11afc81b31e6bf98b85f02186e997cabae86ed258a29cae8438d79932dc35ebf336dd4fe5dca67ad111ca18da0525895
6
+ metadata.gz: 6c06b95f733b14eca7e27b2d7833946758b35c6a83dc3a8200eb062c0b2844d412582b5a86aabe985d3233376348439837a5d6d33e4d947e8ba98d813437b094
7
+ data.tar.gz: ab6beee04561fc1b42490b7e1b825fcdb3ff0dfe8ae8c4649126761717dbda0d49b9379e61d25026580e421960443547bbab22c5787ad73be9e6e24ddc511041
data/README.md CHANGED
@@ -65,7 +65,7 @@ The application archive file must contain exact one application bundle.
65
65
  Default to `"The most recent changes."`.
66
66
 
67
67
  ### `sign [OPTIONS...] [FILE_PATH]`
68
-
68
+
69
69
  Sign data at `FILE_PATH` or reading from the standard input with `DSA_PRIVATE_KEY_PATH`
70
70
  and print signature that can be used in `appcast.xml`.
71
71
  Use this for testing private key.
@@ -89,7 +89,7 @@ Use Ruby Gems to install `sparkle_appcast`.
89
89
 
90
90
  Or use [bundler](http://bundler.io/), add next line to `Gemfile` in your project.
91
91
 
92
- gem "sprkle_appcast"
92
+ gem "sparkle_appcast"
93
93
 
94
94
 
95
95
  SEE ALSO
@@ -18,21 +18,21 @@ module SparkleAppcast
18
18
 
19
19
  def rss_params
20
20
  {
21
- channel_link: archive.feed_url,
21
+ channel_link: archive.bundle_info[:feed_url],
22
22
  title: title,
23
23
  description: release_note.html,
24
24
  publish_date: archive.created_at,
25
25
  url: url,
26
26
  length: archive.size,
27
- version: archive.bundle_version,
28
- short_version_string: archive.bundle_short_version_string,
29
- minimum_system_version: archive.minimum_system_version,
27
+ version: archive.bundle_info[:bundle_version],
28
+ short_version_string: archive.bundle_info[:bundle_short_version_string],
29
+ minimum_system_version: archive.bundle_info[:minimum_system_version],
30
30
  dsa_signature: dsa_signature
31
31
  }.merge(params)
32
32
  end
33
33
 
34
34
  def title
35
- "#{archive.bundle_name} #{archive.bundle_short_version_string} (#{archive.bundle_version})"
35
+ "#{archive.bundle_info[:bundle_name]} #{archive.bundle_info[:bundle_short_version_string]} (#{archive.bundle_info[:bundle_version]})"
36
36
  end
37
37
 
38
38
  def dsa_signature
@@ -1,5 +1,4 @@
1
1
  require "tmpdir"
2
- require "plist"
3
2
 
4
3
  module SparkleAppcast
5
4
  class Archive
@@ -9,26 +8,6 @@ module SparkleAppcast
9
8
  @path = File.expand_path(path)
10
9
  end
11
10
 
12
- def bundle_name
13
- info_plist["CFBundleDisplayName"] || info_plist["CFBundleName"]
14
- end
15
-
16
- def bundle_version
17
- info_plist["CFBundleVersion"]
18
- end
19
-
20
- def bundle_short_version_string
21
- info_plist["CFBundleShortVersionString"]
22
- end
23
-
24
- def minimum_system_version
25
- info_plist["LSMinimumSystemVersion"]
26
- end
27
-
28
- def feed_url
29
- info_plist["SUFeedURL"]
30
- end
31
-
32
11
  def created_at
33
12
  File.birthtime(path)
34
13
  end
@@ -41,28 +20,9 @@ module SparkleAppcast
41
20
  File.binread(path)
42
21
  end
43
22
 
44
- private
45
-
46
- # TODO: Support localizable string.
47
-
48
- def info_plist
49
- @info_plist ||= Dir.mktmpdir do |tmpdir_path|
50
- case File.basename(path)
51
- when /\.zip\z/i
52
- Kernel.system("/usr/bin/ditto", "-x", "-k", path, tmpdir_path)
53
- when /\.tar\z/i
54
- Kernel.system("/usr/bin/tar", "-x", "-f", path, "-C", tmpdir_path)
55
- when /\.tar\.gz\z/i, /\.tgz\z/i, /\.tar\.xz\z/i, /\.txz\z/i, /\.tar\.lzma\z/i
56
- Kernel.system("/usr/bin/tar", "-x", "-z", "-f", path, "-C", tmpdir_path)
57
- when /\.tar\.bz2\z/i, /\.tbz\z/i
58
- Kernel.system("/usr/bin/tar", "-x", "-j", "-f", path, "-C", tmpdir_path)
59
- else
60
- raise NotImplementedError.new("Disk image support is not implemented yet.")
61
- end
62
-
63
- unless $?.success?
64
- raise RuntimeError.new("Failed to expand archive: #{path}")
65
- end
23
+ def bundle_info
24
+ @bundle_info ||= Dir.mktmpdir do |tmpdir_path|
25
+ unarchive!(tmpdir_path)
66
26
 
67
27
  app_paths = Dir.glob(File.join(tmpdir_path, "*.app"), File::FNM_CASEFOLD)
68
28
  if app_paths.size == 0
@@ -71,10 +31,30 @@ module SparkleAppcast
71
31
  raise RuntimeError.new("Found multiple application bundles: #{app_paths.map{|path| File.basename(path)}}")
72
32
  else
73
33
  app_path = app_paths.first
74
- info_plist_path = File.join(app_path, "Contents", "Info.plist")
75
- Plist.parse_xml(info_plist_path)
34
+ Bundle.new(app_path).info
76
35
  end
77
36
  end
78
37
  end
38
+
39
+ private
40
+
41
+ def unarchive!(destination_path)
42
+ case File.basename(path)
43
+ when /\.zip\z/i
44
+ Kernel.system("/usr/bin/ditto", "-x", "-k", path, destination_path)
45
+ when /\.tar\z/i
46
+ Kernel.system("/usr/bin/tar", "-x", "-f", path, "-C", destination_path)
47
+ when /\.tar\.gz\z/i, /\.tgz\z/i, /\.tar\.xz\z/i, /\.txz\z/i, /\.tar\.lzma\z/i
48
+ Kernel.system("/usr/bin/tar", "-x", "-z", "-f", path, "-C", destination_path)
49
+ when /\.tar\.bz2\z/i, /\.tbz\z/i
50
+ Kernel.system("/usr/bin/tar", "-x", "-j", "-f", path, "-C", destination_path)
51
+ else
52
+ raise NotImplementedError.new("Disk image support is not implemented yet.")
53
+ end
54
+
55
+ unless $?.success?
56
+ raise RuntimeError.new("Failed to expand archive: #{path}")
57
+ end
58
+ end
79
59
  end
80
60
  end
@@ -0,0 +1,58 @@
1
+ require "plist"
2
+
3
+ module SparkleAppcast
4
+ class Bundle
5
+ INFO_KEYS = [
6
+ :bundle_name,
7
+ :bundle_version,
8
+ :bundle_short_version_string,
9
+ :minimum_system_version,
10
+ :feed_url
11
+ ]
12
+
13
+ attr_reader :path
14
+
15
+ def initialize(path)
16
+ @path = File.expand_path(path)
17
+ end
18
+
19
+ def [](key)
20
+ info[key]
21
+ end
22
+
23
+ def info
24
+ @info ||= INFO_KEYS.inject({}) do |info, key|
25
+ info[key] = self.send(key)
26
+ info
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ # TODO: Support localizable string.
33
+
34
+ def bundle_name
35
+ info_plist["CFBundleDisplayName"] || info_plist["CFBundleName"]
36
+ end
37
+
38
+ def bundle_version
39
+ info_plist["CFBundleVersion"]
40
+ end
41
+
42
+ def bundle_short_version_string
43
+ info_plist["CFBundleShortVersionString"]
44
+ end
45
+
46
+ def minimum_system_version
47
+ info_plist["LSMinimumSystemVersion"]
48
+ end
49
+
50
+ def feed_url
51
+ info_plist["SUFeedURL"]
52
+ end
53
+
54
+ def info_plist
55
+ @info_plist ||= Plist.parse_xml(File.join(path, "Contents", "Info.plist"))
56
+ end
57
+ end
58
+ end
@@ -48,6 +48,49 @@ module SparkleAppcast
48
48
  end
49
49
  end
50
50
 
51
+ desc "info FILE", "Print info about the application bundle."
52
+ Bundle::INFO_KEYS.each do |key|
53
+ option key, type: :boolean, desc: "Print #{key}."
54
+ end
55
+ def info(file)
56
+ bundle_info = if File.file?(file)
57
+ Archive.new(file).bundle_info
58
+ else
59
+ Bundle.new(file).info
60
+ end
61
+
62
+ include_keys = []
63
+ exclude_keys = []
64
+ Bundle::INFO_KEYS.each do |key|
65
+ case options[key]
66
+ when nil
67
+ when true
68
+ include_keys << key
69
+ when false
70
+ exclude_keys << key
71
+ end
72
+ end
73
+
74
+ keys = if include_keys.empty?
75
+ Bundle::INFO_KEYS
76
+ else
77
+ include_keys
78
+ end
79
+ keys = keys - exclude_keys
80
+
81
+ if keys.count > 1
82
+ info = {}
83
+ keys.each do |key|
84
+ info[key] = bundle_info[key]
85
+ end
86
+ puts info.map{|key, value| "#{key} #{value}"}.join("\n")
87
+ else
88
+ keys.each do |key|
89
+ puts bundle_info[key]
90
+ end
91
+ end
92
+ end
93
+
51
94
  desc "sign [FILE]", "Sign a file with a DSA private key."
52
95
  option :key, type: :string, required: true, desc: "Path to a DSA private key."
53
96
  def sign(file = nil)
@@ -1,6 +1,7 @@
1
1
  module SparkleAppcast
2
2
  autoload :Appcast, "sparkle_appcast/appcast"
3
3
  autoload :Archive, "sparkle_appcast/archive"
4
+ autoload :Bundle, "sparkle_appcast/bundle"
4
5
  autoload :Cli, "sparkle_appcast/cli"
5
6
  autoload :ReleaseNote, "sparkle_appcast/release_note"
6
7
  autoload :Rss, "sparkle_appcast/rss"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sparkle_appcast
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yoshimasa Niwa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-10 00:00:00.000000000 Z
11
+ date: 2018-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -96,13 +96,16 @@ files:
96
96
  - lib/sparkle_appcast.rb
97
97
  - lib/sparkle_appcast/appcast.rb
98
98
  - lib/sparkle_appcast/archive.rb
99
+ - lib/sparkle_appcast/bundle.rb
99
100
  - lib/sparkle_appcast/cli.rb
100
101
  - lib/sparkle_appcast/release_note.rb
101
102
  - lib/sparkle_appcast/rss.rb
102
103
  - lib/sparkle_appcast/signer.rb
103
- homepage:
104
- licenses: []
105
- metadata: {}
104
+ homepage: https://github.com/niw/sparkle_appcast
105
+ licenses:
106
+ - MIT
107
+ metadata:
108
+ source_code_uri: https://github.com/niw/sparkle_appcast
106
109
  post_install_message:
107
110
  rdoc_options: []
108
111
  require_paths: