public
Description: Discount (For Ruby) Implementation of John Gruber's Markdown
Homepage: http://github.com/rtomayko/rdiscount/
Clone URL: git://github.com/rtomayko/rdiscount.git
rdiscount / Rakefile
100644 195 lines (154 sloc) 5.549 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
require 'rake/clean'
 
task :default => :test
 
# PACKAGING =================================================================
 
require 'rubygems/specification'
$spec = eval(File.read('rdiscount.gemspec'))
 
def package(ext='')
  "pkg/rdiscount-#{$spec.version}" + ext
end
 
desc 'Build packages'
task :package => %w[.gem .tar.gz].map {|e| package(e)}
 
desc 'Build and install as local gem'
task :install => package('.gem') do
  sh "gem install #{package('.gem')}"
end
 
directory 'pkg/'
 
file package('.gem') => %w[pkg/ rdiscount.gemspec] + $spec.files do |f|
  sh "gem build rdiscount.gemspec"
  mv File.basename(f.name), f.name
end
 
file package('.tar.gz') => %w[pkg/] + $spec.files do |f|
  sh "git archive --format=tar HEAD | gzip > #{f.name}"
end
 
# GEMSPEC HELPERS ==========================================================
 
def source_version
  line = File.read('lib/rdiscount.rb')[/^\s*VERSION = .*/]
  line.match(/.*VERSION = '(.*)'/)[1]
end
 
file 'rdiscount.gemspec' => FileList['Rakefile','lib/rdiscount.rb'] do |f|
  # read spec file and split out manifest section
  spec = File.read(f.name)
  head, manifest, tail = spec.split(" # = MANIFEST =\n")
  head.sub!(/\.version = '.*'/, ".version = '#{source_version}'")
  head.sub!(/\.date = '.*'/, ".date = '#{Date.today.to_s}'")
  # determine file list from git ls-files
  files = `git ls-files`.
    split("\n").
    sort.
    reject{ |file| file =~ /^\./ || file =~ /^test\/MarkdownTest/ }.
    map{ |file| " #{file}" }.
    join("\n")
  # piece file back together and write...
  manifest = " s.files = %w[\n#{files}\n ]\n"
  spec = [head,manifest,tail].join(" # = MANIFEST =\n")
  File.open(f.name, 'w') { |io| io.write(spec) }
  puts "updated #{f.name}"
end
 
# ==========================================================
# Ruby Extension
# ==========================================================
 
DLEXT = Config::CONFIG['DLEXT']
 
file 'ext/Makefile' => FileList['ext/{*.c,*.h,*.rb}'] do
  chdir('ext') { ruby 'extconf.rb' }
end
CLEAN.include 'ext/Makefile', 'ext/mkmf.log'
 
file "ext/rdiscount.#{DLEXT}" => FileList['ext/Makefile', 'ext/*.{c,h,rb}'] do |f|
  sh 'cd ext && make'
end
CLEAN.include 'ext/*.{o,bundle,so,dll}'
 
file "lib/rdiscount.#{DLEXT}" => "ext/rdiscount.#{DLEXT}" do |f|
  cp f.prerequisites, "lib/", :preserve => true
end
 
desc 'Build the rdiscount extension'
task :build => "lib/rdiscount.#{DLEXT}"
 
# ==========================================================
# Testing
# ==========================================================
 
desc 'Run unit tests'
task 'test:unit' => [:build] do |t|
  sh 'testrb test/markdown_test.rb test/rdiscount_test.rb'
end
 
desc 'Run conformance tests (MARKDOWN_TEST_VER=1.0)'
task 'test:conformance' => [:build] do |t|
  script = "#{pwd}/bin/rdiscount"
  test_version = ENV['MARKDOWN_TEST_VER'] || '1.0.3'
  chdir("test/MarkdownTest_#{test_version}") do
    sh "./MarkdownTest.pl --script='#{script}' --tidy"
  end
end
 
desc 'Run version 1.0 conformance suite'
task 'test:conformance:1.0' => [:build] do |t|
  ENV['MARKDOWN_TEST_VER'] = '1.0'
  Rake::Task['test:conformance'].invoke
end
 
desc 'Run 1.0.3 conformance suite'
task 'test:conformance:1.0.3' => [:build] do |t|
  ENV['MARKDOWN_TEST_VER'] = '1.0.3'
  Rake::Task['test:conformance'].invoke
end
 
desc 'Run unit and conformance tests'
task :test => %w[test:unit test:conformance]
 
desc 'Run benchmarks'
task :benchmark => :build do |t|
  $:.unshift 'lib'
  load 'test/benchmark.rb'
end
 
# ==========================================================
# Documentation
# ==========================================================
 
desc 'Generate API documentation'
task :doc => 'doc/index.html'
 
file 'doc/index.html' => FileList['lib/*.rb'] do |f|
  sh((<<-end).gsub(/\s+/, ' '))
hanna --charset utf8 \
--fmt html \
--inline-source \
--line-numbers \
--main RDiscount \
--op doc \
--title 'RDiscount API Documentation' \
#{f.prerequisites.join(' ')}
end
end
 
CLEAN.include 'doc'
 
 
# ==========================================================
# Rubyforge
# ==========================================================
 
desc 'Publish new release to rubyforge'
task :release => [package('.gem'), package('.tar.gz')] do |t|
  sh <<-end
rubyforge add_release wink rdiscount #{$spec.version} #{package('.gem')} &&
rubyforge add_file wink rdiscount #{$spec.version} #{package('.tar.gz')}
end
end
 
desc 'Publish API docs to rubyforge'
task :publish => :doc do |t|
  sh 'scp -rp doc/. rubyforge.org:/var/www/gforge-projects/wink/rdiscount'
end
 
# ==========================================================
# Update package's Discount sources
# ==========================================================
 
desc 'Gather required discount sources into extension directory'
task :gather => 'discount' do |t|
  files =
    FileList[
      'discount/{markdown,mkdio,amalloc,cstring}.h',
      'discount/{markdown,docheader,dumptree,generate,mkdio,resource,toc,Csio}.c'
    ]
  cp files, 'ext/',
    :preserve => true,
    :verbose => true
end
 
# best. task. ever.
file 'discount' do |f|
  STDERR.puts((<<-TEXT).gsub(/^ +/, ''))
Sorry, this operation requires a human. Tell your human to:
 
Grab a discount tarball from:
http://www.pell.portland.or.us/~orc/Code/discount/
 
Extract here with something like:
tar xvzf discount-1.2.9.tar.gz
 
Create a discount symlink pointing at the version directory:
ln -hsf discount-1.2.9 discount
 
TEXT
  fail "discount sources required."
end