chronos 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +27 -0
- data/HISTORY.rdoc +4 -0
- data/LICENSE.txt +52 -0
- data/MANIFEST.txt +51 -0
- data/NOTES.rdoc +85 -0
- data/README.rdoc +125 -0
- data/Rakefile +34 -0
- data/TODO.rdoc +63 -0
- data/bench/completebench.rb +24 -0
- data/ext/cchronos/extconf.rb +5 -0
- data/ext/chronos_core/extconf.rb +5 -0
- data/lib/chronos.rb +208 -0
- data/lib/chronos/calendar.rb +16 -0
- data/lib/chronos/calendar/gregorian.rb +94 -0
- data/lib/chronos/data/zones.tab +424 -0
- data/lib/chronos/datetime.rb +299 -0
- data/lib/chronos/datetime/gregorian.rb +698 -0
- data/lib/chronos/duration.rb +141 -0
- data/lib/chronos/duration/gregorian.rb +261 -0
- data/lib/chronos/durationtotext.rb +42 -0
- data/lib/chronos/exceptions.rb +16 -0
- data/lib/chronos/gregorian.rb +27 -0
- data/lib/chronos/interval.rb +132 -0
- data/lib/chronos/interval/gregorian.rb +80 -0
- data/lib/chronos/locale/parsers/de_CH.rb +50 -0
- data/lib/chronos/locale/parsers/en_US.rb +1 -0
- data/lib/chronos/locale/parsers/generic.rb +21 -0
- data/lib/chronos/locale/strings/de_DE.yaml +76 -0
- data/lib/chronos/locale/strings/en_US.yaml +76 -0
- data/lib/chronos/minimalistic.rb +37 -0
- data/lib/chronos/numeric/gregorian.rb +100 -0
- data/lib/chronos/ruby.rb +6 -0
- data/lib/chronos/version.rb +21 -0
- data/lib/chronos/zone.rb +212 -0
- data/rake/initialize.rb +116 -0
- data/rake/lib/assesscode.rb +59 -0
- data/rake/lib/bonesplitter.rb +245 -0
- data/rake/lib/projectclass.rb +69 -0
- data/rake/tasks/copyright.rake +24 -0
- data/rake/tasks/gem.rake +119 -0
- data/rake/tasks/git.rake +40 -0
- data/rake/tasks/loc.rake +33 -0
- data/rake/tasks/manifest.rake +63 -0
- data/rake/tasks/meta.rake +16 -0
- data/rake/tasks/notes.rake +36 -0
- data/rake/tasks/post_load.rake +18 -0
- data/rake/tasks/rdoc.rake +73 -0
- data/rake/tasks/rubyforge.rake +67 -0
- data/rake/tasks/spec.rake +55 -0
- data/spec/bacon_helper.rb +43 -0
- data/spec/lib/chronos/datetime/gregorian_spec.rb +314 -0
- data/spec/lib/chronos/datetime_spec.rb +219 -0
- data/spec/lib/chronos_spec.rb +91 -0
- metadata +111 -0
@@ -0,0 +1,59 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2007-2008 by Stefan Rusterholz.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#++
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
class AssessCode
|
10
|
+
def initialize(base, *paths)
|
11
|
+
@base = base
|
12
|
+
@paths = paths
|
13
|
+
reset
|
14
|
+
end
|
15
|
+
|
16
|
+
def reset
|
17
|
+
@loc_code = 0
|
18
|
+
@loc_comment = 0
|
19
|
+
@bytes_code = 0
|
20
|
+
@bytes_comment = 0
|
21
|
+
@bytes_data = 0
|
22
|
+
@files = 0
|
23
|
+
end
|
24
|
+
|
25
|
+
def assess
|
26
|
+
reset
|
27
|
+
@paths.each { |path|
|
28
|
+
assess_dir("#{@base}/#{path}")
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def assess_dir(dir)
|
33
|
+
Dir.glob(dir, &method(:assess_file))
|
34
|
+
end
|
35
|
+
|
36
|
+
def assess_file(file)
|
37
|
+
comment = false
|
38
|
+
@bytes_data += File.size(file)
|
39
|
+
@files += 1
|
40
|
+
File.readlines(file).each do |line|
|
41
|
+
comment = true if line =~ /^=begin/
|
42
|
+
comment = false if line =~ /^=end/
|
43
|
+
if comment or line =~ /^\s*(?:#|$)/
|
44
|
+
@loc_comment += 1
|
45
|
+
@bytes_comment += line.strip.size
|
46
|
+
else
|
47
|
+
@loc_code += 1
|
48
|
+
@bytes_code += line.strip.size
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def put_assessment
|
54
|
+
assess
|
55
|
+
puts "#{@bytes_data.div(1024)} KB total data in #{@files} files"
|
56
|
+
puts "#{@loc_code} Lines of Code (#{@bytes_code.div(1024)} KB)"
|
57
|
+
puts "#{@loc_comment} Lines of Comment (#{@bytes_comment.div(1024)} KB)"
|
58
|
+
end
|
59
|
+
end # class AssessCode
|
@@ -0,0 +1,245 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2007-2008 by Stefan Rusterholz.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#++
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
require 'stringio'
|
10
|
+
require 'ostruct'
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
# fix pre-rubygems 1.3 nuisance
|
15
|
+
begin
|
16
|
+
require 'rubygems'
|
17
|
+
module Kernel
|
18
|
+
private :gem
|
19
|
+
private :require
|
20
|
+
private :open
|
21
|
+
end
|
22
|
+
rescue LoadError; end
|
23
|
+
|
24
|
+
# needed for has_version?
|
25
|
+
class Array
|
26
|
+
include Comparable
|
27
|
+
end
|
28
|
+
|
29
|
+
# The module BoneSplitter offers various helpful methods for rake tasks.
|
30
|
+
#
|
31
|
+
module BoneSplitter
|
32
|
+
def self.find_executable(*names)
|
33
|
+
path = ENV["PATH"].split(File::PATH_SEPARATOR)
|
34
|
+
names.each { |name|
|
35
|
+
found = path.map { |path| File.join(path, name) }.find { |e| File.executable?(e) }
|
36
|
+
return found if found
|
37
|
+
}
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
|
41
|
+
@libs = {}
|
42
|
+
@bin = OpenStruct.new(
|
43
|
+
:diff => find_executable('diff', 'gdiff', 'diff.exe'),
|
44
|
+
:sudo => find_executable('sudo'),
|
45
|
+
:rcov => find_executable('rcov', 'rcov.bat'),
|
46
|
+
:rdoc => find_executable('rdoc', 'rdoc.bat'),
|
47
|
+
:gem => find_executable('gem', 'gem.bat', 'gem1.8'),
|
48
|
+
:git => find_executable('git')
|
49
|
+
)
|
50
|
+
|
51
|
+
class <<BoneSplitter
|
52
|
+
attr_accessor :libs, :bin
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
def optional_task(name, depends_on_constant)
|
57
|
+
# puts "#{name} requires #{depends_on_constant}: #{!!deep_const(depends_on_constant)}"
|
58
|
+
if deep_const(depends_on_constant) then
|
59
|
+
yield
|
60
|
+
else
|
61
|
+
task name do
|
62
|
+
"You're missing a dependency to run this thread (#{depends_on_constant})"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def deep_const(name)
|
68
|
+
name.split(/::/).inject(Object) { |nesting, name|
|
69
|
+
return nil unless nesting.const_defined?(name)
|
70
|
+
nesting.const_get(name)
|
71
|
+
}
|
72
|
+
end
|
73
|
+
|
74
|
+
def version_proc(constant)
|
75
|
+
proc {
|
76
|
+
file = constant.gsub(/::/, '/').downcase
|
77
|
+
require(file)
|
78
|
+
version = deep_const(constant)
|
79
|
+
version && version.to_s
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
def quietly
|
84
|
+
verbose, $VERBOSE = $VERBOSE, nil
|
85
|
+
yield
|
86
|
+
ensure
|
87
|
+
$VERBOSE = verbose
|
88
|
+
end
|
89
|
+
|
90
|
+
def silenced
|
91
|
+
a,b = $stderr, $stdout
|
92
|
+
$stderr = StringIO.new
|
93
|
+
$stdout = StringIO.new
|
94
|
+
yield
|
95
|
+
ensure
|
96
|
+
$stderr, $stdout = a,b
|
97
|
+
end
|
98
|
+
|
99
|
+
# same as lib? but aborts if a dependency isn't met
|
100
|
+
def dependency(names, warn_message=nil)
|
101
|
+
abort unless lib?(names, warn_message)
|
102
|
+
end
|
103
|
+
alias dependencies dependency
|
104
|
+
|
105
|
+
def lib?(names, warn_message=nil)
|
106
|
+
Array(names).map { |name|
|
107
|
+
next true if BoneSplitter.libs[name] # already been required earlier
|
108
|
+
begin
|
109
|
+
silenced do
|
110
|
+
require name
|
111
|
+
end
|
112
|
+
BoneSplitter.libs[name] = true
|
113
|
+
true
|
114
|
+
rescue LoadError
|
115
|
+
warn(warn_message % name) if warn_message
|
116
|
+
false
|
117
|
+
end
|
118
|
+
}.all? # map first so we get all messages at once
|
119
|
+
end
|
120
|
+
|
121
|
+
# Add a lib as present. Use this to fake existence of a lib if you have
|
122
|
+
# an in-place substitute for it, like e.g. RDiscount for Markdown.
|
123
|
+
def has_lib!(*names)
|
124
|
+
names.each { |name|
|
125
|
+
BoneSplitter.libs[name] = true
|
126
|
+
}
|
127
|
+
end
|
128
|
+
|
129
|
+
def manifest(mani=Project.meta.manifest)
|
130
|
+
if File.exist?(mani) then
|
131
|
+
File.read(mani).split(/\n/)
|
132
|
+
else
|
133
|
+
[]
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def bin
|
138
|
+
BoneSplitter.bin
|
139
|
+
end
|
140
|
+
|
141
|
+
def manifest_candidates
|
142
|
+
cands = Array(Project.manifest.include || '**/*').inject([]) { |a,e| a+Dir[e] }
|
143
|
+
|
144
|
+
# remove all that are to exclude
|
145
|
+
if Project.manifest.exclude then
|
146
|
+
Project.manifest.exclude.map { |glob| cands -= Dir[glob] }
|
147
|
+
end
|
148
|
+
# remove all directories
|
149
|
+
cands - Dir['**/*/'].map { |e| e.chop }
|
150
|
+
end
|
151
|
+
|
152
|
+
def has_version?(having_version, minimal_version, maximal_version=nil)
|
153
|
+
a = having_version.split(/\./).map { |e| e.to_i }
|
154
|
+
b = minimal_version.split(/\./).map { |e| e.to_i }
|
155
|
+
c = maximal_version && maximal_version.split(/\./).map { |e| e.to_i }
|
156
|
+
c ? a.between?(b,c) : a >= b
|
157
|
+
end
|
158
|
+
|
159
|
+
# requires that 'readme' is a file in markdown format and that Markdown exists
|
160
|
+
def extract_summary(file=Project.meta.readme)
|
161
|
+
return nil unless File.readable?(file)
|
162
|
+
case File.extname(file)
|
163
|
+
when '.rdoc'
|
164
|
+
File.read('README.rdoc')[/^(\s*=+)\s+SUMMARY\b.*?\n(.*?)\n\1/m, 2]
|
165
|
+
when '.markdown'
|
166
|
+
return nil unless lib?(%w'hpricot markdown', "Requires %s to extract the summary")
|
167
|
+
html = Markdown.new(File.read(file)).to_html
|
168
|
+
(Hpricot(html)/"h2[text()=Summary]").first.next_sibling.inner_text.strip
|
169
|
+
end
|
170
|
+
rescue => e
|
171
|
+
warn "Failed extracting the summary: #{e}"
|
172
|
+
nil
|
173
|
+
end
|
174
|
+
|
175
|
+
# requires that 'readme' is a file in markdown format and that Markdown exists
|
176
|
+
def extract_description(file=Project.meta.readme)
|
177
|
+
return nil unless File.readable?(file)
|
178
|
+
case File.extname(file)
|
179
|
+
when '.rdoc'
|
180
|
+
File.read('README.rdoc')[/^(\s*=+)\s+DESCRIPTION\b.*?\n(.*?)\n\1/m, 2]
|
181
|
+
when '.markdown'
|
182
|
+
return nil unless lib?('hpricot markdown', "Requires %s to extract the summary")
|
183
|
+
html = Markdown.new(File.read(file)).to_html
|
184
|
+
(Hpricot(html)/"h2[text()=Description]").first.next_sibling.inner_text.strip
|
185
|
+
end
|
186
|
+
rescue => e
|
187
|
+
warn "Failed extracting the description: #{e}"
|
188
|
+
nil
|
189
|
+
end
|
190
|
+
|
191
|
+
# Create a Gem::Specification from Project.gem data.
|
192
|
+
def gem_spec(from)
|
193
|
+
Gem::Specification.new do |s|
|
194
|
+
s.name = from.name
|
195
|
+
s.version = from.version
|
196
|
+
s.summary = from.summary
|
197
|
+
s.authors = from.authors
|
198
|
+
s.email = from.email
|
199
|
+
s.homepage = from.homepage
|
200
|
+
s.rubyforge_project = from.rubyforge_project
|
201
|
+
s.description = from.description
|
202
|
+
s.required_ruby_version = from.required_ruby_version if from.required_ruby_version
|
203
|
+
|
204
|
+
from.dependencies.each do |dep|
|
205
|
+
s.add_dependency(*dep)
|
206
|
+
end if from.dependencies
|
207
|
+
|
208
|
+
s.files = from.files
|
209
|
+
s.executables = from.executables.map {|fn| File.basename(fn)}
|
210
|
+
s.extensions = from.extensions
|
211
|
+
|
212
|
+
s.bindir = from.bin_dir
|
213
|
+
s.require_paths = from.require_paths if from.require_paths
|
214
|
+
|
215
|
+
s.rdoc_options = from.rdoc_options
|
216
|
+
s.extra_rdoc_files = from.extra_rdoc_files
|
217
|
+
s.has_rdoc = from.has_rdoc
|
218
|
+
|
219
|
+
if from.test_file then
|
220
|
+
s.test_file = from.test_file
|
221
|
+
elsif from.test_files
|
222
|
+
s.test_files = from.test_files
|
223
|
+
end
|
224
|
+
|
225
|
+
# Do any extra stuff the user wants
|
226
|
+
from.extras.each do |msg, val|
|
227
|
+
case val
|
228
|
+
when Proc
|
229
|
+
val.call(s.send(msg))
|
230
|
+
else
|
231
|
+
s.send "#{msg}=", val
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end # Gem::Specification.new
|
235
|
+
end
|
236
|
+
|
237
|
+
# Returns a good name for the gem-file using the spec and the package-name.
|
238
|
+
def gem_file(spec, package_name)
|
239
|
+
if spec.platform == Gem::Platform::RUBY then
|
240
|
+
"#{package_name}.gem"
|
241
|
+
else
|
242
|
+
"#{package_name}-#{spec.platform}.gem"
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end # BoneSplitter
|
@@ -0,0 +1,69 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2007-2008 by Stefan Rusterholz.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#++
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
# fix pre-rubygems 1.3 nuisance
|
10
|
+
begin
|
11
|
+
require 'rubygems'
|
12
|
+
module Kernel
|
13
|
+
private :gem
|
14
|
+
private :require
|
15
|
+
private :open
|
16
|
+
end
|
17
|
+
rescue LoadError; end
|
18
|
+
|
19
|
+
# FIXME: add a method_added hook to Object and Kernel to keep ProjectClass clean.
|
20
|
+
|
21
|
+
# This class is not written for long running scripts as it leaks symbols.
|
22
|
+
# It is openstructlike, but a bit more lightweight and blankslate so any method will work
|
23
|
+
# You can set values to procs and call __finalize__ to get them replaced by the value
|
24
|
+
# returned by the proc.
|
25
|
+
class ProjectClass
|
26
|
+
names = public_instance_methods - %w[initialize inspect __id__ __send__]
|
27
|
+
names.each { |m| undef_method m }
|
28
|
+
|
29
|
+
attr_reader :__hash__
|
30
|
+
|
31
|
+
def initialize(values=nil)
|
32
|
+
@__hash__ = values || {}
|
33
|
+
end
|
34
|
+
|
35
|
+
def [](key)
|
36
|
+
@__hash__[key.to_sym]
|
37
|
+
end
|
38
|
+
|
39
|
+
def []=(key,value)
|
40
|
+
@__hash__[key.to_sym] = value
|
41
|
+
end
|
42
|
+
|
43
|
+
# All values that respond to .call are replaced by the value
|
44
|
+
# returned when calling.
|
45
|
+
def __finalize__
|
46
|
+
@__hash__.each { |k,v|
|
47
|
+
@__hash__[k] = v.call if v.respond_to?(:call)
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
def method_missing(name, *args)
|
52
|
+
case args.length
|
53
|
+
when 0
|
54
|
+
if key = name.to_s[/^(.*)\?$/, 1] then
|
55
|
+
!!@__hash__[key.to_sym]
|
56
|
+
else
|
57
|
+
@__hash__[name]
|
58
|
+
end
|
59
|
+
when 1
|
60
|
+
if key = name.to_s[/^(.*)=$/, 1] then
|
61
|
+
@__hash__[key.to_sym] = args.first
|
62
|
+
else
|
63
|
+
super
|
64
|
+
end
|
65
|
+
else
|
66
|
+
super
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2007 by Stefan Rusterholz.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#++
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
namespace :copyright do
|
10
|
+
task :update do
|
11
|
+
manifest().each { |file|
|
12
|
+
data = File.read(file).gsub(/(copyright \d+)(?:(\s*-\s*)\d+)?( by)/i) {
|
13
|
+
copyright = "#{$1}#{$2 || '-'}#{Time.now.year}#{$3}"
|
14
|
+
puts "#{file}: replacing #{$&.inspect} with #{copyright.inspect}"
|
15
|
+
copyright
|
16
|
+
}
|
17
|
+
File.open(file, "wb") { |fh| fh.write(data) }
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end # namespace :copyright
|
21
|
+
|
22
|
+
desc 'Alias to copyright:update'
|
23
|
+
task :copyright => 'copyright:update'
|
24
|
+
|
data/rake/tasks/gem.rake
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2007-2008 by Stefan Rusterholz.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#++
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
namespace :gem do
|
10
|
+
|
11
|
+
# No data in Project
|
12
|
+
if Project.gem.nil? then
|
13
|
+
task :missing_project do
|
14
|
+
abort("No instructions in Project to run the gem tasks")
|
15
|
+
end
|
16
|
+
|
17
|
+
task :package => :missing_project
|
18
|
+
task :info => :missing_project
|
19
|
+
task :install => :missing_project
|
20
|
+
task :uninstall => :missing_project
|
21
|
+
task :cleanup => :missing_project
|
22
|
+
task :clobber
|
23
|
+
|
24
|
+
# Rubygems is not installed
|
25
|
+
elsif !lib?('rubygems') then
|
26
|
+
task :missing_rubygems do
|
27
|
+
abort("Requires rubygems to run")
|
28
|
+
end
|
29
|
+
|
30
|
+
task :package => :missing_rubygems
|
31
|
+
task :info => :missing_rubygems
|
32
|
+
task :install => :missing_rubygems
|
33
|
+
task :uninstall => :missing_rubygems
|
34
|
+
task :cleanup => :missing_rubygems
|
35
|
+
task :clobber
|
36
|
+
|
37
|
+
# Prerequisites met
|
38
|
+
else
|
39
|
+
Project.gem.name ||= Project.meta.name
|
40
|
+
Project.gem.version ||= Project.meta.version
|
41
|
+
Project.gem.summary ||= Project.meta.summary
|
42
|
+
Project.gem.description ||= Project.meta.description
|
43
|
+
Project.gem.authors ||= Project.meta.authors || Array(Project.meta.author)
|
44
|
+
Project.gem.email ||= Project.meta.email
|
45
|
+
Project.gem.homepage ||= Project.meta.website
|
46
|
+
Project.gem.rubyforge_project ||= (Project.rubyforge && Project.rubyforge.name) || Project.meta.name
|
47
|
+
Project.gem.files ||= manifest()
|
48
|
+
Project.gem.executables ||= Array(Project.gem.executable)
|
49
|
+
Project.gem.extensions ||= Project.gem.files.grep %r/extconf\.rb$/
|
50
|
+
Project.gem.bin_dir ||= "bin"
|
51
|
+
|
52
|
+
Project.gem.rdoc_options ||= Project.rdoc && Project.rdoc.options
|
53
|
+
Project.gem.extra_rdoc_files ||= Project.rdoc && Project.rdoc.extra_files
|
54
|
+
Project.gem.rdoc_options ||= Project.rdoc && Project.rdoc.options
|
55
|
+
Project.gem.__finalize__
|
56
|
+
Project.gem.spec = gem_spec(Project.gem)
|
57
|
+
|
58
|
+
# task gem:package
|
59
|
+
dependency 'rake/gempackagetask', 'Requires rake/gempackagetask'
|
60
|
+
pkg = Rake::GemPackageTask.new(Project.gem.spec) do |pkg|
|
61
|
+
pkg.need_tar = Project.gem.need_tar
|
62
|
+
pkg.need_zip = Project.gem.need_zip
|
63
|
+
pkg.package_files = Project.gem.files if Project.gem.files
|
64
|
+
end
|
65
|
+
# Rake::Task['gem:package'].instance_variable_set(:@full_comment, nil)
|
66
|
+
|
67
|
+
Project.gem.gem_file ||= gem_file(Project.gem.spec, pkg.package_name)
|
68
|
+
|
69
|
+
desc 'Show information about the gem'
|
70
|
+
task :info do
|
71
|
+
puts "package_files:"
|
72
|
+
puts Project.gem.files
|
73
|
+
puts Project.gem.spec.to_ruby
|
74
|
+
end
|
75
|
+
|
76
|
+
desc "Build the gem file #{Project.gem.gem_file}"
|
77
|
+
task :package => %W[#{pkg.package_dir}/#{Project.gem.gem_file}]
|
78
|
+
|
79
|
+
file "#{pkg.package_dir}/#{Project.gem.gem_file}" => [pkg.package_dir, *Project.gem.files] do
|
80
|
+
when_writing("Creating GEM") {
|
81
|
+
Gem::Builder.new(Project.gem.spec).build
|
82
|
+
verbose(true) {
|
83
|
+
mv Project.gem.gem_file, "#{pkg.package_dir}/#{Project.gem.gem_file}"
|
84
|
+
}
|
85
|
+
}
|
86
|
+
end
|
87
|
+
|
88
|
+
desc 'Install the gem'
|
89
|
+
task :install => [:clobber, 'gem:package'] do
|
90
|
+
sh "#{bin.sudo unless File.writable?(Gem.dir)} #{bin.gem} install --no-update-sources pkg/#{Project.gem.spec.full_name}"
|
91
|
+
end
|
92
|
+
|
93
|
+
desc 'Reinstall the gem'
|
94
|
+
task :reinstall => [:uninstall, :install]
|
95
|
+
|
96
|
+
desc 'Uninstall the gem'
|
97
|
+
task :uninstall do
|
98
|
+
if installed_list = Gem.source_index.find_name(Project.gem.name) then
|
99
|
+
installed_versions = installed_list.map { |s| s.version.to_s }
|
100
|
+
if installed_versions.include?(Project.gem.version) then
|
101
|
+
sh "#{bin.sudo unless File.writable?(Gem.dir)} #{bin.gem} uninstall --version '#{Project.gem.version}' --ignore-dependencies --executables #{Project.gem.name}"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
desc 'Cleanup the gem'
|
107
|
+
task :cleanup do
|
108
|
+
abort("Gem name not set in Project.gem") unless Project.gem.name
|
109
|
+
sh "#{bin.sudo unless File.writable?(Gem.dir)} #{bin.gem} cleanup #{Project.gem.name}"
|
110
|
+
end
|
111
|
+
|
112
|
+
task :clobber => :clobber_package
|
113
|
+
end
|
114
|
+
end # namespace :gem
|
115
|
+
|
116
|
+
desc 'Alias to gem:package'
|
117
|
+
task :gem => 'gem:package'
|
118
|
+
task :clobber => 'gem:clobber'
|
119
|
+
|