buildr 0.21.0 → 0.22.0

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/CHANGELOG CHANGED
@@ -1,3 +1,20 @@
1
+ 0.22 (4/26/2007)
2
+ * Added: Calling projects(:in=>foo) returns only the sub-projects defined in foo.
3
+ * Added: _() as shortcut for path_to().
4
+ * Added: You can pass properties to java by setting the :properties options.
5
+ * Added: JUnit task has a way of setting options (options accessor and using method), which for now supports passing properties to java.
6
+ * Added: You can now use the struct method to create a Struct for structoring your multiple artifacts.
7
+ * Changed: Use rake artifacts to download all artifacts not already in the local repository, and also download modified artifacts (*cough*snapshots*cough*)
8
+ * Changed: Transport.download now uses timestamp on the destination file and If-Modified-Since header to skip downloads of unmodified files.
9
+ * Changed: Downloading artifact sets the time stamp from the repository.
10
+ * Changed: Use buildr.rake in the project's directory and your home directory, instead of buildr.rb.
11
+ * Changed: filter method accepts one argument, the source directory. Use filter(src).into(target).
12
+ * Changed: Running Javac/Apt/Javadoc in process.
13
+ * Changed: Using Ant for OpenJPA enhancer and XMLBeans schema compiler.
14
+ * Changed: Jetty, JavaCC, OpenJPA and XMLBeans are no longer included by default. You need to require them explicitly, e.g. require "buildr/jetty".
15
+ * Removed: Tasks no longer use a base directory, always map paths directly using file, path_to or _().
16
+ * Fixed: The artifacts task no longer downloads POMs for artifacts created by the Rakefile.
17
+
1
18
  0.21 (4/20/2007)
2
19
  * Added: Methods to read and write a file (shortcut for File.read/File.open.write).
3
20
  * Changed: Filter task now takes a source directory and target directory, and copies all included (sans excluded) files between the two.
@@ -30,16 +30,24 @@ end
30
30
 
31
31
 
32
32
  module Buildr
33
- VERSION = "0.21.0"
33
+ VERSION = "0.22.0"
34
34
  end
35
35
 
36
-
37
- File.expand_path(__DIR__).tap do |here|
38
- $LOAD_PATH.unshift here
39
- Dir[File.expand_path("*/*.rb", __DIR__)].each { |file| require file.sub("#{here}/", "") }
36
+ $LOAD_PATH.unshift __DIR__
37
+ ["core", "tasks", "java"].each do |dir|
38
+ Dir[File.join(__DIR__, dir, "*.rb")].map { |file| File.basename(file) }.each { |file| require "#{dir}/#{file}" }
40
39
  end
41
40
 
42
- include Buildr
41
+
42
+ # Methods defined in Buildr are both instance methods (e.g. when included in Project)
43
+ # and class methods when invoked like Buildr.artifacts().
44
+ module Buildr ; extend self ; end
45
+ # The Rakefile object (self) has access to all the Buildr methods and constants.
46
+ class << self ; include Buildr ; end
47
+ class Object ; Buildr.constants.each { |c| const_set c, Buildr.const_get(c) unless const_defined?(c) } ; end
48
+ # Project has visibility to everything in the Buildr namespace. (See above for constants)
49
+ class Project ; include Buildr ; end
50
+
43
51
 
44
52
  # The greate method_missing/Object extend bug requires us to load
45
53
  # XMLBuilder after we're done enhancing Object.
@@ -51,7 +59,13 @@ module Buildr
51
59
  end
52
60
 
53
61
  # Load the settings files.
54
- [ File.expand_path("buildr.rb", ENV["HOME"]), File.expand_path("buildr.rb") ].each { |file| require file if File.exist?(file) }
62
+ [ File.expand_path("buildr.rake", ENV["HOME"] || "~"), File.expand_path("buildr.rake") ].each { |file| load file if File.exist?(file) }
63
+ [ File.expand_path("buildr.rb", ENV["HOME"] || "~"), File.expand_path("buildr.rb") ].each do |file|
64
+ if File.exist?(file)
65
+ warn "Please use #{file.ext('rake')} instead of #{file}"
66
+ require file
67
+ end
68
+ end
55
69
 
56
70
  #Load local tasks that can be used in the Rakefile.
57
71
  Dir["#{Dir.pwd}/tasks/*.rake"].each do |file|
@@ -0,0 +1,69 @@
1
+ require "java/java"
2
+
3
+ module Buildr
4
+ module JavaCC
5
+
6
+ REQUIRES = [ "net.java.dev.javacc:javacc:jar:4.0", "net.java.dev.javacc:javacc:jar:4.0" ]
7
+
8
+ class << self
9
+
10
+ def javacc(*args)
11
+ options = Hash === args.last ? args.pop.clone : {}
12
+ options[:verbose] ||= Rake.application.options.trace || false
13
+ fu_check_options options, *Java::JAVA_OPTIONS + [:output]
14
+
15
+ (options[:classpath] ||= []) << REQUIRES
16
+ java_args = ["javacc"]
17
+ java_args << "-OUTPUT_DIRECTORY=#{options[:output]}" if options[:output]
18
+ java_args += args.flatten.map(&:to_s).collect { |f| File.directory?(f) ? FileList[f + "/**/*.jj"] : f }.flatten
19
+ java_args << options.reject { |k, v| !Java::JAVA_OPTIONS.include?(k) }
20
+ Java.java(*java_args)
21
+ end
22
+
23
+ def jjtree(*args)
24
+ options = Hash === args.last ? args.pop.clone : {}
25
+ options[:verbose] ||= Rake.application.options.trace || false
26
+ fu_check_options options, *Java::JAVA_OPTIONS + [:output, :build_node_files]
27
+
28
+ (options[:classpath] ||= []) << REQUIRES
29
+ java_args = ["jjtree"]
30
+ java_args << "-OUTPUT_DIRECTORY=#{options[:output]}" if options[:output]
31
+ java_args << "-BUILD_NODE_FILES=#{options[:build_node_files] || false}"
32
+ java_args += args.flatten.map(&:to_s).collect { |f| File.directory?(f) ? FileList[f + "/**/*.jjt"] : f }.flatten
33
+ java_args << options.reject { |k, v| !Java::JAVA_OPTIONS.include?(k) }
34
+ Java.java(*java_args)
35
+ end
36
+
37
+ end
38
+
39
+ def javacc(*args)
40
+ if Hash === args.last
41
+ options = args.pop
42
+ in_package = options[:in_package].split(".")
43
+ else
44
+ in_package = []
45
+ end
46
+ file(path_to("target/generated/javacc")=>args.flatten) do |task|
47
+ JavaCC.javacc task.prerequisites, :output=>File.join(task.name, in_package)
48
+ end
49
+ end
50
+
51
+ def jjtree(*args)
52
+ if Hash === args.last
53
+ options = args.pop
54
+ in_package = options[:in_package].split(".")
55
+ build_node_files = options[:build_node_files]
56
+ else
57
+ in_package = []
58
+ end
59
+ file(path_to("target/generated/jjtree")=>args.flatten) do |task|
60
+ JavaCC.jjtree task.prerequisites, :output=>File.join(task.name, in_package), :build_node_files=>build_node_files
61
+ end
62
+ end
63
+
64
+ end
65
+
66
+ class Project
67
+ include JavaCC
68
+ end
69
+ end
@@ -2,6 +2,7 @@ require "uri"
2
2
  require "net/http"
3
3
  require "core/project"
4
4
  require "java/artifact"
5
+ require "java/java"
5
6
 
6
7
  module Buildr
7
8
 
@@ -38,9 +39,14 @@ module Buildr
38
39
 
39
40
  # Artifacts required to run Jetty.
40
41
  REQUIRES = [ "org.mortbay.jetty:jetty:jar:6.1.1", "org.mortbay.jetty:jetty-util:jar:6.1.1",
41
- "org.mortbay.jetty:server-api-2.5:jar:6.1.1", "log4j:log4j:jar:1.2.13",
42
+ "org.mortbay.jetty:servlet-api-2.5:jar:6.1.1", "log4j:log4j:jar:1.2.13",
42
43
  "commons-logging:commons-logging:jar:1.1" ]
43
44
 
45
+ Java.rjb.onload do
46
+ Java.rjb.classpath << REQUIRES
47
+ Java.rjb.classpath << File.join(__DIR__, "jetty")
48
+ end
49
+
44
50
  # Default URL for Jetty.
45
51
  URL = "http://localhost:8080"
46
52
 
@@ -65,8 +71,6 @@ module Buildr
65
71
  # invoke the #use task instead.
66
72
  def start(pipe = nil)
67
73
  begin
68
- Java.rjb.classpath += REQUIRES
69
- Java.rjb.classpath << File.join(__DIR__, "jetty")
70
74
  Java.rjb do
71
75
  port = URI.parse(url).port
72
76
  puts "Starting Jetty at http://localhost:#{port}"
@@ -78,6 +82,8 @@ module Buildr
78
82
  sleep # Forever
79
83
  end
80
84
  rescue Interrupt # Stopped from console
85
+ rescue Exception=>error
86
+ puts "#{error.class}: #{error.message}"
81
87
  end
82
88
  exit! # No at_exit
83
89
  end
@@ -18,22 +18,10 @@ import java.util.HashMap;
18
18
  public class JettyWrapper {
19
19
 
20
20
  private Server _server;
21
- private WebAppContext _webAppHandler;
22
21
  private ContextHandlerCollection _handlerColl;
23
- private String _webAppDir;
24
- private String _contextPath;
25
22
 
26
- public JettyWrapper(int port/*String webAppDir, String contextPath*/) throws Exception {
23
+ public JettyWrapper(int port) throws Exception {
27
24
  _server = new Server(port);
28
- //_webAppDir = webAppDir;
29
- //_contextPath = contextPath;
30
-
31
- // Adding handler for the war to deploy
32
- //_webAppHandler = new WebAppContext(_webAppDir, _contextPath);
33
- //_webAppHandler.setConfigurationClasses(new String[] {
34
- // "org.mortbay.jetty.webapp.WebInfConfiguration",
35
- // "org.mortbay.jetty.webapp.WebXmlConfiguration"});
36
-
37
25
  // Adding the buildr handler to control our server lifecycle
38
26
  ContextHandler context = new ContextHandler();
39
27
  context.setContextPath("/buildr");
@@ -41,30 +29,20 @@ public class JettyWrapper {
41
29
  context.setHandler(handler);
42
30
 
43
31
  _handlerColl = new ContextHandlerCollection();
44
- _handlerColl.setHandlers(new Handler[] {/*_webAppHandler,*/ context});
32
+ _handlerColl.setHandlers(new Handler[] {context});
45
33
 
46
34
  _server.addHandler(_handlerColl);
47
35
  _server.start();
48
36
  }
49
37
 
50
- public void start() {
38
+ /*
39
+ public void join() {
51
40
  try {
52
- //_server.start();
53
41
  _server.join();
54
42
  } catch (Exception e) {
55
43
  e.printStackTrace();
56
44
  }
57
45
  }
58
- /*
59
- public static void main(String[] args) {
60
- if (args.length != 2) {
61
- System.out.println("Please provide the webapp directory and the context path.");
62
- }
63
- String webAppDir = args[0];
64
- String contextPath = args[1];
65
- JettyWrapper jetwrap = new JettyWrapper(webAppDir, contextPath);
66
- jetwrap.start();
67
- }
68
46
  */
69
47
 
70
48
  private class BuildrHandler extends AbstractHandler {
@@ -99,14 +77,6 @@ public class JettyWrapper {
99
77
  _handlerColl.addHandler(context);
100
78
  context.start();
101
79
  _apps.put(path, context);
102
- //_webAppHandler.stop();
103
- //_handlerColl.removeHandler(_webAppHandler);
104
- //_webAppHandler = new WebAppContext(_webAppDir, _contextPath);
105
- //_webAppHandler.setConfigurationClasses(new String[] {
106
- // "org.mortbay.jetty.webapp.WebInfConfiguration",
107
- // "org.mortbay.jetty.webapp.WebXmlConfiguration"});
108
- //_handlerColl.addHandler(_webAppHandler);
109
- //_webAppHandler.start();
110
80
  response.getWriter().println("Deployed");
111
81
  response.getWriter().println(context.getTempDirectory());
112
82
  ((Request)request).setHandled(true);
@@ -143,11 +113,7 @@ public class JettyWrapper {
143
113
  } catch (Exception e) {
144
114
  e.printStackTrace();
145
115
  }
146
- } else if (request.getPathInfo().equals("/war")) {
147
- response.getWriter().println(_webAppHandler.getTempDirectory());
148
- ((Request)request).setHandled(true);
149
- return;
150
- }
116
+ }
151
117
  response.getWriter().println("OK " + request.getPathInfo());
152
118
  ((Request)request).setHandled(true);
153
119
  }
@@ -0,0 +1,74 @@
1
+ require "java/java"
2
+
3
+ module Buildr
4
+ module OpenJPA
5
+
6
+ VERSION = "0.9.7-incubating-SNAPSHOT"
7
+
8
+ REQUIRES = [ "org.apache.openjpa:openjpa-all:jar:#{VERSION}",
9
+ "commons-collections:commons-collections:jar:3.1",
10
+ "commons-dbcp:commons-dbcp:jar:1.2.1",
11
+ "commons-lang:commons-lang:jar:2.1",
12
+ "commons-pool:commons-pool:jar:1.2",
13
+ "javax.persistence:persistence-api:jar:1.0",
14
+ "org.apache.geronimo.specs:geronimo-j2ee-connector_1.5_spec:jar:1.0",
15
+ "org.apache.geronimo.specs:geronimo-jta_1.0.1B_spec:jar:1.0",
16
+ "net.sourceforge.serp:serp:jar:1.11.0" ]
17
+
18
+ class << self
19
+
20
+ def enhance(options)
21
+ fu_check_options options, :classpath, :properties, :output
22
+ artifacts = Buildr.artifacts(options[:classpath] || []).each { |a| a.invoke }.map(&:to_s) + [options[:output].to_s]
23
+ properties = file(options[:properties]).tap { |task| task.invoke }.to_s
24
+
25
+ Ant.executable("openjpa") do |ant|
26
+ ant.taskdef :name=>"enhancer", :classname=>"org.apache.openjpa.ant.PCEnhancerTask",
27
+ :classpath=>requires.join(File::PATH_SEPARATOR)
28
+ ant.enhancer :directory=>options[:output].to_s do
29
+ config :propertiesFile=>properties
30
+ classpath :path=>artifacts.join(File::PATH_SEPARATOR)
31
+ end
32
+ end
33
+ end
34
+
35
+ def mapping_tool(options)
36
+ fu_check_options options, :classpath, :properties, :sql, :action
37
+ Java.java "org.apache.openjpa.jdbc.meta.MappingTool", "-p", options[:properties].to_s, "-sql", options[:sql],
38
+ "-sa", options[:action], :classpath=>Buildr.artifacts(options[:classpath], requires), :name=>"Mapping Tool"
39
+ =begin
40
+ # Hopefully this will work in a future release.
41
+ artifacts = Buildr.artifacts(options[:classpath] || []).each{ |a| a.invoke }.map(&:to_s) + requires
42
+ properties = file(options[:properties]).tap { |task| task.invoke }.to_s
43
+
44
+ Ant.executable("openjpa") do |ant|
45
+ ant.taskdef :name=>"mapping", :classname=>"org.apache.openjpa.jdbc.ant.MappingToolTask",
46
+ :classpath=>requires.join(File::PATH_SEPARATOR)
47
+ ant.mapping :schemaAction=>options[:action], :sqlFile=>options[:sql].to_s do
48
+ config :propertiesFile=>properties
49
+ classpath :path=>artifacts.join(File::PATH_SEPARATOR)
50
+ end
51
+ end
52
+ =end
53
+ end
54
+
55
+ private
56
+
57
+ def requires()
58
+ @required ||= Buildr.artifacts(REQUIRES).each { |artifact| artifact.invoke }.map(&:to_s)
59
+ end
60
+
61
+ end
62
+
63
+ def open_jpa_enhance(options = nil)
64
+ jpa_options = { :output=>compile.target, :classpath=>compile.classpath,
65
+ :properties=>path_to("src/main/resources/META-INF/persistence.xml") }
66
+ OpenJPA.enhance jpa_options.merge(options || {})
67
+ end
68
+
69
+ end
70
+
71
+ class Project
72
+ include OpenJPA
73
+ end
74
+ end
@@ -0,0 +1,61 @@
1
+ require "java/java"
2
+ require "java/ant"
3
+
4
+ module Buildr
5
+ module XMLBeans
6
+
7
+ REQUIRES = [ "xmlbeans:xbean:jar:2.2.0", "stax:stax-api:jar:1.0" ]
8
+
9
+ class << self
10
+
11
+ def compile(*args)
12
+ options = Hash === args.last ? args.pop : {}
13
+ options[:verbose] ||= Rake.application.options.trace || false
14
+ fu_check_options options, :verbose, :noop, :javasource, :jar, :compile, :output, :xsb
15
+ puts "Running XMLBeans schema compiler" if verbose
16
+ Ant.executable("xmlbeans") do |ant|
17
+ ant.taskdef :name=>"xmlbeans", :classname=>"org.apache.xmlbeans.impl.tool.XMLBean",
18
+ :classpath=>requires.join(File::PATH_SEPARATOR)
19
+ ant.xmlbeans :srconly=>"true", :srcgendir=>options[:output].to_s, :classgendir=>options[:output].to_s,
20
+ :javasource=>options[:javasource] do
21
+ args.flatten.each { |file| fileset File.directory?(file) ? { :dir=>file } : { :file=>file } }
22
+ end
23
+ end
24
+ # Touch paths to let other tasks know there's an update.
25
+ touch options[:output].to_s, :verbose=>false
26
+ end
27
+
28
+ private
29
+
30
+ def requires()
31
+ @requires ||= Buildr.artifacts(REQUIRES).each { |artifact| artifact.invoke }.map(&:to_s)
32
+ end
33
+
34
+ end
35
+
36
+ def compile_xml_beans(*args)
37
+ # Generate sources and add them to the compile task.
38
+ generated = file(path_to("target/generated/xmlbeans")=>FileList[args.flatten]) do |task|
39
+ XMLBeans.compile task.prerequisites, :output=>task.name,
40
+ :javasource=>compile.options.source, :xsb=>compile.target
41
+ end
42
+ compile.from(generated).with(JAVAX.stream, XMLBEANS)
43
+ # Once compiled, we need to copy the generated XSB/XSD and one (magical?) class file
44
+ # into the target directory, or the rest is useless.
45
+ compile do |task|
46
+ verbose(false) do
47
+ base = Pathname.new(generated.to_s)
48
+ FileList["#{base}/**/*.{class,xsb,xsd}"].each do |file|
49
+ target = File.join(compile.target.to_s, Pathname.new(file).relative_path_from(base))
50
+ mkpath File.dirname(target) ; cp file, target
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ end
57
+
58
+ class Project
59
+ include XMLBeans
60
+ end
61
+ end
@@ -4,6 +4,23 @@ require "core/transports"
4
4
 
5
5
  module Buildr
6
6
 
7
+ # :call-seq:
8
+ # struct(hash) => Struct
9
+ #
10
+ # Convenience method for creating an anonymous Struct.
11
+ #
12
+ # For example:
13
+ # COMMONS = struct(
14
+ # :collections =>"commons-collections:commons-collections:jar:3.1",
15
+ # :lang =>"commons-lang:commons-lang:jar:2.1",
16
+ # :logging =>"commons-logging:commons-logging:jar:1.0.3",
17
+ # )
18
+ #
19
+ # compile.with COMMONS.logging
20
+ def struct(hash)
21
+ Struct.new(nil, *hash.keys).new(*hash.values)
22
+ end
23
+
7
24
  # :call-seq:
8
25
  # write(name, content)
9
26
  # write(name) { ... }
@@ -239,7 +256,7 @@ module Buildr
239
256
  end
240
257
 
241
258
  # :call-seq:
242
- # filter(target=>source) => Filter
259
+ # filter(source) => Filter
243
260
  #
244
261
  # Creates a filter that will copy files from the source directory into the target directory.
245
262
  # You can extend the filter to modify files by mapping <tt>${key}</tt> into values in each
@@ -248,13 +265,12 @@ module Buildr
248
265
  # A filter is not a task, you must call the Filter#run method to execute it.
249
266
  #
250
267
  # For example, to copy all files from one directory to another:
251
- # filter("target/classes"=>"src/files")
268
+ # filter("src/files").into("target/classes").run
252
269
  # To include only the text files, and replace each instance of <tt>${build}</tt> with the current
253
270
  # date/time:
254
- # filter("target/classes"=>"src/files").include("*.txt").using("build"=>Time.now)
255
- def filter(args)
256
- target, source = Rake.application.resolve_args(args)
257
- Filter.new.into(target).tap { |filter| filter.from(source) if source }
271
+ # filter("src/files").into("target/classes").include("*.txt").using("build"=>Time.now).run
272
+ def filter(source)
273
+ Filter.new.from(source)
258
274
  end
259
275
 
260
276
  end