doubleshot 0.1.0-java
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/Doubleshot +33 -0
- data/MIT-LICENSE +20 -0
- data/README.textile +208 -0
- data/bin/doubleshot +7 -0
- data/ext/java/Empty.java +0 -0
- data/lib/doubleshot.rb +37 -0
- data/lib/doubleshot/cli.rb +84 -0
- data/lib/doubleshot/cli/options.rb +34 -0
- data/lib/doubleshot/commands/build.rb +34 -0
- data/lib/doubleshot/commands/gem.rb +39 -0
- data/lib/doubleshot/commands/init.rb +129 -0
- data/lib/doubleshot/commands/install.rb +35 -0
- data/lib/doubleshot/commands/jar.rb +7 -0
- data/lib/doubleshot/commands/test.rb +119 -0
- data/lib/doubleshot/compiler.rb +47 -0
- data/lib/doubleshot/configuration.rb +361 -0
- data/lib/doubleshot/configuration/source_locations.rb +59 -0
- data/lib/doubleshot/dependencies.rb +31 -0
- data/lib/doubleshot/dependencies/dependency.rb +38 -0
- data/lib/doubleshot/dependencies/dependency_list.rb +60 -0
- data/lib/doubleshot/dependencies/gem_dependency.rb +8 -0
- data/lib/doubleshot/dependencies/gem_dependency_list.rb +10 -0
- data/lib/doubleshot/dependencies/jar_dependency.rb +8 -0
- data/lib/doubleshot/dependencies/jar_dependency_list.rb +10 -0
- data/lib/doubleshot/jar.rb +51 -0
- data/lib/doubleshot/readonly_collection.rb +32 -0
- data/lib/doubleshot/setup.rb +49 -0
- data/lib/ruby/blank.rb +132 -0
- data/lib/ruby/gem/requirement.rb +5 -0
- data/lib/ruby/kernel.rb +8 -0
- data/lib/ruby/pathname.rb +11 -0
- data/lib/ruby/string.rb +42 -0
- data/lib/ruby/time.rb +8 -0
- data/test/compiler_spec.rb +44 -0
- data/test/configuration/source_locations_spec.rb +98 -0
- data/test/configuration_spec.rb +295 -0
- data/test/dependencies/dependency_list_spec.rb +73 -0
- data/test/dependencies/dependency_spec.rb +49 -0
- data/test/dependencies/gem_dependency_list_spec.rb +7 -0
- data/test/dependencies/gem_dependency_spec.rb +7 -0
- data/test/dependencies/jar_dependency_list_spec.rb +7 -0
- data/test/dependencies/jar_dependency_spec.rb +7 -0
- data/test/dependencies_spec.rb +42 -0
- data/test/doubleshot_spec.rb +51 -0
- data/test/helper.rb +18 -0
- data/test/readonly_collection_spec.rb +45 -0
- metadata +300 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
class Doubleshot::CLI::Commands::Gem < Doubleshot::CLI
|
2
|
+
|
3
|
+
def self.summary
|
4
|
+
<<-EOS.margin
|
5
|
+
Package your project as a Rubygem, bundling any
|
6
|
+
JAR dependencies and Java classes in with the distribution.
|
7
|
+
EOS
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.options
|
11
|
+
Options.new do |options|
|
12
|
+
options.banner = "Usage: doubleshot gem"
|
13
|
+
options.separator ""
|
14
|
+
options.separator "Options"
|
15
|
+
|
16
|
+
options.test = true
|
17
|
+
options.on "--no-test", "Disable testing as a build prerequisite." do
|
18
|
+
options.test = false
|
19
|
+
end
|
20
|
+
|
21
|
+
options.separator ""
|
22
|
+
options.separator "Summary: #{summary}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.start(args)
|
27
|
+
options = self.options.parse!(args)
|
28
|
+
|
29
|
+
# TODO:
|
30
|
+
# compile Java
|
31
|
+
# download Jars and add them to the gemspec require_paths (I THINK).
|
32
|
+
config = Doubleshot::current.config
|
33
|
+
|
34
|
+
# TODO: This is version specific since in HEAD they've changed this to Gem::Package::build.
|
35
|
+
::Gem::Builder.new(config.gemspec).build
|
36
|
+
|
37
|
+
return true
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
class Doubleshot::CLI::Commands::Init < Doubleshot::CLI
|
2
|
+
|
3
|
+
def self.summary
|
4
|
+
<<-EOS.margin
|
5
|
+
Generate a Doubleshot file for your project.
|
6
|
+
EOS
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.options
|
10
|
+
Options.new do |options|
|
11
|
+
options.banner = "Usage: doubleshot init [PATH]"
|
12
|
+
options.separator ""
|
13
|
+
options.separator " [PATH] The path to your project directory."
|
14
|
+
options.separator " DEFAULT: Current working directory."
|
15
|
+
options.separator ""
|
16
|
+
options.separator "Summary: #{summary}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.start(args)
|
21
|
+
session = new(args)
|
22
|
+
if session.doubleshot_file.exist?
|
23
|
+
return puts <<-EOS.margin
|
24
|
+
ERROR: A Doubleshot file already exists.
|
25
|
+
Rename or delete it to initialize a new one.
|
26
|
+
EOS
|
27
|
+
end
|
28
|
+
session.import_gemspec!
|
29
|
+
session.mark_gemspec_for_deletion!
|
30
|
+
session.generate_doubleshot_file!
|
31
|
+
|
32
|
+
puts <<-EOS.margin
|
33
|
+
We have created a Doubleshot file for your project.
|
34
|
+
|
35
|
+
Please review it and make changes as you see fit. It will
|
36
|
+
be used for all the things.
|
37
|
+
EOS
|
38
|
+
return true
|
39
|
+
end
|
40
|
+
|
41
|
+
def initialize(args)
|
42
|
+
@path = Pathname(args.empty? ? "." : args.first)
|
43
|
+
@config = Doubleshot::Configuration.new
|
44
|
+
end
|
45
|
+
|
46
|
+
def doubleshot_file
|
47
|
+
Pathname(@path + "Doubleshot")
|
48
|
+
end
|
49
|
+
|
50
|
+
def gemspec
|
51
|
+
@gemspec ||= Pathname::glob(@path + "*.gemspec").first
|
52
|
+
end
|
53
|
+
|
54
|
+
def import_gemspec!
|
55
|
+
original = gemspec ? eval_gemspec(gemspec.read) : ::Gem::Specification.new
|
56
|
+
|
57
|
+
@config.gemspec do |spec|
|
58
|
+
spec.name = default original.name, "THE PROJECT NAME"
|
59
|
+
spec.summary = default original.summary, "SUMMARIZE ME"
|
60
|
+
spec.description = default original.description, "A VERY DETAILED DESCRIPTION"
|
61
|
+
spec.author = default original.author, "WHOAMI"
|
62
|
+
spec.homepage = default original.homepage, "I AM FROM THE INTERNET"
|
63
|
+
spec.email = default original.email, "ME@EXAMPLE.COM"
|
64
|
+
spec.version = default original.version, "9000.1"
|
65
|
+
spec.license = default original.license, "MIT-LICENSE"
|
66
|
+
spec.executables = original.executables
|
67
|
+
end
|
68
|
+
|
69
|
+
original.runtime_dependencies.each do |dependency|
|
70
|
+
@config.gem dependency.name, *dependency.requirements_list
|
71
|
+
end
|
72
|
+
|
73
|
+
@config.development do
|
74
|
+
original.development_dependencies.each do |dependency|
|
75
|
+
@config.gem dependency.name, *dependency.requirements_list
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def eval_gemspec(contents)
|
81
|
+
puts "Importing Gemspec..."
|
82
|
+
begin
|
83
|
+
::Gem::Specification.from_yaml(contents)
|
84
|
+
# Raises ArgumentError if the file is not valid YAML
|
85
|
+
rescue ArgumentError, SyntaxError, ::Gem::EndOfYAMLException, ::Gem::Exception
|
86
|
+
begin
|
87
|
+
eval(contents, Doubleshot::CLI::binding)
|
88
|
+
rescue LoadError, SyntaxError => e
|
89
|
+
original_line = e.backtrace.find { |line| line.include?(path.to_s) }
|
90
|
+
msg = "There was a #{e.class} while evaluating #{gemspec_pathname.basename}: \n#{e.message}"
|
91
|
+
msg << " from\n #{original_line}" if original_line
|
92
|
+
msg << "\n"
|
93
|
+
raise GemspecError, msg
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def mark_gemspec_for_deletion!
|
99
|
+
if gemspec
|
100
|
+
delete_me = gemspec.basename.to_s + ".DELETE_ME"
|
101
|
+
gemspec.rename(delete_me)
|
102
|
+
puts <<-EOS.margin, "", ""
|
103
|
+
|
104
|
+
IMPORTANT: We have renamed your gemspec to:
|
105
|
+
|
106
|
+
#{delete_me}
|
107
|
+
|
108
|
+
Please delete this file after you have reviewed your Doubleshot file.
|
109
|
+
It cannot be used to distribute your project. A valid gemspec will be
|
110
|
+
generated for you during the build process so that JAR, Gem, and compiled
|
111
|
+
sources are included in your distribution.
|
112
|
+
|
113
|
+
DELETE YOUR GEMSPEC!
|
114
|
+
EOS
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def generate_doubleshot_file!
|
119
|
+
doubleshot_file.open("w+") do |file|
|
120
|
+
file << @config.to_ruby
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
private
|
125
|
+
def default(value, default_value)
|
126
|
+
value.blank? ? default_value : value
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class Doubleshot::CLI::Commands::Install < Doubleshot::CLI
|
2
|
+
|
3
|
+
def self.summary
|
4
|
+
<<-EOS.margin
|
5
|
+
Install your project as a Rubygem.
|
6
|
+
EOS
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.options
|
10
|
+
Options.new do |options|
|
11
|
+
options.banner = "Usage: doubleshot install"
|
12
|
+
options.separator ""
|
13
|
+
options.separator "Options"
|
14
|
+
|
15
|
+
options.test = true
|
16
|
+
options.on "--no-test", "Disable testing as a build prerequisite." do
|
17
|
+
options.test = false
|
18
|
+
end
|
19
|
+
|
20
|
+
options.separator ""
|
21
|
+
options.separator "Summary: #{summary}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.start(args)
|
26
|
+
Doubleshot::CLI::Commands::Gem.start(args)
|
27
|
+
|
28
|
+
require "rubygems/dependency_installer"
|
29
|
+
|
30
|
+
installer = ::Gem::DependencyInstaller.new
|
31
|
+
installer.install Doubleshot::current.config.gemspec.file_name
|
32
|
+
|
33
|
+
return true
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
class Doubleshot::CLI::Commands::Test < Doubleshot::CLI
|
2
|
+
def self.summary
|
3
|
+
<<-EOS.margin
|
4
|
+
A test harness that watches files, builds your
|
5
|
+
source, and executes tests based on filename
|
6
|
+
conventions. The location of your tests is
|
7
|
+
determined by the 'config.source.tests'
|
8
|
+
attribute of your Doubleshot configuration.
|
9
|
+
EOS
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.options
|
13
|
+
Options.new do |options|
|
14
|
+
options.banner = "Usage: doubleshot test"
|
15
|
+
|
16
|
+
options.separator ""
|
17
|
+
options.separator "Summary: #{summary}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.start(args)
|
22
|
+
require "listen"
|
23
|
+
watcher = new(Doubleshot::current.config)
|
24
|
+
watcher.run
|
25
|
+
end
|
26
|
+
|
27
|
+
def initialize(config)
|
28
|
+
@config = config
|
29
|
+
@interrupted = false
|
30
|
+
|
31
|
+
# Hit Ctrl-C once to re-run all specs; twice to exit the program.
|
32
|
+
Signal.trap("INT") do
|
33
|
+
if @interrupted
|
34
|
+
puts "\nShutting down..."
|
35
|
+
exit 0
|
36
|
+
else
|
37
|
+
@interrupted = true
|
38
|
+
run_all_specs
|
39
|
+
@interrupted = false
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def run
|
45
|
+
# Output here just so you know when changes will be
|
46
|
+
# picked up after you start the program.
|
47
|
+
puts "Listening for changes..."
|
48
|
+
listener.start
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
def listener
|
53
|
+
# This creates a MultiListener
|
54
|
+
Listen.to(@config.source.tests.to_s, @config.source.ruby.to_s).change do |modified, added, removed|
|
55
|
+
modified.each do |location|
|
56
|
+
path = Pathname(location)
|
57
|
+
next unless path.extname == ".rb"
|
58
|
+
|
59
|
+
test = if path.child_of? @config.source.tests
|
60
|
+
path
|
61
|
+
else
|
62
|
+
relative_path = path.relative_path_from(@config.source.ruby.expand_path)
|
63
|
+
matcher = relative_path.sub(/(\w+)\.rb/, "\\1_{spec,test}.rb")
|
64
|
+
matchers = [ matcher, Pathname(matcher.to_s.split("/")[1..-1].join("/")) ]
|
65
|
+
|
66
|
+
match = matchers.detect do |matcher|
|
67
|
+
if match = Pathname::glob(@config.source.tests + matcher).first
|
68
|
+
break match
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
if test && test.exist?
|
74
|
+
duration = Time::measure do
|
75
|
+
puts "\n --- Running test for #{test.to_s} ---\n\n"
|
76
|
+
|
77
|
+
org.jruby.Ruby.newInstance.executeScript <<-RUBY, test.to_s
|
78
|
+
begin
|
79
|
+
require #{test.to_s.inspect}
|
80
|
+
MiniTest::Unit.new._run
|
81
|
+
rescue java.lang.Throwable, Exception => e
|
82
|
+
puts e.to_s, e.backtrace.join("\n")
|
83
|
+
end
|
84
|
+
RUBY
|
85
|
+
end
|
86
|
+
|
87
|
+
puts "Completed in #{duration}s"
|
88
|
+
else
|
89
|
+
puts "\nNo matching test for #{path.relative_path_from(@config.source.ruby.expand_path).to_s}"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def run_all_specs
|
96
|
+
duration = Time::measure do
|
97
|
+
|
98
|
+
puts "\n --- Running all tests ---\n\n"
|
99
|
+
|
100
|
+
script = <<-RUBY
|
101
|
+
begin
|
102
|
+
#{
|
103
|
+
Pathname::glob(@config.source.tests + "**/*_{spec,test}.rb").map do |path|
|
104
|
+
"require #{path.to_s.inspect}"
|
105
|
+
end.join("\n")
|
106
|
+
}
|
107
|
+
MiniTest::Unit.new._run
|
108
|
+
rescue java.lang.Throwable, Exception => e
|
109
|
+
puts e.to_s, e.backtrace.join("\n")
|
110
|
+
end
|
111
|
+
RUBY
|
112
|
+
# puts "SCRIPT:", script
|
113
|
+
org.jruby.Ruby.newInstance.executeScript script, "all-specs"
|
114
|
+
end
|
115
|
+
|
116
|
+
puts "Completed in #{duration}s"
|
117
|
+
end
|
118
|
+
|
119
|
+
end # class Doubleshot::CLI::Commands::Test < Doubleshot::CLI
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require "java"
|
2
|
+
require "ant"
|
3
|
+
|
4
|
+
class Doubleshot
|
5
|
+
class Compiler
|
6
|
+
|
7
|
+
def initialize(source, target)
|
8
|
+
@source = Pathname(source.to_s)
|
9
|
+
@target = Pathname(target.to_s)
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_reader :source, :target
|
13
|
+
|
14
|
+
def build!
|
15
|
+
@target.mkdir unless @target.exist?
|
16
|
+
|
17
|
+
# The JRuby ant integration throws JRuby Persistence
|
18
|
+
# warnings that you can't supress, so we run it
|
19
|
+
# inside of a Kernel#silence block.
|
20
|
+
silence do
|
21
|
+
ant.path id: "classpath" do
|
22
|
+
fileset dir: @target.to_s
|
23
|
+
|
24
|
+
$CLASSPATH.map do |path|
|
25
|
+
Pathname path.to_s.gsub(/file\:/, "")
|
26
|
+
end.select do |path|
|
27
|
+
path.exist?
|
28
|
+
end.map do |path|
|
29
|
+
(path.directory? ? path : path.dirname).to_s.ensure_ends_with("/")
|
30
|
+
end.uniq.each do |path|
|
31
|
+
fileset dir: path
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
ant.javac srcdir: @source.to_s,
|
36
|
+
destdir: @target.to_s,
|
37
|
+
debug: "yes",
|
38
|
+
includeantruntime: "no",
|
39
|
+
classpathref: "classpath"
|
40
|
+
end
|
41
|
+
|
42
|
+
p $CLASSPATH
|
43
|
+
$CLASSPATH << @target.to_s unless $CLASSPATH.include?(@target.to_s)
|
44
|
+
end
|
45
|
+
|
46
|
+
end # class Compiler
|
47
|
+
end # class Doubleshot
|
@@ -0,0 +1,361 @@
|
|
1
|
+
require "doubleshot/dependencies"
|
2
|
+
require "doubleshot/configuration/source_locations"
|
3
|
+
|
4
|
+
class Doubleshot
|
5
|
+
class Configuration
|
6
|
+
|
7
|
+
DEFAULT_PATHS = [ "Doubleshot", "*LICENSE*", "README*" ]
|
8
|
+
DEFAULT_WHITELIST = %w[
|
9
|
+
.rb .java .js
|
10
|
+
.yaml .yml .json .xml .properties
|
11
|
+
.css .less .sass .scss
|
12
|
+
.erb .haml .rxml .builder .html
|
13
|
+
]
|
14
|
+
|
15
|
+
SOURCE_RUBY_MESSAGE = <<-EOS.margin
|
16
|
+
# Relative path to the folder containing your
|
17
|
+
# Ruby source code (.rb files).
|
18
|
+
# The default is "lib".
|
19
|
+
EOS
|
20
|
+
|
21
|
+
SOURCE_JAVA_MESSAGE = <<-EOS.margin
|
22
|
+
# Relative path to the folder containing your
|
23
|
+
# Java source code (.java files).
|
24
|
+
# The default is "ext/java".
|
25
|
+
EOS
|
26
|
+
|
27
|
+
SOURCE_TESTS_MESSAGE = <<-EOS.margin
|
28
|
+
# Relative path to the folder containing your
|
29
|
+
# tests. This feature is used when running
|
30
|
+
# doubleshot test
|
31
|
+
# Tests are assumed to be written in Ruby
|
32
|
+
# exclusively. Java test frameworks are not
|
33
|
+
# supported.
|
34
|
+
# This value is optional. The default is "test".
|
35
|
+
EOS
|
36
|
+
|
37
|
+
TARGET_MESSAGE = <<-EOS.margin
|
38
|
+
# Relative path to the folder containing the
|
39
|
+
# compiled Java files (.class files).
|
40
|
+
# The default is "target".
|
41
|
+
EOS
|
42
|
+
|
43
|
+
WHITELIST_MESSAGE = <<-EOS.margin
|
44
|
+
# List of file extensions within source folders
|
45
|
+
# that will be included during packaging.
|
46
|
+
# Does NOT override defaults, but adds to them.
|
47
|
+
# The default list can be found in
|
48
|
+
# Doubleshot::Configuration::DEFAULT_WHITELIST.
|
49
|
+
EOS
|
50
|
+
|
51
|
+
|
52
|
+
GEMSPEC_MESSAGE = <<-EOS.margin
|
53
|
+
# A subset of Gem::Specification compatible
|
54
|
+
# with Doubleshot. Since Doubleshot manages
|
55
|
+
# your Rubygems dependencies, and what files
|
56
|
+
# are included in your build, those options
|
57
|
+
# are not applicable (and will be discarded if
|
58
|
+
# provided).
|
59
|
+
EOS
|
60
|
+
|
61
|
+
GEM_DEPENDENCY_MESSAGE = <<-EOS.margin
|
62
|
+
# Add your Gem dependencies here using similar
|
63
|
+
# syntax to a gemspec, except your method is
|
64
|
+
# "gem" instead of "add_runtime_dependency".
|
65
|
+
EOS
|
66
|
+
|
67
|
+
JAR_DEPENDENCY_MESSAGE = <<-EOS.margin
|
68
|
+
# Add your JAR dependencies using Buildr
|
69
|
+
# dependency formatting (available as a
|
70
|
+
# copy-and-paste option on most Maven search
|
71
|
+
# repositories).
|
72
|
+
EOS
|
73
|
+
|
74
|
+
DEVELOPMENT_MESSAGE = <<-EOS.margin
|
75
|
+
# Add your Gem and JAR development dependencies
|
76
|
+
# similar to above. By default "doubleshot" is
|
77
|
+
# added as a development dependency to your gemspec.
|
78
|
+
# That's the equivalent of:
|
79
|
+
#
|
80
|
+
# config.development do
|
81
|
+
# config.gem "doubleshot"
|
82
|
+
# end
|
83
|
+
#
|
84
|
+
# NOTE: The above won't appear in your Doubleshot
|
85
|
+
# file as it's added during the build process for you.
|
86
|
+
EOS
|
87
|
+
|
88
|
+
def initialize
|
89
|
+
@defaults = {}
|
90
|
+
@gemspec = Gem::Specification.new
|
91
|
+
@gemspec.platform = Gem::Platform.new("java")
|
92
|
+
@source = SourceLocations.new
|
93
|
+
@target = default :target, Pathname("target")
|
94
|
+
|
95
|
+
@runtime_dependencies = Dependencies.new
|
96
|
+
@development_dependencies = Dependencies.new
|
97
|
+
@development_environment = false
|
98
|
+
|
99
|
+
@paths = default :paths, DEFAULT_PATHS.dup
|
100
|
+
@whitelist = default :whitelist, DEFAULT_WHITELIST.dup
|
101
|
+
end
|
102
|
+
|
103
|
+
def source
|
104
|
+
@source
|
105
|
+
end
|
106
|
+
|
107
|
+
def target
|
108
|
+
@target
|
109
|
+
end
|
110
|
+
|
111
|
+
def target=(path)
|
112
|
+
@target = Pathname(path.to_s)
|
113
|
+
end
|
114
|
+
|
115
|
+
def whitelist(extname)
|
116
|
+
@whitelist << extname.ensure_starts_with(".")
|
117
|
+
self
|
118
|
+
end
|
119
|
+
|
120
|
+
def development
|
121
|
+
if block_given?
|
122
|
+
@development_environment = true
|
123
|
+
yield
|
124
|
+
@development_environment = false
|
125
|
+
end
|
126
|
+
@development_dependencies
|
127
|
+
end
|
128
|
+
|
129
|
+
def gem(name, *requirements)
|
130
|
+
dependencies = @development_environment ?
|
131
|
+
@development_dependencies :
|
132
|
+
@runtime_dependencies
|
133
|
+
|
134
|
+
dependency = dependencies.gems.fetch(name)
|
135
|
+
dependencies.gems.add(dependency)
|
136
|
+
|
137
|
+
requirements.each do |requirement|
|
138
|
+
dependency.add_requirement(requirement)
|
139
|
+
end
|
140
|
+
|
141
|
+
dependency
|
142
|
+
end
|
143
|
+
|
144
|
+
def runtime
|
145
|
+
@runtime_dependencies
|
146
|
+
end
|
147
|
+
|
148
|
+
def paths
|
149
|
+
ReadonlyCollection.new @paths
|
150
|
+
end
|
151
|
+
|
152
|
+
def add_path(path)
|
153
|
+
@paths << path
|
154
|
+
self
|
155
|
+
end
|
156
|
+
|
157
|
+
def eql?(other)
|
158
|
+
other.is_a?(self.class) &&
|
159
|
+
other.target == target &&
|
160
|
+
other.source == source &&
|
161
|
+
other.runtime == runtime &&
|
162
|
+
other.development == development &&
|
163
|
+
other.paths == paths &&
|
164
|
+
other.gemspec == gemspec
|
165
|
+
end
|
166
|
+
alias :== :eql?
|
167
|
+
|
168
|
+
def gemspec(&b)
|
169
|
+
if b
|
170
|
+
yield @gemspec
|
171
|
+
else
|
172
|
+
@gemspec.rdoc_options = rdoc_options
|
173
|
+
@gemspec.require_paths = [ @source.ruby.to_s ]
|
174
|
+
|
175
|
+
test_files = []
|
176
|
+
@source.tests.find do |path|
|
177
|
+
test_files << path.to_s if path.file?
|
178
|
+
end
|
179
|
+
@gemspec.test_files = test_files
|
180
|
+
|
181
|
+
files = []
|
182
|
+
|
183
|
+
@paths.each do |path|
|
184
|
+
Pathname::glob(path).each do |match|
|
185
|
+
files << match.to_s if match.file?
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
@source.ruby.find do |path|
|
190
|
+
files << path.to_s if path.file? && @whitelist.include?(path.extname)
|
191
|
+
end
|
192
|
+
|
193
|
+
@source.java.find do |path|
|
194
|
+
files << path.to_s if path.file? && @whitelist.include?(path.extname)
|
195
|
+
end
|
196
|
+
|
197
|
+
if @target.exist?
|
198
|
+
@target.find do |path|
|
199
|
+
files << path.to_s if path.file?
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
@gemspec.files.concat(files)
|
204
|
+
|
205
|
+
@runtime_dependencies.gems.each do |dependency|
|
206
|
+
@gemspec.add_runtime_dependency dependency.name, *dependency.requirements
|
207
|
+
end
|
208
|
+
|
209
|
+
@development_dependencies.gems.each do |dependency|
|
210
|
+
@gemspec.add_development_dependency dependency.name, *dependency.requirements
|
211
|
+
end
|
212
|
+
|
213
|
+
@gemspec.add_development_dependency "doubleshot"
|
214
|
+
|
215
|
+
@gemspec
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
def to_ruby
|
220
|
+
<<-EOS.margin
|
221
|
+
# encoding: UTF-8
|
222
|
+
|
223
|
+
Doubleshot.new do |config|
|
224
|
+
#{
|
225
|
+
inner_heredoc = false
|
226
|
+
to_ruby_body.split("\n").map do |line|
|
227
|
+
output = if inner_heredoc
|
228
|
+
" #{line}"
|
229
|
+
else
|
230
|
+
" #{line}"
|
231
|
+
end
|
232
|
+
|
233
|
+
if line =~ /\<\<\-DESCRIPTION/
|
234
|
+
inner_heredoc = true
|
235
|
+
elsif line =~ /^\s*DESCRIPTION/
|
236
|
+
inner_heredoc = false
|
237
|
+
end
|
238
|
+
output
|
239
|
+
end.join("\n")}
|
240
|
+
end
|
241
|
+
EOS
|
242
|
+
end
|
243
|
+
|
244
|
+
def to_ruby_body
|
245
|
+
spec = gemspec
|
246
|
+
|
247
|
+
config_changes = __changes__
|
248
|
+
source_changes = @source.__changes__
|
249
|
+
|
250
|
+
<<-EOS.margin
|
251
|
+
#{Doubleshot::Configuration::SOURCE_RUBY_MESSAGE}
|
252
|
+
#{"# " unless source_changes.include? :ruby}config.source.ruby = #{@source.ruby.to_s.inspect}
|
253
|
+
|
254
|
+
#{Doubleshot::Configuration::SOURCE_JAVA_MESSAGE}
|
255
|
+
#{"# " unless source_changes.include? :java}config.source.java = #{@source.java.to_s.inspect}
|
256
|
+
|
257
|
+
#{Doubleshot::Configuration::SOURCE_TESTS_MESSAGE}
|
258
|
+
#{"# " unless source_changes.include? :tests}config.source.tests = #{@source.tests.to_s.inspect}
|
259
|
+
|
260
|
+
|
261
|
+
#{Doubleshot::Configuration::TARGET_MESSAGE}
|
262
|
+
#{"# " unless config_changes.include? :target}config.target = #{@target.to_s.inspect}
|
263
|
+
|
264
|
+
|
265
|
+
#{Doubleshot::Configuration::WHITELIST_MESSAGE}
|
266
|
+
#{
|
267
|
+
if config_changes.include? :whitelist
|
268
|
+
(@whitelist - DEFAULT_WHITELIST).map do |ext|
|
269
|
+
"config.whitelist #{ext.inspect}"
|
270
|
+
end.join("\n ")
|
271
|
+
else
|
272
|
+
"# config.whitelist \".ext\""
|
273
|
+
end
|
274
|
+
}
|
275
|
+
|
276
|
+
|
277
|
+
#{Doubleshot::Configuration::GEM_DEPENDENCY_MESSAGE}
|
278
|
+
#{
|
279
|
+
if @runtime_dependencies.gems.empty?
|
280
|
+
"# config.gem \"bcrypt-ruby\", \"~> 3.0\""
|
281
|
+
else
|
282
|
+
@runtime_dependencies.gems.map do |dependency|
|
283
|
+
if dependency.requirements.empty?
|
284
|
+
"config.gem \"#{dependency}\""
|
285
|
+
else
|
286
|
+
"config.gem \"#{dependency}\", \"#{dependency.requirements.map(&:to_s).join("\", \"")}\""
|
287
|
+
end
|
288
|
+
end.join("\n ")
|
289
|
+
end
|
290
|
+
}
|
291
|
+
|
292
|
+
#{Doubleshot::Configuration::JAR_DEPENDENCY_MESSAGE}
|
293
|
+
#{
|
294
|
+
if @runtime_dependencies.jars.empty?
|
295
|
+
"# config.jar \"ch.qos.logback:logback:jar:0.5\""
|
296
|
+
else
|
297
|
+
@runtime_dependencies.jars.map do |dependency|
|
298
|
+
"config.jar \"#{dependency}\""
|
299
|
+
end.join("\n ")
|
300
|
+
end
|
301
|
+
}
|
302
|
+
|
303
|
+
#{Doubleshot::Configuration::DEVELOPMENT_MESSAGE}
|
304
|
+
#{
|
305
|
+
unless @development_dependencies.empty?
|
306
|
+
"config.development do\n " +
|
307
|
+
(
|
308
|
+
@development_dependencies.gems.map do |dependency|
|
309
|
+
if dependency.requirements.empty?
|
310
|
+
" config.gem \"#{dependency}\""
|
311
|
+
else
|
312
|
+
" config.gem \"#{dependency}\", \"#{dependency.requirements.map(&:to_s).join("\", \"")}\""
|
313
|
+
end
|
314
|
+
end +
|
315
|
+
@development_dependencies.jars.map do |dependency|
|
316
|
+
" config.jar \"#{dependency}\""
|
317
|
+
end
|
318
|
+
).join("\n ") + "\n end"
|
319
|
+
end
|
320
|
+
}
|
321
|
+
|
322
|
+
#{Doubleshot::Configuration::GEMSPEC_MESSAGE}
|
323
|
+
config.gemspec do |spec|
|
324
|
+
spec.name = #{spec.name.inspect}
|
325
|
+
spec.version = #{spec.version.to_s.inspect}
|
326
|
+
spec.summary = #{spec.summary.inspect}
|
327
|
+
spec.description = <<-DESCRIPTION
|
328
|
+
#{spec.description.strip}
|
329
|
+
DESCRIPTION
|
330
|
+
spec.homepage = #{spec.homepage.inspect}
|
331
|
+
spec.author = #{spec.author.inspect}
|
332
|
+
spec.email = #{spec.email.inspect}
|
333
|
+
spec.license = #{spec.license.inspect}
|
334
|
+
spec.executables = #{spec.executables.inspect}
|
335
|
+
end
|
336
|
+
EOS
|
337
|
+
end
|
338
|
+
|
339
|
+
def __changes__
|
340
|
+
changes = []
|
341
|
+
@defaults.each_pair do |key,value|
|
342
|
+
changes << key unless instance_variable_get("@#{key}") == value
|
343
|
+
end
|
344
|
+
changes
|
345
|
+
end
|
346
|
+
|
347
|
+
private
|
348
|
+
def rdoc_options
|
349
|
+
[
|
350
|
+
"--line-numbers",
|
351
|
+
"--main", "README.textile",
|
352
|
+
"--title", "#{@gemspec.name} Documentation",
|
353
|
+
@source.ruby.to_s, "README.textile"
|
354
|
+
]
|
355
|
+
end
|
356
|
+
|
357
|
+
def default(key, value)
|
358
|
+
@defaults[key] = value
|
359
|
+
end
|
360
|
+
end
|
361
|
+
end
|