sparrowhawk 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md ADDED
@@ -0,0 +1,4 @@
1
+ ## 0.9.0 (28 December 2010)
2
+
3
+ * Initial feature set.
4
+
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2010 Ryan L. Bell
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,25 @@
1
+ ## Sparrowhawk: The Warbler Killer
2
+
3
+ 'The Warbler Killer' is kind of tongue-in-cheek. Sparrowhawk is for teams that would like to distribute their application as a WAR file, but prefer that their distribution tool chain remain purely MRI. That's not to say that Sparrowhawk won't run on JRuby, just that the goal was to produce a tool that would run on any ruby.
4
+
5
+ ## Why Sparrowhawk?
6
+
7
+ Why would you pick Sparrowhawk over another tool, like, ohhhhh I don't know... Warbler?
8
+
9
+ I can think of two reasons.
10
+
11
+ First, we run on any ruby (or, we will, by 1.0.0)
12
+
13
+ The second reason depends on preference. Warbler is a command line tool based on rake. To use warbler, you need to load up all of rake. There are times when this can have negative ramifications.
14
+
15
+ >TODO: Give examples of negative ramifications
16
+
17
+ Sparrowhawk, on the other hand, is a library for packaging Rack applications as war files. It happens that sparrowhawk ships with a rake task, but rake isn't required to use Sparrowhawk.
18
+
19
+ ## Notes and Warnings
20
+
21
+ Sparrowhawk was built to package TriSano.
22
+
23
+ Sparrowhawk only does rails applications so far. Full Rack support is forth coming, but wasn't our first priority.
24
+
25
+ I've only tested Sparrowhawk on Rails 2.3.x applications w/ bundler integration (a niche group, to be certain). It does, however, work beautifully on one such application (TriSano).
@@ -0,0 +1,30 @@
1
+ module Sparrowhawk
2
+
3
+ class ApplicationFilesMapper
4
+ include FileEntryMapper
5
+
6
+ attr_reader :application_root, :application_dirs
7
+
8
+ def initialize *application_dirs
9
+ @application_root = expand_path '.'
10
+ @excluded_path_patterns = [%r{/vendor/cache/}]
11
+ @application_dirs = application_dirs || default_application_dirs
12
+ end
13
+
14
+ private
15
+
16
+ def file_pattern
17
+ application_root + "/{#{application_dirs.join(',')}}/**{,/*/**}/*"
18
+ end
19
+
20
+ def entry_name file_name
21
+ "WEB-INF/" + expand_path(file_name)[application_root.length + 1..-1]
22
+ end
23
+
24
+ def default_application_dirs
25
+ %w(app config lib vendor)
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,18 @@
1
+ require 'delegate'
2
+
3
+ module Sparrowhawk
4
+
5
+ class BundlerDefinition < DelegateClass(::Bundler::Definition)
6
+ def initialize
7
+ super ::Bundler::Definition.build('Gemfile', 'Gemfile.lock', nil)
8
+ end
9
+
10
+ def runtime_dependencies
11
+ dependencies.select do |dep|
12
+ dep.type.to_sym == :runtime and
13
+ (dep.platforms.empty? or dep.platforms.include?(:jruby))
14
+ end
15
+ end
16
+ end
17
+
18
+ end
@@ -0,0 +1,56 @@
1
+ module Sparrowhawk
2
+
3
+ class BundlerGemFinder
4
+ include Enumerable
5
+
6
+ attr_reader :definition
7
+
8
+ def initialize
9
+ @definition = BundlerDefinition.new
10
+ end
11
+
12
+ def each
13
+ gems.each { |g| yield g }
14
+ end
15
+
16
+ private
17
+
18
+ def specs
19
+ specs_for_dependencies_of @definition
20
+ end
21
+
22
+ def gems
23
+ @gems ||= [bundler_gem] + specs.map { |s| gem_from_file_by_path(s.source) }
24
+ end
25
+
26
+ def vendor_cache
27
+ @vendor_cache ||= Index.build do |idx|
28
+ Dir['vendor/cache/*.gem'].each do |gemfile|
29
+ spec ||= gem_from_file_by_path(gemfile).spec
30
+ idx << spec
31
+ spec.source = gemfile
32
+ end
33
+ end
34
+ end
35
+
36
+ def specs_for_dependencies_of thing
37
+ thing.runtime_dependencies.map do |dep|
38
+ specs = vendor_cache.search(dep)
39
+ specs.map { |s| specs_for_dependencies_of s } + specs
40
+ end.flatten
41
+ end
42
+
43
+ def bundler_gem
44
+ gem_from_file_by_path cached_bundler_gem_path
45
+ end
46
+
47
+ def cached_bundler_gem_path
48
+ File.join ENV['GEM_HOME'], "cache", "bundler-#{::Bundler::VERSION}.gem"
49
+ end
50
+
51
+ def gem_from_file_by_path path
52
+ Gem::Format.from_file_by_path path
53
+ end
54
+ end
55
+
56
+ end
@@ -0,0 +1,13 @@
1
+ module Sparrowhawk
2
+
3
+ class Entry
4
+ attr_reader :name, :content
5
+
6
+ def initialize name, content
7
+ @name = name
8
+ @content = content
9
+ end
10
+
11
+ end
12
+
13
+ end
@@ -0,0 +1,17 @@
1
+ module Sparrowhawk
2
+
3
+ class FileEntry
4
+
5
+ attr_reader :name, :source
6
+
7
+ def initialize entry_name, file_name
8
+ @name = entry_name
9
+ @source = file_name
10
+ end
11
+
12
+ def content
13
+ IO.read(source)
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,31 @@
1
+ module Sparrowhawk
2
+ module FileEntryMapper
3
+ include Enumerable
4
+
5
+ def each
6
+ file_entry_tuples.each do |entry_name, file_path|
7
+ next if File.directory? file_path
8
+ next if excluded? file_path
9
+ yield FileEntry.new entry_name, file_path
10
+ end
11
+ end
12
+
13
+ def file_entry_tuples
14
+ Dir.glob(file_pattern).map do |f|
15
+ [entry_name(f), expand_path(f)]
16
+ end
17
+ end
18
+
19
+ def expand_path file_name
20
+ File.expand_path file_name
21
+ end
22
+
23
+ def excluded? file_path
24
+ excluded_path_patterns.any? { |pattern| pattern =~ file_path }
25
+ end
26
+
27
+ def excluded_path_patterns
28
+ @excluded_path_patterns ||= []
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,43 @@
1
+ module Sparrowhawk
2
+
3
+ class GemMapper
4
+ include Enumerable
5
+
6
+ attr_reader :gems
7
+
8
+ def initialize gems
9
+ @gems = gems
10
+ end
11
+
12
+ def each
13
+ gems.each do |gem|
14
+ spec = gem.spec
15
+ yield spec_entry spec.spec_name, spec.to_ruby
16
+
17
+ gem.file_entries.each do |file_entry|
18
+ yield gem_file_entry spec.full_name, file_entry[0]["path"], file_entry[1]
19
+ end
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def spec_entry spec_name, content
26
+ Entry.new spec_prefix(spec_name), content
27
+ end
28
+
29
+ def spec_prefix basename
30
+ File.join "WEB-INF/gems/specifications", basename
31
+ end
32
+
33
+ def gem_file_entry gem_name, basename, content
34
+ Entry.new gem_file_prefix(gem_name, basename), content
35
+ end
36
+
37
+ def gem_file_prefix gem_name, file_name
38
+ File.join "WEB-INF/gems/gems", gem_name, file_name
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -0,0 +1,9 @@
1
+ module Sparrowhawk
2
+
3
+ class GemfileEntry < FileEntry
4
+ def initialize
5
+ super "WEB-INF/Gemfile", "Gemfile"
6
+ end
7
+ end
8
+
9
+ end
@@ -0,0 +1,44 @@
1
+ module Sparrowhawk
2
+
3
+ # Needed a bundler index can search for gems on the java platform,
4
+ # regardless of what platform you are cuurrently on.
5
+ class Index < ::Bundler::Index
6
+
7
+ def << spec
8
+ super
9
+ arr = @specs[spec.name]
10
+ if arr.any? { |s| s.platform == java_platform }
11
+ arr.delete_if { |s| s.platform != java_platform }
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def search_by_dependency dependency
18
+ @cache[dependency.hash] ||= begin
19
+ specs = @specs[dependency.name]
20
+
21
+ wants_prerelease = dependency.requirement.prerelease?
22
+ only_prerelease = specs.all? {|spec| spec.version.prerelease? }
23
+ found = specs.select { |spec| dependency.matches_spec?(spec) && matches_java_platform?(spec.platform) }
24
+
25
+ unless wants_prerelease || only_prerelease
26
+ found.reject! { |spec| spec.version.prerelease? }
27
+ end
28
+
29
+ found.sort_by {|s| [s.version, s.platform.to_s == 'ruby' ? "\0" : s.platform.to_s] }
30
+ end
31
+ end
32
+
33
+ def matches_java_platform? platform
34
+ ["ruby", java_platform].any? do |java_platform|
35
+ platform.nil? or java_platform == platform or
36
+ (java_platform != Gem::Platform::RUBY and java_platform =~ platform)
37
+ end
38
+ end
39
+
40
+ def java_platform
41
+ @java_platform ||= Gem::Platform.new("java")
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,18 @@
1
+ module Sparrowhawk
2
+
3
+ class JarEntry < FileEntry
4
+
5
+ def initialize
6
+ super jar_entry_name, jar_path
7
+ end
8
+
9
+ def jar_entry_name
10
+ "WEB-INF/lib/#{File.basename(jar_path)}"
11
+ end
12
+
13
+ def jar_path
14
+ raise NotImplementedError, "#jar_path should be implemented by a subclass"
15
+ end
16
+ end
17
+
18
+ end
@@ -0,0 +1,12 @@
1
+ require 'jruby-jars'
2
+
3
+ module Sparrowhawk
4
+
5
+ class JRubyCoreJarEntry < JarEntry
6
+
7
+ def jar_path
8
+ JRubyJars.core_jar_path
9
+ end
10
+ end
11
+
12
+ end
@@ -0,0 +1,22 @@
1
+ module Sparrowhawk
2
+
3
+ class JRubyRackJarEntry < JarEntry
4
+
5
+ def jar_path
6
+ return @jar_path if @jar_path
7
+ begin
8
+ require 'jruby-rack'
9
+ @jar_path = JRubyJars.jruby_rack_jar_path
10
+ rescue LoadError => err
11
+ @jar_path = jar_path_from_load_error(err)
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def jar_path_from_load_error err
18
+ @jar_path = err.message.split(' -- ')[1]
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,12 @@
1
+ require 'jruby-jars'
2
+
3
+ module Sparrowhawk
4
+
5
+ class JRubyStdLibJarEntry < JarEntry
6
+
7
+ def jar_path
8
+ JRubyJars.stdlib_jar_path
9
+ end
10
+ end
11
+
12
+ end
@@ -0,0 +1,11 @@
1
+ module Sparrowhawk
2
+
3
+ class LockfileEntry < FileEntry
4
+
5
+ def initialize
6
+ super "WEB-INF/Gemfile.lock", "Gemfile.lock"
7
+ end
8
+
9
+ end
10
+
11
+ end
@@ -0,0 +1,15 @@
1
+ module Sparrowhawk
2
+
3
+ class ManifestEntry
4
+ attr_reader :name
5
+
6
+ def initialize
7
+ @name = 'META-INF/MANIFEST.MF'
8
+ end
9
+
10
+ def content
11
+ %Q{Manifest-Version: 1.0\nCreated-By: #{Sparrowhawk::VERSION} (Sparrowhawk)}
12
+ end
13
+ end
14
+
15
+ end
@@ -0,0 +1,24 @@
1
+ module Sparrowhawk
2
+
3
+ class PublicDirMapper
4
+ include FileEntryMapper
5
+
6
+ attr_reader :public_dir
7
+
8
+ def initialize
9
+ @public_dir = expand_path('./public')
10
+ @excluded_path_patterns = [%r{.*\.sass$}]
11
+ end
12
+
13
+ private
14
+
15
+ def file_pattern
16
+ public_dir + "/**{,/*/**}/*"
17
+ end
18
+
19
+ def entry_name file_name
20
+ expand_path(file_name)[public_dir.length + 1..-1 ]
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,56 @@
1
+ require 'rake/tasklib'
2
+ require 'sparrowhawk'
3
+
4
+ module Sparrowhawk
5
+
6
+ class RakeTask < ::Rake::TaskLib
7
+
8
+ attr_accessor :war_file
9
+
10
+ attr_accessor :application_dirs
11
+
12
+ attr_accessor :runtimes
13
+
14
+ attr_accessor :environment
15
+
16
+ attr_accessor :other_files
17
+
18
+ def initialize task_name=:war
19
+ yield self if block_given?
20
+
21
+ task task_name do
22
+ war.build
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def war
29
+ war = War.new war_file
30
+ war.entries << PublicDirMapper.new.to_a
31
+ war.entries << WebXmlEntry.new(web_xml_options)
32
+ war.entries << ManifestEntry.new
33
+ war.entries << ApplicationFilesMapper.new(application_dirs).to_a
34
+ war.entries << JRubyCoreJarEntry.new
35
+ war.entries << JRubyStdLibJarEntry.new
36
+ war.entries << JRubyRackJarEntry.new
37
+ gem_finder = BundlerGemFinder.new
38
+ war.entries << GemMapper.new(gem_finder).to_a
39
+ war.entries << GemfileEntry.new
40
+ war.entries << LockfileEntry.new
41
+ other_files.each do |file|
42
+ war.entries << FileEntry.new("WEB-INF/#{file}", file)
43
+ end if other_files
44
+ war
45
+ end
46
+
47
+ def web_xml_options
48
+ options = {}
49
+ options[:runtimes] = runtimes if runtimes
50
+ options[:environment] = environment if environment
51
+ options
52
+ end
53
+
54
+ end
55
+
56
+ end
@@ -0,0 +1,48 @@
1
+ require 'zip/zipfilesystem'
2
+
3
+ module Sparrowhawk
4
+
5
+ class War
6
+
7
+ attr_reader :name, :entries
8
+
9
+ def initialize file_name=nil
10
+ @name = file_name || default_file_name
11
+ @entries = []
12
+ end
13
+
14
+ def exist?
15
+ File.exist? name
16
+ end
17
+ alias exists? exist?
18
+
19
+ def has_entry? entry_name
20
+ return false unless exists?
21
+ open_war { |zip| zip.file.exists?(entry_name) }
22
+ end
23
+
24
+ def build
25
+ open_war for_writing do |zip|
26
+ entries.flatten.each do |entry|
27
+ zip.file.open(entry.name, "w") { |f| f << entry.content }
28
+ end
29
+ end
30
+ self
31
+ end
32
+
33
+ private
34
+
35
+ def open_war for_writing=nil, &block
36
+ Zip::ZipFile.open name, for_writing, &block
37
+ end
38
+
39
+ def for_writing
40
+ Zip::ZipFile::CREATE
41
+ end
42
+
43
+ def default_file_name
44
+ "#{File.basename File.expand_path('.')}.war"
45
+ end
46
+ end
47
+
48
+ end
@@ -0,0 +1,75 @@
1
+ require 'builder'
2
+
3
+ module Sparrowhawk
4
+
5
+ class WebXmlEntry
6
+ attr_reader :name, :environment
7
+
8
+ def initialize options={}
9
+ @name = 'WEB-INF/web.xml'
10
+ @runtimes = options[:runtimes] || (1..1)
11
+ @environment = options[:environment] || 'development'
12
+ end
13
+
14
+ def content
15
+ xml = Builder::XmlMarkup.new
16
+ xml.instruct!
17
+ xml.declare!(:DOCTYPE, 'web-app'.to_sym, :PUBLIC,
18
+ "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN",
19
+ "http://java.sun.com/dtd/web-app_2_3.dtd")
20
+ xml.tag! 'web-app' do |xml|
21
+ xml << context_param('rails.env', environment)
22
+ xml << context_param('public.root', '/')
23
+ xml << context_param('jruby.min.runtimes', min_runtimes)
24
+ xml << context_param('jruby.max.runtimes', max_runtimes)
25
+ xml << filter(:name => 'RackFilter',
26
+ :class => 'org.jruby.rack.RackFilter',
27
+ :url => '/*')
28
+ xml << listener('org.jruby.rack.rails.RailsServletContextListener')
29
+ end
30
+ xml.target!
31
+ end
32
+
33
+ def max_runtimes
34
+ @runtimes.end.to_s
35
+ end
36
+
37
+ def min_runtimes
38
+ @runtimes.begin.to_s
39
+ end
40
+
41
+ private
42
+
43
+ def context_param name, value
44
+ xml = Builder::XmlMarkup.new
45
+ xml.tag! 'context-param' do |xml|
46
+ xml.tag! 'param-name', name
47
+ xml.tag! 'param-value', value
48
+ end
49
+ xml.target!
50
+ end
51
+
52
+ def filter options
53
+ xml = Builder::XmlMarkup.new
54
+ xml.filter do |xml|
55
+ xml.tag! 'filter-name', options[:name]
56
+ xml.tag! 'filter-class', options[:class]
57
+ end
58
+ xml.tag! 'filter-mapping' do |xml|
59
+ xml.tag! 'filter-name', options[:name]
60
+ xml.tag! 'url-pattern', options[:url]
61
+ end
62
+ xml.target!
63
+ end
64
+
65
+ def listener clazz
66
+ xml = Builder::XmlMarkup.new
67
+ xml.listener do |xml|
68
+ xml.tag! 'listener-class', clazz
69
+ end
70
+ xml.target!
71
+ end
72
+
73
+ end
74
+
75
+ end
@@ -0,0 +1,27 @@
1
+ require 'bundler'
2
+
3
+ module Sparrowhawk
4
+ VERSION = "0.9.0"
5
+
6
+ autoload :War ,'sparrowhawk/war'
7
+
8
+ autoload :Entry ,'sparrowhawk/entry'
9
+ autoload :FileEntry ,'sparrowhawk/file_entry'
10
+ autoload :WebXmlEntry ,'sparrowhawk/web_xml_entry'
11
+ autoload :ManifestEntry ,'sparrowhawk/manifest_entry'
12
+ autoload :JarEntry ,'sparrowhawk/jar_entry'
13
+ autoload :JRubyCoreJarEntry ,'sparrowhawk/jruby_core_jar_entry'
14
+ autoload :JRubyStdLibJarEntry ,'sparrowhawk/jruby_stdlib_jar_entry'
15
+ autoload :JRubyRackJarEntry ,'sparrowhawk/jruby_rack_jar_entry'
16
+ autoload :GemfileEntry ,'sparrowhawk/gemfile_entry'
17
+ autoload :LockfileEntry ,'sparrowhawk/lockfile_entry'
18
+
19
+ autoload :FileEntryMapper ,'sparrowhawk/file_entry_mapper'
20
+ autoload :PublicDirMapper ,'sparrowhawk/public_dir_mapper'
21
+ autoload :ApplicationFilesMapper ,'sparrowhawk/application_files_mapper'
22
+ autoload :GemMapper ,'sparrowhawk/gem_mapper'
23
+
24
+ autoload :BundlerGemFinder ,'sparrowhawk/bundler_gem_finder'
25
+ autoload :BundlerDefinition ,'sparrowhawk/bundler_definition'
26
+ autoload :Index ,'sparrowhawk/index'
27
+ end
metadata ADDED
@@ -0,0 +1,203 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sparrowhawk
3
+ version: !ruby/object:Gem::Version
4
+ hash: 59
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 9
9
+ - 0
10
+ version: 0.9.0
11
+ platform: ruby
12
+ authors:
13
+ - Ryan L. Bell
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-12-28 00:00:00 -05:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ name: rubyzip
35
+ - !ruby/object:Gem::Dependency
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ type: :runtime
47
+ version_requirements: *id002
48
+ name: jruby-jars
49
+ - !ruby/object:Gem::Dependency
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ type: :runtime
61
+ version_requirements: *id003
62
+ name: jruby-rack
63
+ - !ruby/object:Gem::Dependency
64
+ prerelease: false
65
+ requirement: &id004 !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ hash: 3
71
+ segments:
72
+ - 0
73
+ version: "0"
74
+ type: :development
75
+ version_requirements: *id004
76
+ name: rake
77
+ - !ruby/object:Gem::Dependency
78
+ prerelease: false
79
+ requirement: &id005 !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
87
+ version: "0"
88
+ type: :development
89
+ version_requirements: *id005
90
+ name: rspec
91
+ - !ruby/object:Gem::Dependency
92
+ prerelease: false
93
+ requirement: &id006 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ hash: 3
99
+ segments:
100
+ - 0
101
+ version: "0"
102
+ type: :development
103
+ version_requirements: *id006
104
+ name: cucumber
105
+ - !ruby/object:Gem::Dependency
106
+ prerelease: false
107
+ requirement: &id007 !ruby/object:Gem::Requirement
108
+ none: false
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ hash: 3
113
+ segments:
114
+ - 0
115
+ version: "0"
116
+ type: :development
117
+ version_requirements: *id007
118
+ name: aruba
119
+ - !ruby/object:Gem::Dependency
120
+ prerelease: false
121
+ requirement: &id008 !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ hash: 3
127
+ segments:
128
+ - 0
129
+ version: "0"
130
+ type: :development
131
+ version_requirements: *id008
132
+ name: nokogiri
133
+ description: Sparrowhawk uses bundler and vendor/cache to package rails applications into a war file, without executing Java or JRuby
134
+ email:
135
+ - ryan.l.bell@gmail.com
136
+ executables: []
137
+
138
+ extensions: []
139
+
140
+ extra_rdoc_files: []
141
+
142
+ files:
143
+ - lib/sparrowhawk/public_dir_mapper.rb
144
+ - lib/sparrowhawk/war.rb
145
+ - lib/sparrowhawk/jruby_stdlib_jar_entry.rb
146
+ - lib/sparrowhawk/rake_task.rb
147
+ - lib/sparrowhawk/bundler_gem_finder.rb
148
+ - lib/sparrowhawk/web_xml_entry.rb
149
+ - lib/sparrowhawk/manifest_entry.rb
150
+ - lib/sparrowhawk/bundler_definition.rb
151
+ - lib/sparrowhawk/jruby_core_jar_entry.rb
152
+ - lib/sparrowhawk/file_entry_mapper.rb
153
+ - lib/sparrowhawk/application_files_mapper.rb
154
+ - lib/sparrowhawk/jruby_rack_jar_entry.rb
155
+ - lib/sparrowhawk/gemfile_entry.rb
156
+ - lib/sparrowhawk/gem_mapper.rb
157
+ - lib/sparrowhawk/lockfile_entry.rb
158
+ - lib/sparrowhawk/file_entry.rb
159
+ - lib/sparrowhawk/entry.rb
160
+ - lib/sparrowhawk/jar_entry.rb
161
+ - lib/sparrowhawk/index.rb
162
+ - lib/sparrowhawk.rb
163
+ - LICENSE
164
+ - README.md
165
+ - CHANGELOG.md
166
+ has_rdoc: true
167
+ homepage: https://github.com/kofno/Sparrowhawk
168
+ licenses: []
169
+
170
+ post_install_message:
171
+ rdoc_options: []
172
+
173
+ require_paths:
174
+ - lib
175
+ required_ruby_version: !ruby/object:Gem::Requirement
176
+ none: false
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ hash: 3
181
+ segments:
182
+ - 0
183
+ version: "0"
184
+ required_rubygems_version: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ hash: 23
190
+ segments:
191
+ - 1
192
+ - 3
193
+ - 6
194
+ version: 1.3.6
195
+ requirements: []
196
+
197
+ rubyforge_project:
198
+ rubygems_version: 1.3.7
199
+ signing_key:
200
+ specification_version: 3
201
+ summary: An MRI friendly war packaginer for rack applications
202
+ test_files: []
203
+