choctop 0.9.5 → 0.9.6
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 +8 -0
- data/Manifest.txt +2 -2
- data/README.rdoc +1 -1
- data/app_generators/install_choctop/templates/Rakefile.erb +1 -0
- data/features/dmg.feature +17 -4
- data/features/fixtures/custom_assets/appicon.icns +0 -0
- data/features/steps/dmg_steps.rb +11 -0
- data/features/steps/file_attribute_steps.rb +16 -0
- data/lib/choctop.rb +15 -1
- data/lib/choctop/appcast.rb +5 -1
- data/lib/choctop/dmg.rb +74 -48
- metadata +4 -4
- data/features/fixtures/design/background.jpg +0 -0
- data/features/fixtures/design/ds_store +0 -0
data/History.txt
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== 0.9.6 2009-02-10
|
2
|
+
|
3
|
+
* Custom Applications Icons!!!
|
4
|
+
* New config option: s.application_icon = "xxx.png"
|
5
|
+
* New config option: s.icon_text_size = 12
|
6
|
+
* rake dmg NO_BUILD=1 will skip the build step
|
7
|
+
* The background image no longer appears in the "real time" design of the DMG as its in .background folder
|
8
|
+
|
1
9
|
== 0.9.5 2009-02-03
|
2
10
|
|
3
11
|
* Fixed whitespace in project names bug
|
data/Manifest.txt
CHANGED
@@ -42,14 +42,14 @@ features/fixtures/SampleApp/SampleApp.xcodeproj/TemplateIcon.icns
|
|
42
42
|
features/fixtures/SampleApp/SampleApp.xcodeproj/project.pbxproj
|
43
43
|
features/fixtures/SampleApp/SampleApp_Prefix.pch
|
44
44
|
features/fixtures/SampleApp/main.m
|
45
|
-
features/fixtures/
|
46
|
-
features/fixtures/design/ds_store
|
45
|
+
features/fixtures/custom_assets/appicon.icns
|
47
46
|
features/initial_generator.feature
|
48
47
|
features/rake_tasks.feature
|
49
48
|
features/sparkle_feed.feature
|
50
49
|
features/steps/common.rb
|
51
50
|
features/steps/dmg_steps.rb
|
52
51
|
features/steps/env.rb
|
52
|
+
features/steps/file_attribute_steps.rb
|
53
53
|
features/steps/generator.rb
|
54
54
|
features/steps/remote.rb
|
55
55
|
features/steps/xcode_steps.rb
|
data/README.rdoc
CHANGED
@@ -106,7 +106,7 @@ its set to Debug for development) and then Build. The "rake appcast" task should
|
|
106
106
|
|
107
107
|
== SPONSORED BY:
|
108
108
|
|
109
|
-
http
|
109
|
+
http://mocra.com - Mocra - the premier Rails/iPhone consultancy
|
110
110
|
|
111
111
|
== LICENSE:
|
112
112
|
|
data/features/dmg.feature
CHANGED
@@ -10,8 +10,8 @@ Feature: Can build a customised DMG image from application build
|
|
10
10
|
When dmg 'appcast/build/SampleApp-0.1.0.dmg' is mounted as 'SampleApp'
|
11
11
|
Then folder 'SampleApp.app' in mounted volume is created
|
12
12
|
And file 'Applications' in mounted volume is created
|
13
|
-
And file 'background.jpg' in mounted volume is created
|
14
|
-
And file 'background.jpg' in mounted volume is invisible
|
13
|
+
And file '.background/background.jpg' in mounted volume is created
|
14
|
+
And file '.background/background.jpg' in mounted volume is invisible
|
15
15
|
And file '.VolumeIcon.icns' in mounted volume is created
|
16
16
|
|
17
17
|
Scenario: Build a DMG with a whitespace name
|
@@ -21,6 +21,19 @@ Feature: Can build a customised DMG image from application build
|
|
21
21
|
When dmg 'appcast/build/App With Whitespace-1.0.dmg' is mounted as 'App With Whitespace'
|
22
22
|
Then folder 'App With Whitespace.app' in mounted volume is created
|
23
23
|
And file 'Applications' in mounted volume is created
|
24
|
-
And file 'background.jpg' in mounted volume is created
|
25
|
-
And file 'background.jpg' in mounted volume is invisible
|
24
|
+
And file '.background/background.jpg' in mounted volume is created
|
25
|
+
And file '.background/background.jpg' in mounted volume is invisible
|
26
26
|
And file '.VolumeIcon.icns' in mounted volume is created
|
27
|
+
|
28
|
+
Scenario: Build a DMG with custom Applications symlink icon
|
29
|
+
Given a Cocoa app with choctop installed called 'SampleApp'
|
30
|
+
And is configured for custom Applications icon
|
31
|
+
When task 'rake dmg' is invoked
|
32
|
+
And dmg 'appcast/build/SampleApp-0.1.0.dmg' is mounted as 'SampleApp'
|
33
|
+
Then file 'Applications' in mounted volume is created
|
34
|
+
And file 'Applications' in mounted volume has GetFileInfo type '"fdrp"'
|
35
|
+
And file 'Applications' in mounted volume has GetFileInfo alias '1'
|
36
|
+
And file 'Applications' in mounted volume has GetFileInfo custom icon '1'
|
37
|
+
And file 'Applications' in mounted volume is aliased to '/Applications'
|
38
|
+
|
39
|
+
|
Binary file
|
data/features/steps/dmg_steps.rb
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
Given /is configured for custom Applications icon$/ do
|
2
|
+
appicon = File.expand_path(File.dirname(__FILE__) + "/../fixtures/custom_assets/appicon.icns")
|
3
|
+
in_project_folder do
|
4
|
+
append_to_file "Rakefile", <<-RUBY.gsub(/^ /, '')
|
5
|
+
$sparkle.applications_icon = "appicon.icns"
|
6
|
+
RUBY
|
7
|
+
FileUtils.cp(appicon, "appicon.icns")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
1
11
|
When /^dmg '(.*)' is mounted as '(.*)'$/ do |dmg, name|
|
2
12
|
@stdout = File.expand_path(File.join(@tmp_root, "hdiutil.out"))
|
3
13
|
in_project_folder do
|
@@ -29,3 +39,4 @@ Then /^file '(.*)' in mounted volume (is|is not) invisible$/ do |file, is|
|
|
29
39
|
`GetFileInfo -aV '#{@volume_path}/#{file}'`.to_i.should_not == (is == 'is' ? 0 : 1)
|
30
40
|
end
|
31
41
|
end
|
42
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Then /^file '(.*)' in mounted volume has GetFileInfo (.*) '(.*)'/ do |file, file_info_type, value|
|
2
|
+
flags = case file_info_type.to_sym
|
3
|
+
when :type; "-t"
|
4
|
+
when :alias; "-aa"
|
5
|
+
when :"custom icon"; "-ac"
|
6
|
+
end
|
7
|
+
in_mounted_volume do
|
8
|
+
`GetFileInfo #{flags} '#{file}'`.strip.should == value
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
Then /^file '(.*)' in mounted volume is aliased to '(.*)'/ do |file, target|
|
13
|
+
in_mounted_volume do
|
14
|
+
puts "TODO - how to get applescript to test this?"
|
15
|
+
end
|
16
|
+
end
|
data/lib/choctop.rb
CHANGED
@@ -10,7 +10,7 @@ require "active_support"
|
|
10
10
|
require "RedCloth"
|
11
11
|
|
12
12
|
class ChocTop
|
13
|
-
VERSION = '0.9.
|
13
|
+
VERSION = '0.9.6'
|
14
14
|
|
15
15
|
# The name of the Cocoa application
|
16
16
|
# Default: info_plist['CFBundleExecutable'] or project folder name if "${EXECUTABLE_NAME}"
|
@@ -110,10 +110,23 @@ class ChocTop
|
|
110
110
|
# To get default, boring blank DMG volume icon, set value to +nil+
|
111
111
|
attr_accessor :volume_icon
|
112
112
|
|
113
|
+
# Custom icon for the Applications symlink icon
|
114
|
+
# Default: none
|
115
|
+
attr_accessor :applications_icon
|
116
|
+
|
113
117
|
# Size of icons, in pixels, within custom DMG (between 16 and 128)
|
114
118
|
# Default: 104 - this is nice and big
|
115
119
|
attr_accessor :icon_size
|
116
120
|
|
121
|
+
# Icon text size
|
122
|
+
# Can pass integer (12) or string ("12" or "12 px")
|
123
|
+
# Default: 12 (px)
|
124
|
+
attr_reader :icon_text_size
|
125
|
+
|
126
|
+
def icon_text_size=(size)
|
127
|
+
@icon_text_size = size.to_i
|
128
|
+
end
|
129
|
+
|
117
130
|
# The url for the remote package, without the protocol + host
|
118
131
|
# e.g. if absolute url is http://mydomain.com/downloads/MyApp-1.0.dmg
|
119
132
|
# then pkg_relative_url is /downloads/MyApp-1.0.dmg
|
@@ -144,6 +157,7 @@ class ChocTop
|
|
144
157
|
@applications_icon_position = [347, 270]
|
145
158
|
@volume_icon = File.dirname(__FILE__) + "/../assets/DefaultVolumeIcon.icns"
|
146
159
|
@icon_size = 104
|
160
|
+
@icon_text_size = 12
|
147
161
|
|
148
162
|
yield self if block_given?
|
149
163
|
|
data/lib/choctop/appcast.rb
CHANGED
data/lib/choctop/dmg.rb
CHANGED
@@ -6,20 +6,15 @@ module ChocTop::Dmg
|
|
6
6
|
sh "hdiutil create -format UDRW -quiet -volname '#{name}' -srcfolder 'build/Release/#{target}' '#{pkg}'"
|
7
7
|
sh "hdiutil attach '#{pkg}' -mountpoint '#{volume_path}' -noautoopen -quiet"
|
8
8
|
sh "bless --folder '#{volume_path}' --openfolder '#{volume_path}'"
|
9
|
-
sh "ln -s /Applications '#{volume_path}/Applications'"
|
10
9
|
sh "sleep 1"
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
15
|
-
target_background = "#{volume_path}/#{volume_background}"
|
16
|
-
FileUtils.cp(background_file, target_background) if background_file
|
10
|
+
|
11
|
+
configure_volume_icon
|
12
|
+
configure_applications_icon
|
17
13
|
configure_dmg_window
|
18
|
-
sh "SetFile -a V '#{target_background}'" if background_file
|
19
14
|
end
|
20
15
|
|
21
16
|
def volume_background
|
22
|
-
"background#{File.extname(background_file)}"
|
17
|
+
".background/background#{File.extname(background_file)}"
|
23
18
|
end
|
24
19
|
|
25
20
|
def window_position
|
@@ -37,49 +32,66 @@ module ChocTop::Dmg
|
|
37
32
|
[background.first, background.last + statusbar_height]
|
38
33
|
end
|
39
34
|
|
40
|
-
def statusbar_height
|
41
|
-
20
|
42
|
-
end
|
35
|
+
def statusbar_height; 20; end
|
43
36
|
|
37
|
+
def configure_volume_icon
|
38
|
+
if volume_icon
|
39
|
+
FileUtils.cp(volume_icon, "#{volume_path}/.VolumeIcon.icns")
|
40
|
+
sh "SetFile -a C '#{volume_path}'"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
44
|
def configure_dmg_window
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
open
|
50
|
-
tell container window
|
51
|
-
set toolbar visible to false
|
52
|
-
set statusbar visible to false -- doesn't do anything at DMG open time
|
53
|
-
set current view to icon view
|
54
|
-
delay 1 -- Sync
|
55
|
-
set the bounds to {#{window_bounds.join(", ")}}
|
56
|
-
end tell
|
57
|
-
delay 1 -- Sync
|
58
|
-
set icon size of the icon view options of container window to #{icon_size}
|
59
|
-
set arrangement of the icon view options of container window to not arranged
|
60
|
-
set position of item "#{target}" to {#{app_icon_position.join(", ")}}
|
61
|
-
set position of item "Applications" to {#{applications_icon_position.join(", ")}}
|
62
|
-
set the bounds of the container window to {#{window_bounds.join(", ")}}
|
63
|
-
set background picture of the icon view options of container window to file "#{File.basename volume_background}"
|
64
|
-
update without registering applications
|
65
|
-
delay 5 -- Sync
|
66
|
-
close
|
67
|
-
end tell
|
68
|
-
-- Sync
|
69
|
-
delay 5
|
70
|
-
end tell
|
71
|
-
SCRIPT
|
72
|
-
File.open(scriptfile = "/tmp/choctop-script", "w") do |f|
|
73
|
-
f << applescript
|
45
|
+
if background_file
|
46
|
+
target_background = "#{volume_path}/#{volume_background}"
|
47
|
+
FileUtils.mkdir_p(File.dirname(target_background))
|
48
|
+
FileUtils.cp(background_file, target_background)
|
74
49
|
end
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
50
|
+
run_applescript <<-SCRIPT.gsub(/^ /, '')
|
51
|
+
tell application "Finder"
|
52
|
+
set mountpoint to POSIX file ("#{volume_path}" as string) as alias
|
53
|
+
tell folder mountpoint
|
54
|
+
open
|
55
|
+
tell container window
|
56
|
+
set toolbar visible to false
|
57
|
+
set statusbar visible to false -- doesn't do anything at DMG open time
|
58
|
+
set current view to icon view
|
59
|
+
delay 1 -- Sync
|
60
|
+
set the bounds to {#{window_bounds.join(", ")}}
|
61
|
+
end tell
|
62
|
+
delay 1 -- Sync
|
63
|
+
set icon size of the icon view options of container window to #{icon_size}
|
64
|
+
set text size of the icon view options of container window to #{icon_text_size}
|
65
|
+
set arrangement of the icon view options of container window to not arranged
|
66
|
+
set position of item "#{target}" to {#{app_icon_position.join(", ")}}
|
67
|
+
set position of item "Applications" to {#{applications_icon_position.join(", ")}}
|
68
|
+
set the bounds of the container window to {#{window_bounds.join(", ")}}
|
69
|
+
set background picture of the icon view options of container window to file "#{volume_background.gsub(/\//,':')}"
|
70
|
+
update without registering applications
|
71
|
+
delay 5 -- Sync
|
72
|
+
close
|
73
|
+
end tell
|
74
|
+
-- Sync
|
75
|
+
delay 5
|
76
|
+
end tell
|
77
|
+
SCRIPT
|
78
|
+
sh "SetFile -a V '#{target_background}'" if background_file
|
79
|
+
end
|
80
|
+
|
81
|
+
def configure_applications_icon
|
82
|
+
run_applescript <<-SCRIPT.gsub(/^ /, ''), "apps_icon_script"
|
83
|
+
tell application "Finder"
|
84
|
+
set dest to disk "#{name}"
|
85
|
+
set src to folder "Applications" of startup disk
|
86
|
+
make new alias at dest to src
|
87
|
+
end tell
|
88
|
+
SCRIPT
|
89
|
+
if applications_icon
|
90
|
+
applications_path = "#{volume_path}/Applications"
|
91
|
+
OSX::NSApplicationLoad()
|
92
|
+
image = OSX::NSImage.alloc.initWithContentsOfFile(applications_icon)
|
93
|
+
OSX::NSWorkspace.sharedWorkspace.setIcon_forFile_options(image, applications_path, nil)
|
81
94
|
end
|
82
|
-
applescript
|
83
95
|
end
|
84
96
|
|
85
97
|
def detach_dmg
|
@@ -107,6 +119,20 @@ module ChocTop::Dmg
|
|
107
119
|
# hdiutil flatten $@
|
108
120
|
|
109
121
|
end
|
122
|
+
|
123
|
+
def run_applescript(applescript, tmp_file = "choctop-script")
|
124
|
+
File.open(scriptfile = "/tmp/#{tmp_file}", "w") do |f|
|
125
|
+
f << applescript
|
126
|
+
end
|
127
|
+
sh("osascript #{scriptfile}") do |ok, res|
|
128
|
+
if ! ok
|
129
|
+
p res
|
130
|
+
puts volume_path
|
131
|
+
exit 1
|
132
|
+
end
|
133
|
+
end
|
134
|
+
applescript
|
135
|
+
end
|
110
136
|
end
|
111
137
|
ChocTop.send(:include, ChocTop::Dmg)
|
112
138
|
|
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.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dr Nic Williams
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-02-
|
13
|
+
date: 2009-02-10 00:00:00 +10:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -120,14 +120,14 @@ files:
|
|
120
120
|
- features/fixtures/SampleApp/SampleApp.xcodeproj/project.pbxproj
|
121
121
|
- features/fixtures/SampleApp/SampleApp_Prefix.pch
|
122
122
|
- features/fixtures/SampleApp/main.m
|
123
|
-
- features/fixtures/
|
124
|
-
- features/fixtures/design/ds_store
|
123
|
+
- features/fixtures/custom_assets/appicon.icns
|
125
124
|
- features/initial_generator.feature
|
126
125
|
- features/rake_tasks.feature
|
127
126
|
- features/sparkle_feed.feature
|
128
127
|
- features/steps/common.rb
|
129
128
|
- features/steps/dmg_steps.rb
|
130
129
|
- features/steps/env.rb
|
130
|
+
- features/steps/file_attribute_steps.rb
|
131
131
|
- features/steps/generator.rb
|
132
132
|
- features/steps/remote.rb
|
133
133
|
- features/steps/xcode_steps.rb
|
Binary file
|
Binary file
|