XcodePages 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.rdoc +86 -0
- data/Rakefile +1 -0
- data/XcodePages.gemspec +29 -0
- data/lib/XcodePages/version.rb +3 -0
- data/lib/XcodePages.rb +145 -0
- metadata +79 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
= Xcode Pages
|
2
|
+
|
3
|
+
The XcodePages gem helps you publish documentation from within Xcode using
|
4
|
+
{Doxygen}[http://www.stack.nl/~dimitri/doxygen/].
|
5
|
+
|
6
|
+
The term 'Pages' comes from the ultimate goal: to publish the HTML web pages on
|
7
|
+
the Internet somewhere appropriate, e.g. on GitHub via the +gh-pages+ {branch
|
8
|
+
feature}[http://pages.github.com/].
|
9
|
+
|
10
|
+
The gem works for Objective-C projects built using Apple's {Xcode
|
11
|
+
IDE}[http://developer.apple.com/xcode/]. It consequently focuses on
|
12
|
+
documentation within Objective-C and Objective-C++ source files; files ending
|
13
|
+
with extensions +h+, +m+ or +mm+.
|
14
|
+
|
15
|
+
== How to Use Xcode Pages
|
16
|
+
|
17
|
+
=== Step 1
|
18
|
+
|
19
|
+
Add a new target to your Xcode project. Suppose your Xcode project has the name
|
20
|
+
+MyProject+. Add a new <em>External Build System</em> target called
|
21
|
+
+MyProjectPages+.
|
22
|
+
|
23
|
+
=== Step 2
|
24
|
+
|
25
|
+
Set the external build target up as follows.
|
26
|
+
|
27
|
+
- Build Tool: <code>/bin/sh</code>
|
28
|
+
- Arguments: <code>-c "$HOME/.rvm/bin/rvm-auto-ruby -r XcodePages -e XcodePages.doxygen_docset_install"</code>
|
29
|
+
- Directory: None
|
30
|
+
- Pass build setting in environment: Yes
|
31
|
+
|
32
|
+
Leave Build Settings and Phases as defaults.
|
33
|
+
|
34
|
+
Note that the arguments above tell the shell to run
|
35
|
+
<code>$HOME/.rvm/bin/rvm-auto-ruby</code>. This assumes you are running
|
36
|
+
{RVM}[http://beginrescueend.com/].
|
37
|
+
|
38
|
+
Also, do not try to promote your Ruby path to the Build Tool setting unless you
|
39
|
+
have a fixed path to Ruby, e.g. +/usr/bin/ruby+. Xcode does *not* make
|
40
|
+
environment variables substitutions within the Build Tool setting.
|
41
|
+
|
42
|
+
=== Step 3
|
43
|
+
|
44
|
+
Set up a new +Doxyfile+ in your project's source root containing four Doxygen settings:
|
45
|
+
|
46
|
+
* <code>DOCSET_FEEDNAME = "My Project Documentation Set"</code>
|
47
|
+
* <code>DOCSET_BUNDLE_ID = com.domain.MyProjectDocSet</code>
|
48
|
+
* <code>DOCSET_PUBLISHER_ID = com.domain.MyProjectDocSet.documentation</code>
|
49
|
+
* <code>DOCSET_PUBLISHER_NAME = My Publisher Name</code>
|
50
|
+
|
51
|
+
+DOCSET_BUNDLE_ID+ is the most significant item for this determines the base
|
52
|
+
name for the documentation set. Doxygen just adds extension +docset+ to make the
|
53
|
+
file name.
|
54
|
+
|
55
|
+
=== Step 4
|
56
|
+
|
57
|
+
You can now switch target to +MyProjectPages+ and hit Build (Cmd+B) to compile
|
58
|
+
the documentation. It will appear in folder +MyProjectPages+ within the source
|
59
|
+
root folder and a new Xcode +docset+ will appear in
|
60
|
+
+~/Library/Developer/Shared/Documentation/DocSets+.
|
61
|
+
|
62
|
+
You would normally have to reload Xcode to see the new documentation. As a
|
63
|
+
courtesy, the last step tells the running Xcode application to pick up the new
|
64
|
+
set.
|
65
|
+
|
66
|
+
== Benefits
|
67
|
+
|
68
|
+
* Takes the "fiddle" out of fiddling with Doxygen.
|
69
|
+
* You can easily identify undocumented classes and methods.
|
70
|
+
|
71
|
+
Warning messages output by Doxygen make this possible. After building your
|
72
|
+
project Pages target, the build results contain warning about undocumented
|
73
|
+
elements within your project. Press the Cmd+\' (Jump to Next Issue command) to
|
74
|
+
navigate through the undocumented code.
|
75
|
+
|
76
|
+
== Examples
|
77
|
+
|
78
|
+
You can find examples of projects using XcodePages here:
|
79
|
+
|
80
|
+
* {Active Support Kit}[https://github.com/royratcliffe/ActiveSupportKit]
|
81
|
+
|
82
|
+
== Prerequisites
|
83
|
+
|
84
|
+
* Xcode and associated Apple developer tools
|
85
|
+
* Ruby and RubyGems package manager
|
86
|
+
* Doxygen
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/XcodePages.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "XcodePages/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "XcodePages"
|
7
|
+
s.version = XcodePages::VERSION
|
8
|
+
s.authors = ["Roy Ratcliffe"]
|
9
|
+
s.email = ["roy@pioneeringsoftware.co.uk"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{Helps you publish documentation from within Xcode using Doxygen}
|
12
|
+
s.description = %q{
|
13
|
+
Helps you publish HTML web pages on the Internet somewhere appropriate, e.g.
|
14
|
+
on GitHub via the gh-pages branch feature.
|
15
|
+
|
16
|
+
Works for Objective-C projects built using Apple's Xcode IDE and
|
17
|
+
consequently focuses on documentation within Objective-C and Objective-C++
|
18
|
+
source files; files ending with extensions h, m or mm.}
|
19
|
+
|
20
|
+
s.rubyforge_project = "XcodePages"
|
21
|
+
|
22
|
+
s.files = `git ls-files`.split("\n")
|
23
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
24
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
25
|
+
s.require_paths = ["lib"]
|
26
|
+
|
27
|
+
s.add_development_dependency "rake"
|
28
|
+
s.add_runtime_dependency "activesupport"
|
29
|
+
end
|
data/lib/XcodePages.rb
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "XcodePages/version"
|
4
|
+
require 'active_support/core_ext/string'
|
5
|
+
require 'tempfile'
|
6
|
+
|
7
|
+
module XcodePages
|
8
|
+
# Prints the environment. Xcode passes many useful pieces of information via
|
9
|
+
# the Unix environment.
|
10
|
+
#
|
11
|
+
# This can be useful for testing. Add an external build target to Xcode. Make
|
12
|
+
# the Build Tool equal to /bin/sh and make the arguments equal to:
|
13
|
+
#
|
14
|
+
# -c "$HOME/.rvm/bin/rvm-auto-ruby -r XcodePages -e XcodePages.print_env"
|
15
|
+
#
|
16
|
+
# and you will see all the Unix environment variables. This assumes that you
|
17
|
+
# are using RVM in your local account to manage Ruby.
|
18
|
+
def self.print_env
|
19
|
+
ENV.each { |key, value| puts "#{key}=#{value}" }
|
20
|
+
end
|
21
|
+
|
22
|
+
# Searches for all the available source files (files with h, m or mm
|
23
|
+
# extension) in the current working directory or below. Pulls out their
|
24
|
+
# directory names and answers an array of unique space-delimited relative
|
25
|
+
# folder paths. These directory names will become Doxygen input folders.
|
26
|
+
#
|
27
|
+
# The implementation assumes that the current working directory equals the
|
28
|
+
# Xcode source root. It also makes some simplifying assumptions about spaces
|
29
|
+
# in the paths: that there are *no* spaces. Doxygen uses spaces to delimit the
|
30
|
+
# files and directories listed for input. But what if the paths themselves
|
31
|
+
# contain spaces?
|
32
|
+
#
|
33
|
+
# Note that this method works correctly when the source root itself contains
|
34
|
+
# headers or sources. In this case, the answer will contain the "." directory.
|
35
|
+
def self.input
|
36
|
+
Dir.glob('**/*.{h,m,mm}').map { |relative_path| File.dirname(relative_path) }.uniq.join(' ')
|
37
|
+
end
|
38
|
+
|
39
|
+
# Answers the project "marketing version" using Apple's +agvtool+. The
|
40
|
+
# marketing version is the "bundle short version string" appearing in the
|
41
|
+
# bundle's +Info.plist+. Cocoa only uses this for display in the standard
|
42
|
+
# About panel.
|
43
|
+
def self.marketing_version
|
44
|
+
%x(agvtool mvers -terse1).chomp
|
45
|
+
end
|
46
|
+
|
47
|
+
# Answers the project build version using Apple's +agvtool+. This is the real
|
48
|
+
# version number, equating to +CURRENT_PROJECT_VERSION+.
|
49
|
+
def self.build_version
|
50
|
+
%x(agvtool vers -terse).chomp
|
51
|
+
end
|
52
|
+
|
53
|
+
# Answers what Doxygen calls the ‘project number.’ This is the revision
|
54
|
+
# number appearing beside the project name in the documentation title. Uses
|
55
|
+
# the marketing and build version numbers in the format +vMV (BV)+ where +MV+
|
56
|
+
# stands for marketing version and +BV+ stands for build version. Omits the
|
57
|
+
# build version if the project matches marketing and build version. No sense
|
58
|
+
# repeating the same number if they are the same.
|
59
|
+
def self.project_number
|
60
|
+
project_number = "v#{marketing_version}"
|
61
|
+
project_number << " (#{build_version})" if build_version != marketing_version
|
62
|
+
end
|
63
|
+
|
64
|
+
# Answers the path of the output directory. Doxygen outputs to this folder.
|
65
|
+
# HTML web pages appear in the +html+ sub-folder.
|
66
|
+
def self.output_directory
|
67
|
+
"#{ENV['PROJECT_NAME']}Pages"
|
68
|
+
end
|
69
|
+
|
70
|
+
# Answers the path to the +html+ output sub-folder where Doxygen writes the
|
71
|
+
# HTML web pages and the DocSet +Makefile+ when +GENERATE_DOCSET+ equals
|
72
|
+
# +YES+.
|
73
|
+
def self.html_output_directory
|
74
|
+
File.join(output_directory, 'html')
|
75
|
+
end
|
76
|
+
|
77
|
+
# Launches Doxygen.
|
78
|
+
#
|
79
|
+
# The implementation derives the Doxygen project name from the environment
|
80
|
+
# PROJECT_NAME variable. Xcode passes this variable. Typically, it is a
|
81
|
+
# camel-cased name. Using ActiveSupport (part of the Rails framework) the
|
82
|
+
# implementation below derives a humanised title; effectively puts spaces
|
83
|
+
# in-between the camels!
|
84
|
+
def self.doxygen
|
85
|
+
IO.popen('doxygen -', 'r+') do |doxygen|
|
86
|
+
doxygen.puts <<-EOF
|
87
|
+
PROJECT_NAME = #{ENV['PROJECT_NAME'].titleize}
|
88
|
+
PROJECT_NUMBER = #{project_number}
|
89
|
+
OUTPUT_DIRECTORY = #{output_directory}
|
90
|
+
TAB_SIZE = 4
|
91
|
+
EXTENSION_MAPPING = h=Objective-C
|
92
|
+
INPUT = #{input}
|
93
|
+
SOURCE_BROWSER = YES
|
94
|
+
HTML_TIMESTAMP = NO
|
95
|
+
GENERATE_LATEX = NO
|
96
|
+
HAVE_DOT = YES
|
97
|
+
EOF
|
98
|
+
|
99
|
+
# Let the user override the previous defaults by loading up the Doxyfile
|
100
|
+
# if one exists. This should appear in the source root folder.
|
101
|
+
if File.exists?('Doxyfile')
|
102
|
+
doxygen.write File.read('Doxyfile')
|
103
|
+
end
|
104
|
+
|
105
|
+
# Close the write-end of the pipe.
|
106
|
+
doxygen.close_write
|
107
|
+
|
108
|
+
# Read the read-end of the pipe and send the lines to standard output.
|
109
|
+
puts doxygen.readlines
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# Launches Doxygen and builds the Apple DocSet. It does not install the
|
114
|
+
# DocSet. The compiled documentation set remains in the +html+ sub-folder.
|
115
|
+
def self.doxygen_docset
|
116
|
+
doxygen
|
117
|
+
# Assume that doxygen succeeds. But what happens when it does not?
|
118
|
+
%x(cd #{html_output_directory} ; make)
|
119
|
+
end
|
120
|
+
|
121
|
+
# Runs Doxygen and installs the Apple DocSet in the current user's shared
|
122
|
+
# documentation folder. Finally, as a courtesy, it tells Xcode about the
|
123
|
+
# change; signalling an update in your running Xcode IDE. Documentation
|
124
|
+
# updates immediately.
|
125
|
+
def self.doxygen_docset_install
|
126
|
+
doxygen
|
127
|
+
%x(cd #{html_output_directory} ; make install)
|
128
|
+
|
129
|
+
script = Tempfile.open(['XcodePages', '.scpt']) do |script|
|
130
|
+
script.puts <<-EOF
|
131
|
+
tell application "Xcode"
|
132
|
+
EOF
|
133
|
+
Dir.glob(File.join(html_output_directory, '*.docset')).each do |docset_path|
|
134
|
+
script.puts <<-EOF
|
135
|
+
load documentation set with path "#{ENV['HOME']}/Library/Developer/Shared/Documentation/DocSets/#{File.basename(docset_path)}"
|
136
|
+
EOF
|
137
|
+
end
|
138
|
+
script.puts <<-EOF
|
139
|
+
end tell
|
140
|
+
EOF
|
141
|
+
script.close
|
142
|
+
%x(osascript #{script.path})
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
metadata
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: XcodePages
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Roy Ratcliffe
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-12-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: &70122300103820 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70122300103820
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: activesupport
|
27
|
+
requirement: &70122300091600 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70122300091600
|
36
|
+
description: ! "\n Helps you publish HTML web pages on the Internet somewhere appropriate,
|
37
|
+
e.g.\n on GitHub via the gh-pages branch feature.\n\n Works for Objective-C
|
38
|
+
projects built using Apple's Xcode IDE and\n consequently focuses on documentation
|
39
|
+
within Objective-C and Objective-C++\n source files; files ending with extensions
|
40
|
+
h, m or mm."
|
41
|
+
email:
|
42
|
+
- roy@pioneeringsoftware.co.uk
|
43
|
+
executables: []
|
44
|
+
extensions: []
|
45
|
+
extra_rdoc_files: []
|
46
|
+
files:
|
47
|
+
- .gitignore
|
48
|
+
- Gemfile
|
49
|
+
- README.rdoc
|
50
|
+
- Rakefile
|
51
|
+
- XcodePages.gemspec
|
52
|
+
- lib/XcodePages.rb
|
53
|
+
- lib/XcodePages/version.rb
|
54
|
+
homepage: ''
|
55
|
+
licenses: []
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
requirements: []
|
73
|
+
rubyforge_project: XcodePages
|
74
|
+
rubygems_version: 1.8.10
|
75
|
+
signing_key:
|
76
|
+
specification_version: 3
|
77
|
+
summary: Helps you publish documentation from within Xcode using Doxygen
|
78
|
+
test_files: []
|
79
|
+
has_rdoc:
|