bowline 0.5.8 → 0.6.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/README.txt +2 -2
- data/Rakefile +3 -2
- data/TODO +2 -0
- data/VERSION +1 -1
- data/assets/bowline.js +131 -68
- data/assets/bowline.test.js +86 -0
- data/bowline.gemspec +15 -17
- data/examples/tweet.rb +3 -1
- data/lib/bowline.rb +9 -5
- data/lib/bowline/app_config.rb +41 -0
- data/lib/bowline/binders.rb +70 -101
- data/lib/bowline/binders/collection.rb +37 -0
- data/lib/bowline/binders/observer.rb +30 -0
- data/lib/bowline/binders/singleton.rb +43 -0
- data/lib/bowline/commands/run.rb +1 -0
- data/lib/bowline/desktop/bridge.rb +4 -4
- data/lib/bowline/desktop/js.rb +7 -3
- data/lib/bowline/desktop/runtime.rb +29 -0
- data/lib/bowline/desktop/window.rb +9 -1
- data/lib/bowline/desktop/window_methods.rb +1 -1
- data/lib/bowline/generators/application.rb +1 -0
- data/lib/bowline/generators/binder.rb +7 -2
- data/lib/bowline/generators/model.rb +1 -1
- data/lib/bowline/helpers.rb +2 -0
- data/lib/bowline/initializer.rb +39 -87
- data/lib/bowline/library.rb +1 -7
- data/lib/bowline/tasks/app.rake +1 -53
- data/lib/bowline/tasks/libs.rake +4 -17
- data/lib/bowline/version.rb +2 -2
- data/lib/bowline/watcher.rb +50 -23
- data/templates/Gemfile +10 -0
- data/templates/config/boot.rb +11 -8
- data/templates/main_window.rb +1 -0
- metadata +20 -15
- data/lib/bowline/dependencies/FAQ.markdown +0 -6
- data/lib/bowline/dependencies/MIT-LICENSE +0 -20
- data/lib/bowline/dependencies/README.markdown +0 -51
- data/lib/bowline/dependencies/TODO.markdown +0 -4
- data/lib/bowline/dependencies/lib/dependencies.rb +0 -6
- data/lib/bowline/dependencies/lib/dependencies/dependency.rb +0 -12
- data/lib/bowline/dependencies/lib/dependencies/repository.rb +0 -64
- data/lib/bowline/dependencies/lib/ext/rubygems.rb +0 -116
- data/lib/bowline/ext/class.rb +0 -51
- data/lib/bowline/ext/string.rb +0 -9
- data/lib/bowline/local_model.rb +0 -142
- data/lib/bowline/tasks/gems.rake +0 -36
data/lib/bowline/version.rb
CHANGED
data/lib/bowline/watcher.rb
CHANGED
@@ -19,39 +19,66 @@ module Bowline
|
|
19
19
|
# MyClass.on_update { puts 'update' }
|
20
20
|
# MyClass.new.on_create { puts 'create' }
|
21
21
|
module Base
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
def
|
27
|
-
|
28
|
-
# Because define_method only takes a block,
|
29
|
-
# which doesn't accept multiple arguments
|
30
|
-
script = <<-RUBY
|
31
|
-
def #{name}(*args, &block)
|
32
|
-
watcher.append(:#{name}, *args, &block)
|
33
|
-
end
|
34
|
-
RUBY
|
35
|
-
instance_eval script
|
36
|
-
class_eval script
|
37
|
-
end
|
22
|
+
def self.extended(base)
|
23
|
+
base.send :extend, ClassMethods
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.included(base)
|
27
|
+
base.send :extend, InstanceMethods
|
38
28
|
end
|
39
29
|
|
40
30
|
def watcher
|
41
31
|
@watcher ||= Watcher.new
|
42
32
|
end
|
33
|
+
|
34
|
+
module ClassMethods
|
35
|
+
# Create a helper method to easily add new callbacks.
|
36
|
+
# Example:
|
37
|
+
# watch :on_load
|
38
|
+
# on_load { puts "Loaded!" }
|
39
|
+
def watch(*names)
|
40
|
+
names.each do |name|
|
41
|
+
# Because define_method only takes a block,
|
42
|
+
# which doesn't accept multiple arguments
|
43
|
+
script = <<-RUBY
|
44
|
+
def #{name}(*args, &block)
|
45
|
+
watcher.append(:#{name}, *args, &block)
|
46
|
+
end
|
47
|
+
RUBY
|
48
|
+
instance_eval script
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
module InstanceMethods #:nodoc:
|
54
|
+
def watch(*names)
|
55
|
+
names.each do |name|
|
56
|
+
script = <<-RUBY
|
57
|
+
def #{name}(*args, &block)
|
58
|
+
watcher.append(:#{name}, *args, &block)
|
59
|
+
end
|
60
|
+
RUBY
|
61
|
+
class_eval script
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
43
65
|
end
|
44
66
|
|
45
67
|
class Callback
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
68
|
+
|
69
|
+
attr_reader :event, :prok, :oneshot
|
70
|
+
|
71
|
+
def initialize(watcher, event, prok, oneshot = false)
|
72
|
+
@watcher = watcher
|
73
|
+
@event = event
|
74
|
+
@prok = prok
|
75
|
+
@oneshot = oneshot
|
50
76
|
end
|
51
77
|
|
52
78
|
# Execute callback
|
53
79
|
def call(*args)
|
54
|
-
|
80
|
+
prok.call(*args)
|
81
|
+
remove if oneshot
|
55
82
|
end
|
56
83
|
|
57
84
|
# Remove callback from watcher
|
@@ -65,8 +92,8 @@ module Bowline
|
|
65
92
|
end
|
66
93
|
|
67
94
|
# Add new method/proc to a specific event.
|
68
|
-
def append(event, method = nil, &block)
|
69
|
-
callback = Callback.new(self, event, method||block)
|
95
|
+
def append(event, method = nil, oneshot = false, &block)
|
96
|
+
callback = Callback.new(self, event, method||block, oneshot)
|
70
97
|
(@listeners[event] ||= []) << callback
|
71
98
|
callback
|
72
99
|
end
|
data/templates/Gemfile
ADDED
data/templates/config/boot.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
|
-
# Don't change this file!
|
2
|
-
# Configure your app in config/environment.rb
|
3
|
-
|
4
1
|
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), "..")) unless defined?(APP_ROOT)
|
5
|
-
local_path = File.join(APP_ROOT, *%w{vendor bowline lib bowline.rb})
|
6
2
|
|
7
|
-
|
8
|
-
|
3
|
+
# Use Bundler (preferred)
|
4
|
+
environment = File.expand_path("../../vendor/gems/environment", __FILE__)
|
5
|
+
if File.exist?("#{environment}.rb")
|
6
|
+
require environment
|
7
|
+
|
8
|
+
# Use RubyGems
|
9
9
|
else
|
10
10
|
require "rubygems"
|
11
|
-
require "
|
12
|
-
|
11
|
+
require "bundler"
|
12
|
+
Bundler.setup
|
13
|
+
end
|
14
|
+
|
15
|
+
require "bowline"
|
data/templates/main_window.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bowline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex MacCaw
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-
|
12
|
+
date: 2010-02-10 00:00:00 +00:00
|
13
13
|
default_executable: bowline-gen
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -30,7 +30,7 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 3.0.0.beta
|
34
34
|
version:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: rubyzip2
|
@@ -42,6 +42,16 @@ dependencies:
|
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: 2.0.1
|
44
44
|
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: supermodel
|
47
|
+
type: :runtime
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0"
|
54
|
+
version:
|
45
55
|
description: Ruby/JS GUI framework
|
46
56
|
email: alex@leadthinking.com
|
47
57
|
executables:
|
@@ -63,6 +73,7 @@ files:
|
|
63
73
|
- assets/bowline.js
|
64
74
|
- assets/bowline.menu.js
|
65
75
|
- assets/bowline.state.js
|
76
|
+
- assets/bowline.test.js
|
66
77
|
- assets/bowline.view.js
|
67
78
|
- assets/jquery.chain.js
|
68
79
|
- assets/jquery.dataset.js
|
@@ -79,19 +90,15 @@ files:
|
|
79
90
|
- examples/twitter.html
|
80
91
|
- examples/users.rb
|
81
92
|
- lib/bowline.rb
|
93
|
+
- lib/bowline/app_config.rb
|
82
94
|
- lib/bowline/binders.rb
|
95
|
+
- lib/bowline/binders/collection.rb
|
96
|
+
- lib/bowline/binders/observer.rb
|
97
|
+
- lib/bowline/binders/singleton.rb
|
83
98
|
- lib/bowline/commands/build.rb
|
84
99
|
- lib/bowline/commands/console.rb
|
85
100
|
- lib/bowline/commands/generate.rb
|
86
101
|
- lib/bowline/commands/run.rb
|
87
|
-
- lib/bowline/dependencies/FAQ.markdown
|
88
|
-
- lib/bowline/dependencies/MIT-LICENSE
|
89
|
-
- lib/bowline/dependencies/README.markdown
|
90
|
-
- lib/bowline/dependencies/TODO.markdown
|
91
|
-
- lib/bowline/dependencies/lib/dependencies.rb
|
92
|
-
- lib/bowline/dependencies/lib/dependencies/dependency.rb
|
93
|
-
- lib/bowline/dependencies/lib/dependencies/repository.rb
|
94
|
-
- lib/bowline/dependencies/lib/ext/rubygems.rb
|
95
102
|
- lib/bowline/desktop.rb
|
96
103
|
- lib/bowline/desktop/app.rb
|
97
104
|
- lib/bowline/desktop/bridge.rb
|
@@ -103,14 +110,13 @@ files:
|
|
103
110
|
- lib/bowline/desktop/misc.rb
|
104
111
|
- lib/bowline/desktop/network.rb
|
105
112
|
- lib/bowline/desktop/proxy.rb
|
113
|
+
- lib/bowline/desktop/runtime.rb
|
106
114
|
- lib/bowline/desktop/sound.rb
|
107
115
|
- lib/bowline/desktop/window.rb
|
108
116
|
- lib/bowline/desktop/window_manager.rb
|
109
117
|
- lib/bowline/desktop/window_methods.rb
|
110
118
|
- lib/bowline/ext/array.rb
|
111
|
-
- lib/bowline/ext/class.rb
|
112
119
|
- lib/bowline/ext/object.rb
|
113
|
-
- lib/bowline/ext/string.rb
|
114
120
|
- lib/bowline/generators.rb
|
115
121
|
- lib/bowline/generators/application.rb
|
116
122
|
- lib/bowline/generators/binder.rb
|
@@ -121,18 +127,17 @@ files:
|
|
121
127
|
- lib/bowline/helpers.rb
|
122
128
|
- lib/bowline/initializer.rb
|
123
129
|
- lib/bowline/library.rb
|
124
|
-
- lib/bowline/local_model.rb
|
125
130
|
- lib/bowline/logging.rb
|
126
131
|
- lib/bowline/platform.rb
|
127
132
|
- lib/bowline/tasks/app.rake
|
128
133
|
- lib/bowline/tasks/bowline.rb
|
129
134
|
- lib/bowline/tasks/database.rake
|
130
|
-
- lib/bowline/tasks/gems.rake
|
131
135
|
- lib/bowline/tasks/libs.rake
|
132
136
|
- lib/bowline/tasks/log.rake
|
133
137
|
- lib/bowline/tasks/misc.rake
|
134
138
|
- lib/bowline/version.rb
|
135
139
|
- lib/bowline/watcher.rb
|
140
|
+
- templates/Gemfile
|
136
141
|
- templates/Rakefile
|
137
142
|
- templates/binder.rb
|
138
143
|
- templates/config/application.yml
|
@@ -1,20 +0,0 @@
|
|
1
|
-
Copyright (c) 2009 [name of plugin creator]
|
2
|
-
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
-
a copy of this software and associated documentation files (the
|
5
|
-
"Software"), to deal in the Software without restriction, including
|
6
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
-
permit persons to whom the Software is furnished to do so, subject to
|
9
|
-
the following conditions:
|
10
|
-
|
11
|
-
The above copyright notice and this permission notice shall be
|
12
|
-
included in all copies or substantial portions of the Software.
|
13
|
-
|
14
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -1,51 +0,0 @@
|
|
1
|
-
Dependencies
|
2
|
-
============
|
3
|
-
|
4
|
-
A port of Merb's dependency system to a Rails plugin.
|
5
|
-
|
6
|
-
Usage
|
7
|
-
=====
|
8
|
-
|
9
|
-
1. Install the plugin
|
10
|
-
|
11
|
-
script/plugin install git://github.com/ddollar/dependencies.git
|
12
|
-
|
13
|
-
2. Add the following line to your config/environment.rb
|
14
|
-
|
15
|
-
config.plugins = [:dependencies, :all]
|
16
|
-
|
17
|
-
3. Add the following line to your .gitignore
|
18
|
-
|
19
|
-
gems
|
20
|
-
|
21
|
-
4. Create a config/dependencies.rb file that looks like:
|
22
|
-
|
23
|
-
dependency 'gem'
|
24
|
-
dependency 'gem', '1.0.1'
|
25
|
-
dependency 'gem', :require_as => 'Gem'
|
26
|
-
dependency 'gem', :only => %w(test staging)
|
27
|
-
dependency 'gem', :except => 'production'
|
28
|
-
|
29
|
-
with_options(:only => 'test') do |test|
|
30
|
-
test.dependency 'tester-gem'
|
31
|
-
end
|
32
|
-
|
33
|
-
5. Remove or comment out any config.gem lines from config/environment.rb or config/environments/*.rb
|
34
|
-
|
35
|
-
6. Install the gems into your project and keep them up to date using:
|
36
|
-
|
37
|
-
rake dependencies:sync
|
38
|
-
|
39
|
-
7. Alternatively you can use the following rake task to read your existing config.gem declarations and output a file suitable for this plugin. This task will appropriately handle any gems that you are currently loading on a per-environment basis as well.
|
40
|
-
|
41
|
-
rake dependencies:import
|
42
|
-
|
43
|
-
|
44
|
-
About
|
45
|
-
=====
|
46
|
-
|
47
|
-
Initial idea and Rubygems extension code from [Merb](http://merbivore.com/)
|
48
|
-
|
49
|
-
Rewritten for Rails by [David Dollar](http://daviddollar.org) ([@ddollar](http://twitter.com/ddollar))
|
50
|
-
|
51
|
-
Documentation, testing, ideas by Steven Soroka ([@ssoroka](http://twitter.com/ssoroka))
|
@@ -1,64 +0,0 @@
|
|
1
|
-
class Dependencies::Repository
|
2
|
-
|
3
|
-
def initialize(base)
|
4
|
-
@paths = {
|
5
|
-
:gems => File.join(base),
|
6
|
-
:bin => File.join(base, 'bin'),
|
7
|
-
:specs => File.join(base, 'specifications')
|
8
|
-
}
|
9
|
-
end
|
10
|
-
|
11
|
-
def index
|
12
|
-
@index ||= reload_index!
|
13
|
-
end
|
14
|
-
|
15
|
-
def reload_index!
|
16
|
-
@index = ::Gem::SourceIndex.new.load_gems_in(@paths[:specs])
|
17
|
-
end
|
18
|
-
|
19
|
-
def gem(name, versions=[])
|
20
|
-
::Gem::Dependency.new(name, versions)
|
21
|
-
end
|
22
|
-
|
23
|
-
def search(gem)
|
24
|
-
index.search(gem)
|
25
|
-
end
|
26
|
-
|
27
|
-
def install(gem)
|
28
|
-
reload_index!
|
29
|
-
return if index.search(gem).last
|
30
|
-
|
31
|
-
installer = ::Gem::DependencyInstaller.new(
|
32
|
-
:bin_dir => @paths[:bin],
|
33
|
-
:install_dir => @paths[:gems],
|
34
|
-
:user_install => false)
|
35
|
-
|
36
|
-
begin
|
37
|
-
installer.install gem.name, gem.version_requirements
|
38
|
-
rescue ::Gem::GemNotFoundException => e
|
39
|
-
puts "Cannot find #{gem.name} #{gem.version_requirements}"
|
40
|
-
rescue ::Gem::RemoteFetcher::FetchError => e
|
41
|
-
puts "Problem with fetch, retrying..."
|
42
|
-
retry
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def uninstall(name, version)
|
47
|
-
uninstaller = ::Gem::Uninstaller.new(name,
|
48
|
-
:version => version,
|
49
|
-
:bin_dir => @paths[:bin],
|
50
|
-
:install_dir => @paths[:gems],
|
51
|
-
:ignore => true,
|
52
|
-
:executables => true
|
53
|
-
)
|
54
|
-
uninstaller.uninstall
|
55
|
-
end
|
56
|
-
|
57
|
-
def installed
|
58
|
-
Dir[File.join(@paths[:gems], 'gems', '*')].map! { |n| File.basename(n) }
|
59
|
-
end
|
60
|
-
|
61
|
-
def gems
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|
@@ -1,116 +0,0 @@
|
|
1
|
-
require 'erb'
|
2
|
-
require 'rubygems'
|
3
|
-
require 'rubygems/uninstaller'
|
4
|
-
require 'rubygems/dependency_installer'
|
5
|
-
|
6
|
-
# We only require this in 'rake gems:sync' since
|
7
|
-
# it contains some advanced Gem features that aren't
|
8
|
-
# available in earlier versions, such as pre_install_hooks
|
9
|
-
|
10
|
-
Gem.pre_install_hooks.push(proc do |installer|
|
11
|
-
name = installer.spec.name
|
12
|
-
|
13
|
-
puts "+ #{name}"
|
14
|
-
|
15
|
-
if $GEMS && versions = ($GEMS.assoc(name) || [])[1]
|
16
|
-
dep = Gem::Dependency.new(name, versions)
|
17
|
-
unless dep.version_requirements.satisfied_by?(installer.spec.version)
|
18
|
-
raise "Cannot install #{installer.spec.full_name} " \
|
19
|
-
"for #{$INSTALLING}; " \
|
20
|
-
"you required #{dep}"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end)
|
24
|
-
|
25
|
-
class ::Gem::Uninstaller #:nodoc:
|
26
|
-
def self._with_silent_ui
|
27
|
-
|
28
|
-
ui = Gem::DefaultUserInteraction.ui
|
29
|
-
def ui.say(str)
|
30
|
-
puts "- #{str}"
|
31
|
-
end
|
32
|
-
|
33
|
-
yield
|
34
|
-
|
35
|
-
class << Gem::DefaultUserInteraction.ui
|
36
|
-
remove_method :say
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def self._uninstall(source_index, name, op, version)
|
41
|
-
unless source_index.find_name(name, "#{op} #{version}").empty?
|
42
|
-
uninstaller = Gem::Uninstaller.new(
|
43
|
-
name,
|
44
|
-
:version => "#{op} #{version}",
|
45
|
-
:install_dir => File.join(Dir.pwd, "vendor", "gems"),
|
46
|
-
:all => true,
|
47
|
-
:ignore => true,
|
48
|
-
:executables => true
|
49
|
-
)
|
50
|
-
_with_silent_ui { uninstaller.uninstall }
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def self._uninstall_others(source_index, name, version)
|
55
|
-
_uninstall(source_index, name, "<", version)
|
56
|
-
_uninstall(source_index, name, ">", version)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
Gem.post_install_hooks.push(proc do |installer|
|
61
|
-
source_index = installer.instance_variable_get("@source_index")
|
62
|
-
::Gem::Uninstaller._uninstall_others(
|
63
|
-
source_index, installer.spec.name, installer.spec.version
|
64
|
-
)
|
65
|
-
end)
|
66
|
-
|
67
|
-
class ::Gem::DependencyInstaller #:nodoc:
|
68
|
-
alias old_fg find_gems_with_sources
|
69
|
-
|
70
|
-
def find_gems_with_sources(dep)
|
71
|
-
if @source_index.any? { |_, installed_spec|
|
72
|
-
installed_spec.satisfies_requirement?(dep)
|
73
|
-
}
|
74
|
-
return []
|
75
|
-
end
|
76
|
-
|
77
|
-
old_fg(dep)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
class ::Gem::SpecFetcher #:nodoc:
|
82
|
-
alias old_fetch fetch
|
83
|
-
def fetch(*args) # in rubygems 1.3.2 fetch takes 4 parameters
|
84
|
-
dependency, all, matching_platform, prerelease = *args
|
85
|
-
idx = Gem::SourceIndex.from_installed_gems
|
86
|
-
|
87
|
-
reqs = dependency.version_requirements.requirements
|
88
|
-
|
89
|
-
if reqs.size == 1 && reqs[0][0] == "="
|
90
|
-
dep = idx.search(dependency).sort.last
|
91
|
-
end
|
92
|
-
|
93
|
-
if dep
|
94
|
-
file = dep.loaded_from.dup
|
95
|
-
file.gsub!(/specifications/, "cache")
|
96
|
-
file.gsub!(/gemspec$/, "gem")
|
97
|
-
spec = ::Gem::Format.from_file_by_path(file).spec
|
98
|
-
[[spec, file]]
|
99
|
-
else
|
100
|
-
old_fetch(*args)
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
class ::Gem::Specification #:nodoc:
|
106
|
-
def recursive_dependencies(from, index = Gem.source_index)
|
107
|
-
specs = self.runtime_dependencies.map do |dep|
|
108
|
-
spec = index.search(dep).last
|
109
|
-
unless spec
|
110
|
-
raise "Needed #{dep} for #{from}, but could not find it"
|
111
|
-
end
|
112
|
-
spec
|
113
|
-
end
|
114
|
-
specs + specs.map {|s| s.recursive_dependencies(self, index)}.flatten.uniq
|
115
|
-
end
|
116
|
-
end
|