choctop 0.9.2 → 0.9.3
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.
- data/History.txt +7 -0
- data/Manifest.txt +2 -0
- data/Rakefile +2 -1
- data/app_generators/install_choctop/install_choctop_generator.rb +3 -1
- data/app_generators/install_choctop/templates/ReleaseNotes.txt.erb +5 -0
- data/app_generators/install_choctop/templates/release_notes_template.html.erb +13 -0
- data/features/initial_generator.feature +10 -4
- data/features/rake_tasks.feature +2 -2
- data/features/sparkle_feed.feature +17 -3
- data/features/steps/common.rb +6 -0
- data/features/steps/env.rb +1 -0
- data/features/steps/generator.rb +1 -1
- data/lib/choctop.rb +22 -7
- data/lib/choctop/appcast.rb +57 -28
- metadata +13 -1
data/History.txt
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
== 0.9.3 2009-01-29
|
2
|
+
|
3
|
+
* install_choctop generates a ReleaseNotes.txt file
|
4
|
+
* 'rake feed' converts ReleaseNotes.txt into release_notes.html file for upload
|
5
|
+
* #name is the project's folder name if info_plist['CFBundleExecutable'] == "${EXECUTABLE}"
|
6
|
+
* builder of xml feed flushes immediately now so no more 0 length xml feeds
|
7
|
+
|
1
8
|
== 0.9.2 2009-01-29
|
2
9
|
|
3
10
|
* fixed instances of "SUFeedURLKey" to "SUFeedURL" due to f@#$-up error message in Sparkle code that led me astray
|
data/Manifest.txt
CHANGED
@@ -4,6 +4,8 @@ README.rdoc
|
|
4
4
|
Rakefile
|
5
5
|
app_generators/install_choctop/install_choctop_generator.rb
|
6
6
|
app_generators/install_choctop/templates/Rakefile.erb
|
7
|
+
app_generators/install_choctop/templates/ReleaseNotes.txt.erb
|
8
|
+
app_generators/install_choctop/templates/release_notes_template.html.erb
|
7
9
|
assets/DefaultVolumeIcon.icns
|
8
10
|
assets/sky.jpg
|
9
11
|
assets/sky_background.jpg
|
data/Rakefile
CHANGED
@@ -9,7 +9,8 @@ $hoe = Hoe.new('choctop', ChocTop::VERSION) do |p|
|
|
9
9
|
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
10
10
|
p.extra_deps = [
|
11
11
|
['activesupport'],
|
12
|
-
['builder','>= 2.1.2']
|
12
|
+
['builder','>= 2.1.2'],
|
13
|
+
['RedCloth', '>=4.1.1']
|
13
14
|
]
|
14
15
|
p.extra_dev_deps = [
|
15
16
|
['newgem', ">= #{::Newgem::VERSION}"]
|
@@ -17,7 +17,9 @@ class InstallChoctopGenerator < RubiGen::Base
|
|
17
17
|
record do |m|
|
18
18
|
%w( appcast/build ).each { |path| m.directory path }
|
19
19
|
|
20
|
-
m.template "Rakefile.erb", "Rakefile"
|
20
|
+
m.template "Rakefile.erb", "Rakefile"
|
21
|
+
m.template "ReleaseNotes.txt.erb", "ReleaseNotes.txt"
|
22
|
+
m.file "release_notes_template.html.erb", "release_notes_template.html.erb"
|
21
23
|
end
|
22
24
|
end
|
23
25
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>Release Notes</title>
|
4
|
+
<style>
|
5
|
+
* { font-family: serif;}
|
6
|
+
h1 { font-family: sans-serif; background-color: #ABABFF; padding: 10px;}
|
7
|
+
h1 span { font-size: 75%; font-weight: normal; float: right;}
|
8
|
+
</style>
|
9
|
+
</head>
|
10
|
+
<body>
|
11
|
+
<%= release_notes_html %>
|
12
|
+
</body>
|
13
|
+
</html>
|
@@ -1,9 +1,9 @@
|
|
1
|
-
Feature: Setup a Cocoa app with
|
1
|
+
Feature: Setup a Cocoa app with choctop
|
2
2
|
In order to reduce cost of using Sparkle to generate appcasts
|
3
3
|
As a Cocoa developer or Cocoa application deployer
|
4
4
|
I want a generator to install rake tasks that make using Sparkle easy-peasy
|
5
5
|
|
6
|
-
Scenario: Install
|
6
|
+
Scenario: Install choctop into an app that has no existing Rakefile
|
7
7
|
Given a Cocoa app that does not have an existing Rakefile
|
8
8
|
When I run local executable 'install_choctop' with arguments '.'
|
9
9
|
And Rakefile wired to use development code instead of installed RubyGem
|
@@ -11,7 +11,7 @@ Feature: Setup a Cocoa app with sparkle-ruby
|
|
11
11
|
And output does match /rake build/
|
12
12
|
And output does match /rake upload/
|
13
13
|
|
14
|
-
Scenario: Install
|
14
|
+
Scenario: Install choctop into an app that has an existing Rakefile
|
15
15
|
Given a Cocoa app that does have an existing Rakefile
|
16
16
|
When I run local executable 'install_choctop' with arguments '.'
|
17
17
|
And Rakefile wired to use development code instead of installed RubyGem
|
@@ -23,4 +23,10 @@ Feature: Setup a Cocoa app with sparkle-ruby
|
|
23
23
|
Given a Cocoa app that does not have an existing Rakefile
|
24
24
|
When I run local executable 'install_choctop' with arguments ''
|
25
25
|
Then output does match /USAGE: install_choctop path\/to\/CocoaApp/
|
26
|
-
|
26
|
+
|
27
|
+
Scenario: Install choctop and generate a ReleaseNotes file
|
28
|
+
Given a Cocoa app that does not have an existing Rakefile
|
29
|
+
When I run local executable 'install_choctop' with arguments '.'
|
30
|
+
Then file 'ReleaseNotes.txt' is created
|
31
|
+
And contents of file 'ReleaseNotes.txt' does match /Initial release/
|
32
|
+
|
data/features/rake_tasks.feature
CHANGED
@@ -15,10 +15,10 @@ Feature: Rake tasks are available to build and deploy Cocoa apps with Sparkle
|
|
15
15
|
|
16
16
|
Scenario: rake task to upload the appcast file to the server
|
17
17
|
Given a Cocoa app with choctop installed
|
18
|
-
And task 'rake feed' is invoked
|
18
|
+
And task 'rake dmg feed' is invoked
|
19
19
|
And ChocTop config is configured for local rsync
|
20
20
|
When task 'rake upload' is invoked
|
21
|
-
Then remote file '
|
21
|
+
Then remote file 'my_feed.xml' is created
|
22
22
|
Then remote file 'SampleApp-0.1.0.dmg' is created
|
23
23
|
Then remote file 'index.php' is created
|
24
24
|
|
@@ -6,7 +6,7 @@ Feature: Generate an XML file for Sparkle to use for updates
|
|
6
6
|
Scenario: rake task to create/update the appcast file
|
7
7
|
Given a Cocoa app with choctop installed
|
8
8
|
And ChocTop config is configured for remote Sparkle
|
9
|
-
When task 'rake feed' is invoked
|
9
|
+
When task 'rake dmg feed' is invoked
|
10
10
|
Then file 'appcast/build/my_feed.xml' is created
|
11
11
|
And contents of file 'appcast/build/my_feed.xml' does match /<channel>/
|
12
12
|
And contents of file 'appcast/build/my_feed.xml' does match /</channel>/
|
@@ -18,7 +18,21 @@ Feature: Generate an XML file for Sparkle to use for updates
|
|
18
18
|
And file 'appcast/build/index.php' is created
|
19
19
|
And contents of file 'appcast/build/index.php' does match /Location/
|
20
20
|
And contents of file 'appcast/build/index.php' does match /SampleApp-0.1.0.dmg/
|
21
|
+
And file 'appcast/build/release_notes.html' is created
|
22
|
+
And contents of file 'appcast/build/release_notes.html' does match /0.1.0/
|
23
|
+
And contents of file 'appcast/build/release_notes.html' does match /<h2>Initial release</h2>/
|
24
|
+
And contents of file 'appcast/build/release_notes.html' does match /<p>Yay! First release.</p>/
|
25
|
+
And contents of file 'appcast/build/release_notes.html' does match /<html>/
|
21
26
|
|
22
|
-
|
27
|
+
Scenario: generate default release notes if no ReleaseNotes.txt
|
28
|
+
Given a Cocoa app with choctop installed
|
29
|
+
And ChocTop config is configured for remote Sparkle
|
30
|
+
And file 'ReleaseNotes.txt' is deleted
|
31
|
+
When task 'rake dmg feed' is invoked
|
32
|
+
Then file 'appcast/build/release_notes.html' is created
|
33
|
+
And contents of file 'appcast/build/release_notes.html' does match /0.1.0/
|
34
|
+
And contents of file 'appcast/build/release_notes.html' does match /<h2>Another awesome release!</h2>/
|
35
|
+
And contents of file 'appcast/build/release_notes.html' does match /<html>/
|
36
|
+
|
37
|
+
|
23
38
|
|
24
|
-
|
data/features/steps/common.rb
CHANGED
@@ -50,6 +50,12 @@ Given %r{'(.*)' folder is deleted} do |folder|
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
+
Given %r{file '(.*)' is deleted} do |file|
|
54
|
+
in_project_folder do
|
55
|
+
FileUtils.rm_rf file
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
53
59
|
When %r{^'(.*)' generator is invoked with arguments '(.*)'$} do |generator, arguments|
|
54
60
|
@stdout = StringIO.new
|
55
61
|
FileUtils.chdir(@active_project_folder) do
|
data/features/steps/env.rb
CHANGED
data/features/steps/generator.rb
CHANGED
data/lib/choctop.rb
CHANGED
@@ -3,16 +3,17 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
3
3
|
|
4
4
|
require "fileutils"
|
5
5
|
require "yaml"
|
6
|
-
require "rubygems"
|
7
6
|
require "builder"
|
8
|
-
require "
|
7
|
+
require "erb"
|
9
8
|
require "osx/cocoa"
|
9
|
+
require "active_support"
|
10
|
+
require "RedCloth"
|
10
11
|
|
11
12
|
class ChocTop
|
12
|
-
VERSION = '0.9.
|
13
|
+
VERSION = '0.9.3'
|
13
14
|
|
14
15
|
# The name of the Cocoa application
|
15
|
-
# Default: info_plist['CFBundleExecutable']
|
16
|
+
# Default: info_plist['CFBundleExecutable'] or project folder name if "${EXECUTABLE}"
|
16
17
|
attr_accessor :name
|
17
18
|
|
18
19
|
# The version of the Cocoa application
|
@@ -33,10 +34,21 @@ class ChocTop
|
|
33
34
|
@base_url ||= "http://#{host}"
|
34
35
|
end
|
35
36
|
|
36
|
-
# The
|
37
|
+
# The file name for generated release notes for the latest release
|
37
38
|
# Default: release_notes.html
|
38
39
|
attr_accessor :release_notes
|
39
40
|
|
41
|
+
# The path for an HTML template into which the ReleaseNotes.txt are inserted
|
42
|
+
# after conversion to HTML
|
43
|
+
#
|
44
|
+
# The template file is an ERb template, with <%= yield %> as the placeholder
|
45
|
+
# for the generated release notes.
|
46
|
+
#
|
47
|
+
# Currently, any CSS or JavaScript must be inline
|
48
|
+
#
|
49
|
+
# Default: release_notes_template.html.erb, which was generated by install_choctop into each project
|
50
|
+
attr_accessor :release_notes_template
|
51
|
+
|
40
52
|
# The name of the local xml file containing the Sparkle item details
|
41
53
|
# Default: info_plist['SUFeedURL'] or linker_appcast.xml
|
42
54
|
attr_accessor :appcast_filename
|
@@ -119,11 +131,13 @@ class ChocTop
|
|
119
131
|
|
120
132
|
# Defaults
|
121
133
|
@name = info_plist['CFBundleExecutable']
|
134
|
+
@name = File.basename(File.expand_path(".")) if name == "${EXECUTABLE}"
|
122
135
|
@version = info_plist['CFBundleVersion']
|
123
136
|
@target = "#{name}.app"
|
124
137
|
@appcast_filename = info_plist['SUFeedURL'] ? File.basename(info_plist['SUFeedURL']) : 'linker_appcast.xml'
|
125
138
|
@release_notes = 'release_notes.html'
|
126
|
-
@
|
139
|
+
@release_notes_template = "release_notes_template.html.erb"
|
140
|
+
@rsync_args = '-aCv --progress'
|
127
141
|
|
128
142
|
@background_file = File.dirname(__FILE__) + "/../assets/sky_background.jpg"
|
129
143
|
@app_icon_position = [175, 65]
|
@@ -156,9 +170,10 @@ class ChocTop
|
|
156
170
|
end
|
157
171
|
|
158
172
|
desc "Create/update the appcast file"
|
159
|
-
task :feed
|
173
|
+
task :feed do
|
160
174
|
make_appcast
|
161
175
|
make_index_redirect
|
176
|
+
make_release_notes
|
162
177
|
end
|
163
178
|
|
164
179
|
desc "Upload the appcast file to the host"
|
data/lib/choctop/appcast.rb
CHANGED
@@ -7,36 +7,36 @@ module ChocTop::Appcast
|
|
7
7
|
app_name = File.basename(File.expand_path('.'))
|
8
8
|
|
9
9
|
FileUtils.mkdir_p "#{build_path}"
|
10
|
-
appcast = File.open("#{build_path}/#{appcast_filename}", 'w')
|
10
|
+
appcast = File.open("#{build_path}/#{appcast_filename}", 'w') do |f|
|
11
|
+
xml = Builder::XmlMarkup.new(:indent => 2)
|
12
|
+
xml.instruct!
|
13
|
+
xml_string = xml.rss('xmlns:atom' => "http://www.w3.org/2005/Atom",
|
14
|
+
'xmlns:sparkle' => "http://www.andymatuschak.org/xml-namespaces/sparkle",
|
15
|
+
:version => "2.0") do
|
16
|
+
xml.channel do
|
17
|
+
xml.title(app_name)
|
18
|
+
xml.description("#{app_name} updates")
|
19
|
+
xml.link(base_url)
|
20
|
+
xml.language('en')
|
21
|
+
xml.pubDate Time.now.to_s(:rfc822)
|
22
|
+
# xml.lastBuildDate(Time.now.rfc822)
|
23
|
+
xml.atom(:link, :href => "#{base_url}/#{appcast_filename}",
|
24
|
+
:rel => "self", :type => "application/rss+xml")
|
11
25
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
:
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
xml.pubDate Time.now.to_s(:rfc822)
|
24
|
-
# xml.lastBuildDate(Time.now.rfc822)
|
25
|
-
xml.atom(:link, :href => "#{base_url}/#{appcast_filename}",
|
26
|
-
:rel => "self", :type => "application/rss+xml")
|
27
|
-
|
28
|
-
xml.item do
|
29
|
-
xml.title("#{name} #{version}")
|
30
|
-
xml.tag! "sparkle:releaseNotesLink", "#{base_url}/#{release_notes}"
|
31
|
-
xml.pubDate Time.now.to_s(:rfc822) #(File.mtime(pkg))
|
32
|
-
xml.guid("#{name}-#{version}", :isPermaLink => "false")
|
33
|
-
xml.enclosure(:url => "#{base_url}/#{pkg_name}",
|
34
|
-
:length => "#{File.size(pkg)}",
|
35
|
-
:type => "application/dmg",
|
36
|
-
:"sparkle:version" => version,
|
37
|
-
:"sparkle:dsaSignature" => dsa_signature)
|
26
|
+
xml.item do
|
27
|
+
xml.title("#{name} #{version}")
|
28
|
+
xml.tag! "sparkle:releaseNotesLink", "#{base_url}/#{release_notes}"
|
29
|
+
xml.pubDate Time.now.to_s(:rfc822) #(File.mtime(pkg))
|
30
|
+
xml.guid("#{name}-#{version}", :isPermaLink => "false")
|
31
|
+
xml.enclosure(:url => "#{base_url}/#{pkg_name}",
|
32
|
+
:length => "#{File.size(pkg)}",
|
33
|
+
:type => "application/dmg",
|
34
|
+
:"sparkle:version" => version,
|
35
|
+
:"sparkle:dsaSignature" => dsa_signature)
|
36
|
+
end
|
38
37
|
end
|
39
38
|
end
|
39
|
+
f << xml_string
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
@@ -45,10 +45,33 @@ module ChocTop::Appcast
|
|
45
45
|
f << %Q{<?php header("Location: #{pkg_relative_url}"); ?>}
|
46
46
|
end
|
47
47
|
end
|
48
|
+
|
49
|
+
def make_release_notes
|
50
|
+
File.open("#{build_path}/#{release_notes}", "w") do |f|
|
51
|
+
template = File.read(release_notes_template)
|
52
|
+
f << ERB.new(template).result(binding)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def release_notes_content
|
57
|
+
if File.exists?("ReleaseNotes.txt")
|
58
|
+
File.read("ReleaseNotes.txt")
|
59
|
+
else
|
60
|
+
<<-TEXTILE.gsub(/^ /, '')
|
61
|
+
h1. #{version} #{Date.today}
|
62
|
+
|
63
|
+
h2. Another awesome release!
|
64
|
+
TEXTILE
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def release_notes_html
|
69
|
+
RedCloth.new(release_notes_content).to_html
|
70
|
+
end
|
48
71
|
|
49
72
|
def upload_appcast
|
50
73
|
_host = host.blank? ? "" : "#{host}:"
|
51
|
-
sh %{rsync
|
74
|
+
sh %{rsync #{rsync_args} #{build_path}/ #{_host}#{remote_dir}}
|
52
75
|
end
|
53
76
|
|
54
77
|
# Returns a file path to the dsa_priv.pem file
|
@@ -61,6 +84,12 @@ module ChocTop::Appcast
|
|
61
84
|
`openssl gendsa dsaparam.pem -out dsa_priv.pem`
|
62
85
|
`openssl dsa -in dsa_priv.pem -pubout -out dsa_pub.pem`
|
63
86
|
`rm dsaparam.pem`
|
87
|
+
puts <<-EOS.gsub(/^ /, '')
|
88
|
+
|
89
|
+
WARNING: DO NOT PUT dsa_priv.pem IN YOUR SOURCE CONTROL
|
90
|
+
Remember to add it to your ignore list
|
91
|
+
|
92
|
+
EOS
|
64
93
|
end
|
65
94
|
File.expand_path('dsa_priv.pem')
|
66
95
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: choctop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dr Nic Williams
|
@@ -33,6 +33,16 @@ dependencies:
|
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: 2.1.2
|
35
35
|
version:
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: RedCloth
|
38
|
+
type: :runtime
|
39
|
+
version_requirement:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 4.1.1
|
45
|
+
version:
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: newgem
|
38
48
|
type: :development
|
@@ -73,6 +83,8 @@ files:
|
|
73
83
|
- Rakefile
|
74
84
|
- app_generators/install_choctop/install_choctop_generator.rb
|
75
85
|
- app_generators/install_choctop/templates/Rakefile.erb
|
86
|
+
- app_generators/install_choctop/templates/ReleaseNotes.txt.erb
|
87
|
+
- app_generators/install_choctop/templates/release_notes_template.html.erb
|
76
88
|
- assets/DefaultVolumeIcon.icns
|
77
89
|
- assets/sky.jpg
|
78
90
|
- assets/sky_background.jpg
|