mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Rails::Plugin has gone
This commit is contained in:
parent
b627923b3c
commit
dad7fdc573
37 changed files with 30 additions and 1186 deletions
|
@ -539,7 +539,7 @@ end
|
|||
|
||||
namespace :railties do
|
||||
namespace :install do
|
||||
# desc "Copies missing migrations from Railties (e.g. plugins, engines). You can specify Railties to use with FROM=railtie1,railtie2"
|
||||
# desc "Copies missing migrations from Railties (e.g. engines). You can specify Railties to use with FROM=railtie1,railtie2"
|
||||
task :migrations => :'db:load_config' do
|
||||
to_load = ENV['FROM'].blank? ? :all : ENV['FROM'].split(",").map {|n| n.strip }
|
||||
railties = ActiveSupport::OrderedHash.new
|
||||
|
|
|
@ -1,5 +1,11 @@
|
|||
## Rails 4.0.0 (unreleased) ##
|
||||
|
||||
* Rails::Plugin has gone. Instead of adding plugins to vendor/plugins use gems or bundler with path or git dependencies. *Santiago Pastorino*
|
||||
|
||||
## Rails 3.2.0 (unreleased) ##
|
||||
|
||||
* Rails::Plugin is deprecated and will be removed in Rails 4.0. Instead of adding plugins to vendor/plugins use gems or bundler with path or git dependencies. *Santiago Pastorino*
|
||||
|
||||
* Guides are available as a single .mobi for the Kindle and free Kindle readers apps. *Michael Pearson & Xavier Noria*
|
||||
|
||||
* Allow scaffold/model/migration generators to accept a "index" and "uniq" modifiers, as in: "tracking_id:integer:uniq" in order to generate (unique) indexes. Some types also accept custom options, for instance, you can specify the precision and scale for decimals as "price:decimal{7,2}". *Dmitrii Samoilov*
|
||||
|
|
|
@ -191,7 +191,6 @@ The default directory structure of a generated Ruby on Rails application:
|
|||
`-- vendor
|
||||
|-- assets
|
||||
`-- stylesheets
|
||||
`-- plugins
|
||||
|
||||
app
|
||||
Holds all the code that's specific to this particular application.
|
||||
|
@ -256,6 +255,5 @@ test
|
|||
directory.
|
||||
|
||||
vendor
|
||||
External libraries that the application depends on. Also includes the plugins
|
||||
subdirectory. If the app has frozen rails, those gems also go here, under
|
||||
vendor/rails/. This directory is in the load path.
|
||||
External libraries that the application depends on. If the app has frozen rails,
|
||||
those gems also go here, under vendor/rails/. This directory is in the load path.
|
||||
|
|
|
@ -18,10 +18,6 @@ module Blog
|
|||
# Custom directories with classes and modules you want to be autoloadable.
|
||||
# config.autoload_paths += %W(#{config.root}/extras)
|
||||
|
||||
# Only load the plugins named here, in the order given (default is alphabetical).
|
||||
# :all can be used as a placeholder for all plugins not explicitly named.
|
||||
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]
|
||||
|
||||
# Activate observers that should always be running.
|
||||
# config.active_record.observers = :cacher, :garbage_collector, :forum_observer
|
||||
|
||||
|
|
|
@ -67,6 +67,8 @@ When running a multi-user, multi-account application, it's a great help to be ab
|
|||
|
||||
h3. Railties
|
||||
|
||||
* Rails::Plugin is deprecated and will be removed in Rails 4.0. Instead of adding plugins to vendor/plugins use gems or bundler with path or git dependencies.
|
||||
|
||||
* Speed up development by only reloading classes if dependencies files changed. This can be turned off by setting <tt>config.reload_classes_only_on_change</tt> to false.
|
||||
|
||||
* New applications get a flag <tt>config.active_record.auto_explain_threshold_in_seconds</tt> in the environments configuration files. With a value of <tt>0.5</tt> in <tt>development.rb</tt> and commented out in <tt>production.rb</tt>. No mention in <tt>test.rb</tt>.
|
||||
|
|
|
@ -134,13 +134,6 @@ h4. Regular Font
|
|||
|
||||
When "true" and "false" are English words rather than Ruby keywords use a regular font:
|
||||
|
||||
<ruby>
|
||||
# If <tt>reload_plugins?</tt> is false, add this to your plugin's <tt>init.rb</tt>
|
||||
# to make it reloadable:
|
||||
#
|
||||
# Dependencies.load_once_paths.delete lib_path
|
||||
</ruby>
|
||||
|
||||
h3. Description Lists
|
||||
|
||||
In lists of options, parameters, etc. use a hyphen between the item and its description (reads better than a colon because normally options are symbols):
|
||||
|
|
|
@ -45,8 +45,6 @@ $ rails new commandsapp
|
|||
...
|
||||
create tmp/cache
|
||||
create tmp/pids
|
||||
create vendor/plugins
|
||||
create vendor/plugins/.gitkeep
|
||||
</shell>
|
||||
|
||||
Rails will set you up with what seems like a huge amount of stuff for such a tiny command! You've got the entire Rails directory structure now with all the code you need to run our simple application right out of the box.
|
||||
|
@ -295,18 +293,6 @@ h4. +rails dbconsole+
|
|||
|
||||
You can also use the alias "db" to invoke the dbconsole: <tt>rails db</tt>.
|
||||
|
||||
h4. +rails plugin+
|
||||
|
||||
The +rails plugin+ command simplifies plugin management. Plugins can be installed by name or their repository URLs. You need to have Git installed if you want to install a plugin from a Git repo. The same holds for Subversion too.
|
||||
|
||||
<shell>
|
||||
$ rails plugin install https://github.com/technoweenie/acts_as_paranoid.git
|
||||
+ ./CHANGELOG
|
||||
+ ./MIT-LICENSE
|
||||
...
|
||||
...
|
||||
</shell>
|
||||
|
||||
h4. +rails runner+
|
||||
|
||||
<tt>runner</tt> runs Ruby code in the context of Rails non-interactively. For instance:
|
||||
|
@ -415,8 +401,6 @@ The +doc:+ namespace has the tools to generate documentation for your app, API d
|
|||
* +rake doc:app+ generates documentation for your application in +doc/app+.
|
||||
* +rake doc:guides+ generates Rails guides in +doc/guides+.
|
||||
* +rake doc:rails+ generates API documentation for Rails in +doc/api+.
|
||||
* +rake doc:plugins+ generates API documentation for all the plugins installed in the application in +doc/plugins+.
|
||||
* +rake doc:clobber_plugins+ removes the generated documentation for all plugins.
|
||||
|
||||
h4. +notes+
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ h4. Rails General Configuration
|
|||
|
||||
These configuration methods are to be called on a +Rails::Railtie+ object, such as a subclass of +Rails::Engine+ or +Rails::Application+.
|
||||
|
||||
* +config.after_initialize+ takes a block which will be run _after_ Rails has finished initializing the application. That includes the initialization of the framework itself, plugins, engines, and all the application's initializers in +config/initializers+. Note that this block _will_ be run for rake tasks. Useful for configuring values set up by other initializers:
|
||||
* +config.after_initialize+ takes a block which will be run _after_ Rails has finished initializing the application. That includes the initialization of the framework itself, engines, and all the application's initializers in +config/initializers+. Note that this block _will_ be run for rake tasks. Useful for configuring values set up by other initializers:
|
||||
|
||||
<ruby>
|
||||
config.after_initialize do
|
||||
|
@ -98,14 +98,10 @@ NOTE. The +config.asset_path+ configuration is ignored if the asset pipeline is
|
|||
|
||||
* +config.middleware+ allows you to configure the application's middleware. This is covered in depth in the "Configuring Middleware":#configuring-middleware section below.
|
||||
|
||||
* +config.plugins+ accepts the list of plugins to load. The default is +nil+ in which case all plugins will be loaded. If this is set to +[]+, no plugins will be loaded. Otherwise, plugins will be loaded in the order specified. This option lets you enforce some particular loading order, useful when dependencies between plugins require it. For that use case, put first the plugins you want to be loaded in a certain order, and then the special symbol +:all+ to have the rest loaded without the need to specify them.
|
||||
|
||||
* +config.preload_frameworks+ enables or disables preloading all frameworks at startup. Enabled by +config.threadsafe!+. Defaults to +nil+, so is disabled.
|
||||
|
||||
* +config.reload_classes_only_on_change+ enables or disables reloading of classes only when tracked files change. By default tracks everything on autoload paths and is set to true. If +config.cache_classes+ is true, this option is ignored.
|
||||
|
||||
* +config.reload_plugins+ enables or disables plugin reloading. Defaults to false.
|
||||
|
||||
* +config.secret_token+ used for specifying a key which allows sessions for the application to be verified against a known secure key to prevent tampering. Applications get +config.secret_token+ initialized to a random key in +config/initializers/secret_token.rb+.
|
||||
|
||||
* +config.serve_static_assets+ configures Rails itself to serve static assets. Defaults to true, but in the production environment is turned off as the server software (e.g. Nginx or Apache) used to run the application should serve static assets instead. Unlike the default setting set this to true when running (absolutely not recommended!) or testing your app in production mode using WEBrick. Otherwise you won´t be able use page caching and requests for files that exist regularly under the public directory will anyway hit your Rails app.
|
||||
|
@ -462,7 +458,7 @@ Some parts of Rails can also be configured externally by supplying environment v
|
|||
|
||||
h3. Using Initializer Files
|
||||
|
||||
After loading the framework and any gems and plugins in your application, Rails turns to loading initializers. An initializer is any Ruby file stored under +config/initializers+ in your application. You can use initializers to hold configuration settings that should be made after all of the frameworks, plugins and gems are loaded, such as options to configure settings for these parts.
|
||||
After loading the framework and any gems in your application, Rails turns to loading initializers. An initializer is any Ruby file stored under +config/initializers+ in your application. You can use initializers to hold configuration settings that should be made after all of the frameworks and gems are loaded, such as options to configure settings for these parts.
|
||||
|
||||
NOTE: You can use subfolders to organize your initializers if you like, because Rails will look into the whole file hierarchy from the initializers folder on down.
|
||||
|
||||
|
@ -617,7 +613,7 @@ The error occurred while evaluating nil.each
|
|||
|
||||
*+prepend_helpers_path+* Adds the directory +app/helpers+ from the application, railties and engines to the lookup path for helpers for the application.
|
||||
|
||||
*+load_config_initializers+* Loads all Ruby files from +config/initializers+ in the application, railties and engines. The files in this directory can be used to hold configuration settings that should be made after all of the frameworks and plugins are loaded.
|
||||
*+load_config_initializers+* Loads all Ruby files from +config/initializers+ in the application, railties and engines. The files in this directory can be used to hold configuration settings that should be made after all of the frameworks are loaded.
|
||||
|
||||
*+engines_blank_point+* Provides a point-in-initialization to hook into if you wish to do anything before engines are loaded. After this point, all railtie and engine initializers are ran.
|
||||
|
||||
|
|
|
@ -406,22 +406,6 @@ The following are methods available for both generators and templates for Rails.
|
|||
|
||||
NOTE: Methods provided by Thor are not covered this guide and can be found in "Thor's documentation":http://rdoc.info/github/wycats/thor/master/Thor/Actions.html
|
||||
|
||||
h4. +plugin+
|
||||
|
||||
+plugin+ will install a plugin into the current application.
|
||||
|
||||
<ruby>
|
||||
plugin("dynamic-form", :git => "git://github.com/rails/dynamic-form.git")
|
||||
</ruby>
|
||||
|
||||
Available options are:
|
||||
|
||||
* +:git+ - Takes the path to the git repository where this plugin can be found.
|
||||
* +:branch+ - The name of the branch of the git repository where the plugin is found.
|
||||
* +:submodule+ - Set to +true+ for the plugin to be installed as a submodule. Defaults to +false+.
|
||||
* +:svn+ - Takes the path to the svn repository where this plugin can be found.
|
||||
* +:revision+ - The revision of the plugin in an SVN repository.
|
||||
|
||||
h4. +gem+
|
||||
|
||||
Specifies a gem dependency of the application.
|
||||
|
|
|
@ -290,7 +290,7 @@ rundown on the function of each of the files and folders that Rails created by d
|
|||
|script/|Contains the rails script that starts your app and can contain other scripts you use to deploy or run your application.|
|
||||
|test/|Unit tests, fixtures, and other test apparatus. These are covered in "Testing Rails Applications":testing.html|
|
||||
|tmp/|Temporary files|
|
||||
|vendor/|A place for all third-party code. In a typical Rails application, this includes Ruby Gems, the Rails source code (if you optionally install it into your project) and plugins containing additional prepackaged functionality.|
|
||||
|vendor/|A place for all third-party code. In a typical Rails application, this includes Ruby Gems and the Rails source code (if you optionally install it into your project).|
|
||||
|
||||
h4. Configuring a Database
|
||||
|
||||
|
|
|
@ -30,16 +30,6 @@ Before you continue, take a moment to decide if your new plugin will be potentia
|
|||
* If your plugin is specific to your application, your new plugin will be a _vendored plugin_.
|
||||
* If you think your plugin may be used across applications, build it as a _gemified plugin_.
|
||||
|
||||
h4. Either generate a vendored plugin...
|
||||
|
||||
Use the +rails generate plugin+ command in your Rails root directory
|
||||
to create a new plugin that will live in the +vendor/plugins+
|
||||
directory. See usage and options by asking for help:
|
||||
|
||||
<shell>
|
||||
$ rails generate plugin --help
|
||||
</shell>
|
||||
|
||||
h4. Or generate a gemified plugin.
|
||||
|
||||
Writing your Rails plugin as a gem, rather than as a vendored plugin,
|
||||
|
@ -412,30 +402,6 @@ After running +bundle install+, your gem functionality will be available to the
|
|||
When the gem is ready to be shared as a formal release, it can be published to "RubyGems":http://www.rubygems.org.
|
||||
For more information about publishing gems to RubyGems, see: "http://blog.thepete.net/2010/11/creating-and-publishing-your-first-ruby.html":http://blog.thepete.net/2010/11/creating-and-publishing-your-first-ruby.html
|
||||
|
||||
h3. Non-Gem Plugins
|
||||
|
||||
Non-gem plugins are useful for functionality that won't be shared with another project. Keeping your custom functionality in the
|
||||
vendor/plugins directory un-clutters the rest of the application.
|
||||
|
||||
Move the directory that you created for the gem based plugin into the vendor/plugins directory of a generated Rails application, create a vendor/plugins/yaffle/init.rb file that contains "require 'yaffle'" and everything will still work.
|
||||
|
||||
<ruby>
|
||||
# yaffle/init.rb
|
||||
|
||||
require 'yaffle'
|
||||
</ruby>
|
||||
|
||||
You can test this by changing to the Rails application that you added the plugin to and starting a rails console. Once in the
|
||||
console we can check to see if the String has an instance method to_squawk:
|
||||
|
||||
<shell>
|
||||
$ cd my_app
|
||||
$ rails console
|
||||
$ "Rails plugins are easy!".to_squawk
|
||||
</shell>
|
||||
|
||||
You can also remove the .gemspec, Gemfile and Gemfile.lock files as they will no longer be needed.
|
||||
|
||||
h3. RDoc Documentation
|
||||
|
||||
Once your plugin is stable and you are ready to deploy do everyone else a favor and document it! Luckily, writing documentation for your plugin is easy.
|
||||
|
@ -461,4 +427,3 @@ h4. References
|
|||
* "Using Gemspecs As Intended":http://yehudakatz.com/2010/04/02/using-gemspecs-as-intended/
|
||||
* "Gemspec Reference":http://docs.rubygems.org/read/chapter/20
|
||||
* "GemPlugins":http://www.mbleigh.com/2008/06/11/gemplugins-a-brief-introduction-to-the-future-of-rails-plugins
|
||||
* "Keeping init.rb thin":http://daddy.platte.name/2007/05/rails-plugins-keep-initrb-thin.html
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
h2. Rails Application Templates
|
||||
|
||||
Application templates are simple Ruby files containing DSL for adding plugins/gems/initializers etc. to your freshly created Rails project or an existing Rails project.
|
||||
Application templates are simple Ruby files containing DSL for adding gems/initializers etc. to your freshly created Rails project or an existing Rails project.
|
||||
|
||||
By referring to this guide, you will be able to:
|
||||
|
||||
|
@ -82,31 +82,6 @@ For example, if you need to source a gem from "http://code.whytheluckystiff.net"
|
|||
add_source "http://code.whytheluckystiff.net"
|
||||
</ruby>
|
||||
|
||||
h4. plugin(name, options = {})
|
||||
|
||||
Installs a plugin to the generated application.
|
||||
|
||||
Plugin can be installed from Git:
|
||||
|
||||
<ruby>
|
||||
plugin 'authentication', :git => 'git://github.com/foor/bar.git'
|
||||
</ruby>
|
||||
|
||||
You can even install plugins as git submodules:
|
||||
|
||||
<ruby>
|
||||
plugin 'authentication', :git => 'git://github.com/foor/bar.git',
|
||||
:submodule => true
|
||||
</ruby>
|
||||
|
||||
Please note that you need to +git :init+ before you can install a plugin as a submodule.
|
||||
|
||||
Or use plain old SVN:
|
||||
|
||||
<ruby>
|
||||
plugin 'usingsvn', :svn => 'svn://example.com/usingsvn/trunk'
|
||||
</ruby>
|
||||
|
||||
h4. vendor/lib/file/initializer(filename, data = nil, &block)
|
||||
|
||||
Adds an initializer to the generated application’s +config/initializers+ directory.
|
||||
|
|
|
@ -738,7 +738,6 @@ You don't need to set up and run your tests by hand on a test-by-test basis. Rai
|
|||
|+rake test:benchmark+ |Benchmark the performance tests|
|
||||
|+rake test:functionals+ |Runs all the functional tests from +test/functional+|
|
||||
|+rake test:integration+ |Runs all the integration tests from +test/integration+|
|
||||
|+rake test:plugins+ |Run all the plugin tests from +vendor/plugins/*/**/test+ (or specify with +PLUGIN=_name_+)|
|
||||
|+rake test:profile+ |Profile the performance tests|
|
||||
|+rake test:recent+ |Tests recent changes|
|
||||
|+rake test:uncommitted+ |Runs all the tests which are uncommitted. Supports Subversion and Git|
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
require 'active_support/core_ext/hash/reverse_merge'
|
||||
require 'fileutils'
|
||||
require 'rails/plugin'
|
||||
require 'rails/engine'
|
||||
|
||||
module Rails
|
||||
|
@ -9,7 +8,7 @@ module Rails
|
|||
#
|
||||
# == Initialization
|
||||
#
|
||||
# Rails::Application is responsible for executing all railties, engines and plugin
|
||||
# Rails::Application is responsible for executing all railties and engines
|
||||
# initializers. It also executes some bootstrap initializers (check
|
||||
# Rails::Application::Bootstrap) and finishing initializers, after all the others
|
||||
# are executed (check Rails::Application::Finisher).
|
||||
|
@ -19,7 +18,7 @@ module Rails
|
|||
# Besides providing the same configuration as Rails::Engine and Rails::Railtie,
|
||||
# the application object has several specific configurations, for example
|
||||
# "allow_concurrency", "cache_classes", "consider_all_requests_local", "filter_parameters",
|
||||
# "logger", "reload_plugins" and so forth.
|
||||
# "logger" and so forth.
|
||||
#
|
||||
# Check Rails::Application::Configuration to see them all.
|
||||
#
|
||||
|
|
|
@ -10,7 +10,7 @@ module Rails
|
|||
:cache_classes, :cache_store, :consider_all_requests_local,
|
||||
:dependency_loading, :exceptions_app, :file_watcher, :filter_parameters,
|
||||
:force_ssl, :helpers_paths, :logger, :log_tags, :preload_frameworks,
|
||||
:railties_order, :relative_url_root, :reload_plugins, :secret_token,
|
||||
:railties_order, :relative_url_root, :secret_token,
|
||||
:serve_static_assets, :ssl_options, :static_cache_control, :session_options,
|
||||
:time_zone, :reload_classes_only_on_change
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ module Rails
|
|||
class Application < Engine
|
||||
class Railties < Rails::Engine::Railties
|
||||
def all(&block)
|
||||
@all ||= railties + engines + plugins
|
||||
@all ||= railties + engines
|
||||
@all.each(&block) if block
|
||||
@all
|
||||
end
|
||||
|
|
|
@ -91,7 +91,7 @@ In addition to those, there are:
|
|||
destroy Undo code generated with "generate" (short-cut alias: "d")
|
||||
benchmarker See how fast a piece of code runs
|
||||
profiler Get profile information from a piece of code
|
||||
plugin Install a plugin
|
||||
plugin new Generates skeleton for developing a Rails plugin
|
||||
runner Run a piece of code in the application environment (short-cut alias: "r")
|
||||
|
||||
All commands can be run with -h (or --help) for more information.
|
||||
|
|
|
@ -1,544 +0,0 @@
|
|||
# Rails Plugin Manager.
|
||||
#
|
||||
# Installing plugins:
|
||||
#
|
||||
# $ rails plugin install continuous_builder asset_timestamping
|
||||
#
|
||||
# Specifying revisions:
|
||||
#
|
||||
# * Subversion revision is a single integer.
|
||||
#
|
||||
# * Git revision format:
|
||||
# - full - 'refs/tags/1.8.0' or 'refs/heads/experimental'
|
||||
# - short: 'experimental' (equivalent to 'refs/heads/experimental')
|
||||
# 'tag 1.8.0' (equivalent to 'refs/tags/1.8.0')
|
||||
#
|
||||
#
|
||||
# This is Free Software, copyright 2005 by Ryan Tomayko (rtomayko@gmail.com)
|
||||
# and is licensed MIT: (http://www.opensource.org/licenses/mit-license.php)
|
||||
|
||||
$verbose = false
|
||||
|
||||
require 'open-uri'
|
||||
require 'fileutils'
|
||||
require 'tempfile'
|
||||
|
||||
include FileUtils
|
||||
|
||||
class RailsEnvironment
|
||||
attr_reader :root
|
||||
|
||||
def initialize(dir)
|
||||
@root = dir
|
||||
end
|
||||
|
||||
def self.find(dir=nil)
|
||||
dir ||= pwd
|
||||
while dir.length > 1
|
||||
return new(dir) if File.exist?(File.join(dir, 'config', 'environment.rb'))
|
||||
dir = File.dirname(dir)
|
||||
end
|
||||
end
|
||||
|
||||
def self.default
|
||||
@default ||= find
|
||||
end
|
||||
|
||||
def self.default=(rails_env)
|
||||
@default = rails_env
|
||||
end
|
||||
|
||||
def install(name_uri_or_plugin)
|
||||
if name_uri_or_plugin.is_a? String
|
||||
if name_uri_or_plugin =~ /:\/\//
|
||||
plugin = Plugin.new(name_uri_or_plugin)
|
||||
else
|
||||
plugin = Plugins[name_uri_or_plugin]
|
||||
end
|
||||
else
|
||||
plugin = name_uri_or_plugin
|
||||
end
|
||||
if plugin
|
||||
plugin.install
|
||||
else
|
||||
puts "Plugin not found: #{name_uri_or_plugin}"
|
||||
end
|
||||
end
|
||||
|
||||
def use_svn?
|
||||
require 'active_support/core_ext/kernel'
|
||||
silence_stderr {`svn --version` rescue nil}
|
||||
!$?.nil? && $?.success?
|
||||
end
|
||||
|
||||
def use_externals?
|
||||
use_svn? && File.directory?("#{root}/vendor/plugins/.svn")
|
||||
end
|
||||
|
||||
def use_checkout?
|
||||
# this is a bit of a guess. we assume that if the rails environment
|
||||
# is under subversion then they probably want the plugin checked out
|
||||
# instead of exported. This can be overridden on the command line
|
||||
File.directory?("#{root}/.svn")
|
||||
end
|
||||
|
||||
def best_install_method
|
||||
return :http unless use_svn?
|
||||
case
|
||||
when use_externals? then :externals
|
||||
when use_checkout? then :checkout
|
||||
else :export
|
||||
end
|
||||
end
|
||||
|
||||
def externals
|
||||
return [] unless use_externals?
|
||||
ext = `svn propget svn:externals "#{root}/vendor/plugins"`
|
||||
lines = ext.respond_to?(:lines) ? ext.lines : ext
|
||||
lines.reject{ |line| line.strip == '' }.map do |line|
|
||||
line.strip.split(/\s+/, 2)
|
||||
end
|
||||
end
|
||||
|
||||
def externals=(items)
|
||||
unless items.is_a? String
|
||||
items = items.map{|name,uri| "#{name.ljust(29)} #{uri.chomp('/')}"}.join("\n")
|
||||
end
|
||||
Tempfile.open("svn-set-prop") do |file|
|
||||
file.write(items)
|
||||
file.flush
|
||||
system("svn propset -q svn:externals -F \"#{file.path}\" \"#{root}/vendor/plugins\"")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class Plugin
|
||||
attr_reader :name, :uri
|
||||
|
||||
def initialize(uri, name = nil)
|
||||
@uri = uri
|
||||
guess_name(uri)
|
||||
end
|
||||
|
||||
def self.find(name)
|
||||
new(name)
|
||||
end
|
||||
|
||||
def to_s
|
||||
"#{@name.ljust(30)}#{@uri}"
|
||||
end
|
||||
|
||||
def svn_url?
|
||||
@uri =~ /svn(?:\+ssh)?:\/\/*/
|
||||
end
|
||||
|
||||
def git_url?
|
||||
@uri =~ /^git:\/\// || @uri =~ /\.git$/
|
||||
end
|
||||
|
||||
def installed?
|
||||
File.directory?("#{rails_env.root}/vendor/plugins/#{name}") \
|
||||
or rails_env.externals.detect{ |name, repo| self.uri == repo }
|
||||
end
|
||||
|
||||
def install(method=nil, options = {})
|
||||
method ||= rails_env.best_install_method?
|
||||
if :http == method
|
||||
method = :export if svn_url?
|
||||
method = :git if git_url?
|
||||
end
|
||||
|
||||
uninstall if installed? and options[:force]
|
||||
|
||||
unless installed?
|
||||
send("install_using_#{method}", options)
|
||||
run_install_hook
|
||||
else
|
||||
puts "already installed: #{name} (#{uri}). pass --force to reinstall"
|
||||
end
|
||||
end
|
||||
|
||||
def uninstall
|
||||
path = "#{rails_env.root}/vendor/plugins/#{name}"
|
||||
if File.directory?(path)
|
||||
puts "Removing 'vendor/plugins/#{name}'" if $verbose
|
||||
run_uninstall_hook
|
||||
rm_r path
|
||||
else
|
||||
puts "Plugin doesn't exist: #{path}"
|
||||
end
|
||||
|
||||
if rails_env.use_externals?
|
||||
# clean up svn:externals
|
||||
externals = rails_env.externals
|
||||
externals.reject!{|n, u| name == n or name == u}
|
||||
rails_env.externals = externals
|
||||
end
|
||||
end
|
||||
|
||||
def info
|
||||
tmp = "#{rails_env.root}/_tmp_about.yml"
|
||||
if svn_url?
|
||||
cmd = "svn export #{@uri} \"#{rails_env.root}/#{tmp}\""
|
||||
puts cmd if $verbose
|
||||
system(cmd)
|
||||
end
|
||||
open(svn_url? ? tmp : File.join(@uri, 'about.yml')) do |stream|
|
||||
stream.read
|
||||
end rescue "No about.yml found in #{uri}"
|
||||
ensure
|
||||
FileUtils.rm_rf tmp if svn_url?
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def run_install_hook
|
||||
install_hook_file = "#{rails_env.root}/vendor/plugins/#{name}/install.rb"
|
||||
load install_hook_file if File.exist? install_hook_file
|
||||
end
|
||||
|
||||
def run_uninstall_hook
|
||||
uninstall_hook_file = "#{rails_env.root}/vendor/plugins/#{name}/uninstall.rb"
|
||||
load uninstall_hook_file if File.exist? uninstall_hook_file
|
||||
end
|
||||
|
||||
def install_using_export(options = {})
|
||||
svn_command :export, options
|
||||
end
|
||||
|
||||
def install_using_checkout(options = {})
|
||||
svn_command :checkout, options
|
||||
end
|
||||
|
||||
def install_using_externals(options = {})
|
||||
externals = rails_env.externals
|
||||
externals.push([@name, uri])
|
||||
rails_env.externals = externals
|
||||
install_using_checkout(options)
|
||||
end
|
||||
|
||||
def install_using_http(options = {})
|
||||
root = rails_env.root
|
||||
mkdir_p "#{root}/vendor/plugins/#{@name}"
|
||||
Dir.chdir "#{root}/vendor/plugins/#{@name}" do
|
||||
puts "fetching from '#{uri}'" if $verbose
|
||||
fetcher = RecursiveHTTPFetcher.new(uri, -1)
|
||||
fetcher.quiet = true if options[:quiet]
|
||||
fetcher.fetch
|
||||
end
|
||||
end
|
||||
|
||||
def install_using_git(options = {})
|
||||
root = rails_env.root
|
||||
mkdir_p(install_path = "#{root}/vendor/plugins/#{name}")
|
||||
Dir.chdir install_path do
|
||||
init_cmd = "git init"
|
||||
init_cmd += " -q" if options[:quiet] and not $verbose
|
||||
puts init_cmd if $verbose
|
||||
system(init_cmd)
|
||||
base_cmd = "git pull --depth 1 #{uri}"
|
||||
base_cmd += " -q" if options[:quiet] and not $verbose
|
||||
base_cmd += " #{options[:revision]}" if options[:revision]
|
||||
puts base_cmd if $verbose
|
||||
if system(base_cmd)
|
||||
puts "removing: .git .gitignore" if $verbose
|
||||
rm_rf %w(.git .gitignore)
|
||||
else
|
||||
rm_rf install_path
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def svn_command(cmd, options = {})
|
||||
root = rails_env.root
|
||||
mkdir_p "#{root}/vendor/plugins"
|
||||
base_cmd = "svn #{cmd} #{uri} \"#{root}/vendor/plugins/#{name}\""
|
||||
base_cmd += ' -q' if options[:quiet] and not $verbose
|
||||
base_cmd += " -r #{options[:revision]}" if options[:revision]
|
||||
puts base_cmd if $verbose
|
||||
system(base_cmd)
|
||||
end
|
||||
|
||||
def guess_name(url)
|
||||
@name = File.basename(url)
|
||||
if @name == 'trunk' || @name.empty?
|
||||
@name = File.basename(File.dirname(url))
|
||||
end
|
||||
@name.gsub!(/\.git$/, '') if @name =~ /\.git$/
|
||||
end
|
||||
|
||||
def rails_env
|
||||
@rails_env || RailsEnvironment.default
|
||||
end
|
||||
end
|
||||
|
||||
# load default environment and parse arguments
|
||||
require 'optparse'
|
||||
module Rails
|
||||
module Commands
|
||||
class Plugin
|
||||
attr_reader :environment, :script_name
|
||||
def initialize
|
||||
@environment = RailsEnvironment.default
|
||||
@rails_root = RailsEnvironment.default.root
|
||||
@script_name = File.basename($0)
|
||||
end
|
||||
|
||||
def environment=(value)
|
||||
@environment = value
|
||||
RailsEnvironment.default = value
|
||||
end
|
||||
|
||||
def options
|
||||
OptionParser.new do |o|
|
||||
o.set_summary_indent(' ')
|
||||
o.banner = "Usage: plugin [OPTIONS] command"
|
||||
o.define_head "Rails plugin manager."
|
||||
|
||||
o.separator ""
|
||||
o.separator "GENERAL OPTIONS"
|
||||
|
||||
o.on("-r", "--root=DIR", String,
|
||||
"Set an explicit rails app directory.",
|
||||
"Default: #{@rails_root}") { |rails_root| @rails_root = rails_root; self.environment = RailsEnvironment.new(@rails_root) }
|
||||
|
||||
o.on("-v", "--verbose", "Turn on verbose output.") { |verbose| $verbose = verbose }
|
||||
o.on("-h", "--help", "Show this help message.") { puts o; exit }
|
||||
|
||||
o.separator ""
|
||||
o.separator "COMMANDS"
|
||||
|
||||
o.separator " install Install plugin(s) from known repositories or URLs."
|
||||
o.separator " remove Uninstall plugins."
|
||||
|
||||
o.separator ""
|
||||
o.separator "EXAMPLES"
|
||||
o.separator " Install a plugin from a subversion URL:"
|
||||
o.separator " #{@script_name} plugin install http://example.com/my_svn_plugin\n"
|
||||
o.separator " Install a plugin from a git URL:"
|
||||
o.separator " #{@script_name} plugin install git://github.com/SomeGuy/my_awesome_plugin.git\n"
|
||||
o.separator " Install a plugin and add a svn:externals entry to vendor/plugins"
|
||||
o.separator " #{@script_name} plugin install -x my_svn_plugin\n"
|
||||
end
|
||||
end
|
||||
|
||||
def parse!(args=ARGV)
|
||||
general, sub = split_args(args)
|
||||
options.parse!(general)
|
||||
|
||||
command = general.shift
|
||||
if command =~ /^(install|remove)$/
|
||||
command = Commands.const_get(command.capitalize).new(self)
|
||||
command.parse!(sub)
|
||||
else
|
||||
puts "Unknown command: #{command}" unless command.blank?
|
||||
puts options
|
||||
exit 1
|
||||
end
|
||||
end
|
||||
|
||||
def split_args(args)
|
||||
left = []
|
||||
left << args.shift while args[0] and args[0] =~ /^-/
|
||||
left << args.shift if args[0]
|
||||
[left, args]
|
||||
end
|
||||
|
||||
def self.parse!(args=ARGV)
|
||||
Plugin.new.parse!(args)
|
||||
end
|
||||
end
|
||||
|
||||
class Install
|
||||
def initialize(base_command)
|
||||
@base_command = base_command
|
||||
@method = :http
|
||||
@options = { :quiet => false, :revision => nil, :force => false }
|
||||
end
|
||||
|
||||
def options
|
||||
OptionParser.new do |o|
|
||||
o.set_summary_indent(' ')
|
||||
o.banner = "Usage: #{@base_command.script_name} install PLUGIN [PLUGIN [PLUGIN] ...]"
|
||||
o.define_head "Install one or more plugins."
|
||||
o.separator ""
|
||||
o.separator "Options:"
|
||||
o.on( "-x", "--externals",
|
||||
"Use svn:externals to grab the plugin.",
|
||||
"Enables plugin updates and plugin versioning.") { |v| @method = :externals }
|
||||
o.on( "-o", "--checkout",
|
||||
"Use svn checkout to grab the plugin.",
|
||||
"Enables updating but does not add a svn:externals entry.") { |v| @method = :checkout }
|
||||
o.on( "-e", "--export",
|
||||
"Use svn export to grab the plugin.",
|
||||
"Exports the plugin, allowing you to check it into your local repository. Does not enable updates or add an svn:externals entry.") { |v| @method = :export }
|
||||
o.on( "-q", "--quiet",
|
||||
"Suppresses the output from installation.",
|
||||
"Ignored if -v is passed (rails plugin -v install ...)") { |v| @options[:quiet] = true }
|
||||
o.on( "-r REVISION", "--revision REVISION",
|
||||
"Checks out the given revision from subversion or git.",
|
||||
"Ignored if subversion/git is not used.") { |v| @options[:revision] = v }
|
||||
o.on( "-f", "--force",
|
||||
"Reinstalls a plugin if it's already installed.") { |v| @options[:force] = true }
|
||||
o.separator ""
|
||||
o.separator "You can specify plugin names as given in 'plugin list' output or absolute URLs to "
|
||||
o.separator "a plugin repository."
|
||||
end
|
||||
end
|
||||
|
||||
def determine_install_method
|
||||
best = @base_command.environment.best_install_method
|
||||
@method = :http if best == :http and @method == :export
|
||||
case
|
||||
when (best == :http and @method != :http)
|
||||
msg = "Cannot install using subversion because `svn' cannot be found in your PATH"
|
||||
when (best == :export and (@method != :export and @method != :http))
|
||||
msg = "Cannot install using #{@method} because this project is not under subversion."
|
||||
when (best != :externals and @method == :externals)
|
||||
msg = "Cannot install using externals because vendor/plugins is not under subversion."
|
||||
end
|
||||
if msg
|
||||
puts msg
|
||||
exit 1
|
||||
end
|
||||
@method
|
||||
end
|
||||
|
||||
def parse!(args)
|
||||
options.parse!(args)
|
||||
if args.blank?
|
||||
puts options
|
||||
exit 1
|
||||
end
|
||||
environment = @base_command.environment
|
||||
install_method = determine_install_method
|
||||
puts "Plugins will be installed using #{install_method}" if $verbose
|
||||
args.each do |name|
|
||||
::Plugin.find(name).install(install_method, @options)
|
||||
end
|
||||
rescue StandardError => e
|
||||
puts "Plugin not found: #{args.inspect}"
|
||||
puts e.inspect if $verbose
|
||||
exit 1
|
||||
end
|
||||
end
|
||||
|
||||
class Remove
|
||||
def initialize(base_command)
|
||||
@base_command = base_command
|
||||
end
|
||||
|
||||
def options
|
||||
OptionParser.new do |o|
|
||||
o.set_summary_indent(' ')
|
||||
o.banner = "Usage: #{@base_command.script_name} remove name [name]..."
|
||||
o.define_head "Remove plugins."
|
||||
end
|
||||
end
|
||||
|
||||
def parse!(args)
|
||||
options.parse!(args)
|
||||
if args.blank?
|
||||
puts options
|
||||
exit 1
|
||||
end
|
||||
root = @base_command.environment.root
|
||||
args.each do |name|
|
||||
::Plugin.new(name).uninstall
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class Info
|
||||
def initialize(base_command)
|
||||
@base_command = base_command
|
||||
end
|
||||
|
||||
def options
|
||||
OptionParser.new do |o|
|
||||
o.set_summary_indent(' ')
|
||||
o.banner = "Usage: #{@base_command.script_name} info name [name]..."
|
||||
o.define_head "Shows plugin info at {url}/about.yml."
|
||||
end
|
||||
end
|
||||
|
||||
def parse!(args)
|
||||
options.parse!(args)
|
||||
args.each do |name|
|
||||
puts ::Plugin.find(name).info
|
||||
puts
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class RecursiveHTTPFetcher
|
||||
attr_accessor :quiet
|
||||
def initialize(urls_to_fetch, level = 1, cwd = ".")
|
||||
@level = level
|
||||
@cwd = cwd
|
||||
@urls_to_fetch = urls_to_fetch.lines
|
||||
@quiet = false
|
||||
end
|
||||
|
||||
def ls
|
||||
@urls_to_fetch.collect do |url|
|
||||
if url =~ /^svn(\+ssh)?:\/\/.*/
|
||||
`svn ls #{url}`.split("\n").map {|entry| "/#{entry}"} rescue nil
|
||||
else
|
||||
open(url) do |stream|
|
||||
links("", stream.read)
|
||||
end rescue nil
|
||||
end
|
||||
end.flatten
|
||||
end
|
||||
|
||||
def push_d(dir)
|
||||
@cwd = File.join(@cwd, dir)
|
||||
FileUtils.mkdir_p(@cwd)
|
||||
end
|
||||
|
||||
def pop_d
|
||||
@cwd = File.dirname(@cwd)
|
||||
end
|
||||
|
||||
def links(base_url, contents)
|
||||
links = []
|
||||
contents.scan(/href\s*=\s*\"*[^\">]*/i) do |link|
|
||||
link = link.sub(/href="/i, "")
|
||||
next if link =~ /svnindex.xsl$/
|
||||
next if link =~ /^(\w*:|)\/\// || link =~ /^\./
|
||||
links << File.join(base_url, link)
|
||||
end
|
||||
links
|
||||
end
|
||||
|
||||
def download(link)
|
||||
puts "+ #{File.join(@cwd, File.basename(link))}" unless @quiet
|
||||
open(link) do |stream|
|
||||
File.open(File.join(@cwd, File.basename(link)), "wb") do |file|
|
||||
file.write(stream.read)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def fetch(links = @urls_to_fetch)
|
||||
links.each do |l|
|
||||
(l =~ /\/$/ || links == @urls_to_fetch) ? fetch_dir(l) : download(l)
|
||||
end
|
||||
end
|
||||
|
||||
def fetch_dir(url)
|
||||
@level += 1
|
||||
push_d(File.basename(url)) if @level > 0
|
||||
open(url) do |stream|
|
||||
contents = stream.read
|
||||
fetch(links(url, contents))
|
||||
end
|
||||
pop_d if @level > 0
|
||||
@level -= 1
|
||||
end
|
||||
end
|
||||
|
||||
Rails::Commands::Plugin.parse!
|
|
@ -5,7 +5,6 @@ module Rails
|
|||
class Configuration < ::Rails::Railtie::Configuration
|
||||
attr_reader :root
|
||||
attr_writer :middleware, :eager_load_paths, :autoload_once_paths, :autoload_paths
|
||||
attr_accessor :plugins
|
||||
|
||||
def initialize(root=nil)
|
||||
super()
|
||||
|
@ -59,7 +58,6 @@ module Rails
|
|||
paths.add "db/seeds", :with => "db/seeds.rb"
|
||||
paths.add "vendor", :load_path => true
|
||||
paths.add "vendor/assets", :glob => "*"
|
||||
paths.add "vendor/plugins"
|
||||
paths
|
||||
end
|
||||
end
|
||||
|
|
|
@ -7,18 +7,11 @@ module Rails
|
|||
end
|
||||
|
||||
def all(&block)
|
||||
@all ||= plugins
|
||||
@all ||= []
|
||||
@all.each(&block) if block
|
||||
@all
|
||||
end
|
||||
|
||||
def plugins
|
||||
@plugins ||= begin
|
||||
plugin_names = (@config.plugins || [:all]).map { |p| p.to_sym }
|
||||
Plugin.all(plugin_names, @config.paths["vendor/plugins"].existent)
|
||||
end
|
||||
end
|
||||
|
||||
def self.railties
|
||||
@railties ||= ::Rails::Railtie.subclasses.map(&:instance)
|
||||
end
|
||||
|
|
|
@ -38,11 +38,6 @@ module Rails
|
|||
|
||||
:test_unit => {
|
||||
:fixture_replacement => '-r',
|
||||
},
|
||||
|
||||
:plugin => {
|
||||
:generator => '-g',
|
||||
:tasks => '-r'
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -62,11 +57,6 @@ module Rails
|
|||
:stylesheet_engine => :css,
|
||||
:test_framework => false,
|
||||
:template_engine => :erb
|
||||
},
|
||||
|
||||
:plugin => {
|
||||
:generator => false,
|
||||
:tasks => false
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -195,7 +185,6 @@ module Rails
|
|||
"#{test}:scaffold",
|
||||
"#{test}:view",
|
||||
"#{test}:performance",
|
||||
"#{test}:plugin",
|
||||
"#{template}:controller",
|
||||
"#{template}:scaffold",
|
||||
"#{template}:mailer",
|
||||
|
|
|
@ -6,40 +6,6 @@ module Rails
|
|||
module Generators
|
||||
module Actions
|
||||
|
||||
# Install a plugin. You must provide either a Subversion url or Git url.
|
||||
#
|
||||
# For a Git-hosted plugin, you can specify a branch and
|
||||
# whether it should be added as a submodule instead of cloned.
|
||||
#
|
||||
# For a Subversion-hosted plugin you can specify a revision.
|
||||
#
|
||||
# ==== Examples
|
||||
#
|
||||
# plugin 'restful-authentication', :git => 'git://github.com/technoweenie/restful-authentication.git'
|
||||
# plugin 'restful-authentication', :git => 'git://github.com/technoweenie/restful-authentication.git', :branch => 'stable'
|
||||
# plugin 'restful-authentication', :git => 'git://github.com/technoweenie/restful-authentication.git', :submodule => true
|
||||
# plugin 'restful-authentication', :svn => 'svn://svnhub.com/technoweenie/restful-authentication/trunk'
|
||||
# plugin 'restful-authentication', :svn => 'svn://svnhub.com/technoweenie/restful-authentication/trunk', :revision => 1234
|
||||
#
|
||||
def plugin(name, options)
|
||||
log :plugin, name
|
||||
|
||||
if options[:git] && options[:submodule]
|
||||
options[:git] = "-b #{options[:branch]} #{options[:git]}" if options[:branch]
|
||||
in_root do
|
||||
run "git submodule add #{options[:git]} vendor/plugins/#{name}", :verbose => false
|
||||
end
|
||||
elsif options[:git] || options[:svn]
|
||||
options[:git] = "-b #{options[:branch]} #{options[:git]}" if options[:branch]
|
||||
options[:svn] = "-r #{options[:revision]} #{options[:svn]}" if options[:revision]
|
||||
in_root do
|
||||
run_ruby_script "script/rails plugin install #{options[:svn] || options[:git]}", :verbose => false
|
||||
end
|
||||
else
|
||||
log "! no git or svn provided for #{name}. Skipping..."
|
||||
end
|
||||
end
|
||||
|
||||
# Adds an entry into Gemfile for the supplied gem. If env
|
||||
# is specified, add the gem to the given environment.
|
||||
#
|
||||
|
|
|
@ -124,7 +124,6 @@ module Rails
|
|||
def vendor
|
||||
vendor_javascripts
|
||||
vendor_stylesheets
|
||||
vendor_plugins
|
||||
end
|
||||
|
||||
def vendor_javascripts
|
||||
|
@ -134,10 +133,6 @@ module Rails
|
|||
def vendor_stylesheets
|
||||
empty_directory_with_gitkeep "vendor/assets/stylesheets"
|
||||
end
|
||||
|
||||
def vendor_plugins
|
||||
empty_directory_with_gitkeep "vendor/plugins"
|
||||
end
|
||||
end
|
||||
|
||||
module Generators
|
||||
|
|
|
@ -191,7 +191,6 @@ The default directory structure of a generated Ruby on Rails application:
|
|||
`-- vendor
|
||||
|-- assets
|
||||
`-- stylesheets
|
||||
`-- plugins
|
||||
|
||||
app
|
||||
Holds all the code that's specific to this particular application.
|
||||
|
@ -256,6 +255,5 @@ test
|
|||
directory.
|
||||
|
||||
vendor
|
||||
External libraries that the application depends on. Also includes the plugins
|
||||
subdirectory. If the app has frozen rails, those gems also go here, under
|
||||
vendor/rails/. This directory is in the load path.
|
||||
External libraries that the application depends on. If the app has frozen rails,
|
||||
those gems also go here, under vendor/rails/. This directory is in the load path.
|
||||
|
|
|
@ -28,10 +28,6 @@ module <%= app_const_base %>
|
|||
# Custom directories with classes and modules you want to be autoloadable.
|
||||
# config.autoload_paths += %W(#{config.root}/extras)
|
||||
|
||||
# Only load the plugins named here, in the order given (default is alphabetical).
|
||||
# :all can be used as a placeholder for all plugins not explicitly named.
|
||||
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]
|
||||
|
||||
# Activate observers that should always be running.
|
||||
# config.active_record.observers = :cacher, :garbage_collector, :forum_observer
|
||||
|
||||
|
|
|
@ -1,91 +0,0 @@
|
|||
require 'rails/engine'
|
||||
require 'active_support/core_ext/array/conversions'
|
||||
|
||||
module Rails
|
||||
# Rails::Plugin is nothing more than a Rails::Engine, but since it's loaded too late
|
||||
# in the boot process, it does not have the same configuration powers as a bare
|
||||
# Rails::Engine.
|
||||
#
|
||||
# Opposite to Rails::Railtie and Rails::Engine, you are not supposed to inherit from
|
||||
# Rails::Plugin. Rails::Plugin is automatically configured to be an engine by simply
|
||||
# placing inside vendor/plugins. Since this is done automatically, you actually cannot
|
||||
# declare a Rails::Engine inside your Plugin, otherwise it would cause the same files
|
||||
# to be loaded twice. This means that if you want to ship an Engine as gem it cannot
|
||||
# be used as plugin and vice-versa.
|
||||
#
|
||||
# Besides this conceptual difference, the only difference between Rails::Engine and
|
||||
# Rails::Plugin is that plugins automatically load the file "init.rb" at the plugin
|
||||
# root during the boot process.
|
||||
#
|
||||
class Plugin < Engine
|
||||
def self.global_plugins
|
||||
@global_plugins ||= []
|
||||
end
|
||||
|
||||
def self.inherited(base)
|
||||
raise "You cannot inherit from Rails::Plugin"
|
||||
end
|
||||
|
||||
def self.all(list, paths)
|
||||
plugins = []
|
||||
paths.each do |path|
|
||||
Dir["#{path}/*"].each do |plugin_path|
|
||||
plugin = new(plugin_path)
|
||||
next unless list.include?(plugin.name) || list.include?(:all)
|
||||
if global_plugins.include?(plugin.name)
|
||||
warn "WARNING: plugin #{plugin.name} from #{path} was not loaded. Plugin with the same name has been already loaded."
|
||||
next
|
||||
end
|
||||
global_plugins << plugin.name
|
||||
plugins << plugin
|
||||
end
|
||||
end
|
||||
|
||||
plugins.sort_by do |p|
|
||||
[list.index(p.name) || list.index(:all), p.name.to_s]
|
||||
end
|
||||
end
|
||||
|
||||
attr_reader :name, :path
|
||||
|
||||
def railtie_name
|
||||
name.to_s
|
||||
end
|
||||
|
||||
def initialize(root)
|
||||
@name = File.basename(root).to_sym
|
||||
config.root = root
|
||||
end
|
||||
|
||||
def config
|
||||
@config ||= Engine::Configuration.new
|
||||
end
|
||||
|
||||
initializer :handle_lib_autoload, :before => :set_load_path do |app|
|
||||
autoload = if app.config.reload_plugins
|
||||
config.autoload_paths
|
||||
else
|
||||
config.autoload_once_paths
|
||||
end
|
||||
|
||||
autoload.concat paths["lib"].existent
|
||||
end
|
||||
|
||||
initializer :load_init_rb, :before => :load_config_initializers do |app|
|
||||
init_rb = File.expand_path("init.rb", root)
|
||||
if File.file?(init_rb)
|
||||
# This double assignment is to prevent an "unused variable" warning on Ruby 1.9.3.
|
||||
config = config = app.config
|
||||
# TODO: think about evaling initrb in context of Engine (currently it's
|
||||
# always evaled in context of Rails::Application)
|
||||
eval(File.read(init_rb), binding, init_rb)
|
||||
end
|
||||
end
|
||||
|
||||
initializer :sanity_check_railties_collision do
|
||||
if Engine.subclasses.map { |k| k.root.to_s }.include?(root.to_s)
|
||||
raise "\"#{name}\" is a Railtie/Engine and cannot be installed as a plugin"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -103,11 +103,11 @@ module Rails
|
|||
# end
|
||||
# end
|
||||
#
|
||||
# == Application, Plugin and Engine
|
||||
# == Application and Engine
|
||||
#
|
||||
# A Rails::Engine is nothing more than a Railtie with some initializers already set.
|
||||
# And since Rails::Application and Rails::Plugin are engines, the same configuration
|
||||
# described here can be used in all three.
|
||||
# And since Rails::Application is an engine, the same configuration described here
|
||||
# can be used in both.
|
||||
#
|
||||
# Be sure to look at the documentation of those specific classes for more information.
|
||||
#
|
||||
|
@ -117,7 +117,7 @@ module Rails
|
|||
|
||||
include Initializable
|
||||
|
||||
ABSTRACT_RAILTIES = %w(Rails::Railtie Rails::Plugin Rails::Engine Rails::Application)
|
||||
ABSTRACT_RAILTIES = %w(Rails::Railtie Rails::Engine Rails::Application)
|
||||
|
||||
class << self
|
||||
private :new
|
||||
|
|
|
@ -55,7 +55,7 @@ namespace :doc do
|
|||
rdoc.rdoc_files.include('app/**/*.rb')
|
||||
rdoc.rdoc_files.include('lib/**/*.rb')
|
||||
}
|
||||
Rake::Task['doc:app'].comment = "Generate docs for the app -- also available doc:rails, doc:guides, doc:plugins (options: TEMPLATE=/rdoc-template.rb, TITLE=\"Custom Title\")"
|
||||
Rake::Task['doc:app'].comment = "Generate docs for the app -- also available doc:rails, doc:guides (options: TEMPLATE=/rdoc-template.rb, TITLE=\"Custom Title\")"
|
||||
|
||||
# desc 'Generate documentation for the Rails framework.'
|
||||
RDocTaskWithoutDescriptions.new("rails") { |rdoc|
|
||||
|
@ -108,48 +108,10 @@ namespace :doc do
|
|||
end
|
||||
}
|
||||
|
||||
plugins = FileList['vendor/plugins/**'].collect { |plugin| File.basename(plugin) }
|
||||
|
||||
# desc "Generate documentation for all installed plugins"
|
||||
task :plugins => plugins.collect { |plugin| "doc:plugins:#{plugin}" }
|
||||
|
||||
# desc "Remove plugin documentation"
|
||||
task :clobber_plugins do
|
||||
rm_rf 'doc/plugins' rescue nil
|
||||
end
|
||||
|
||||
# desc "Generate Rails Guides"
|
||||
task :guides do
|
||||
# FIXME: Reaching outside lib directory is a bad idea
|
||||
require File.expand_path('../../../../guides/rails_guides', __FILE__)
|
||||
RailsGuides::Generator.new(Rails.root.join("doc/guides")).generate
|
||||
end
|
||||
|
||||
namespace :plugins do
|
||||
# Define doc tasks for each plugin
|
||||
plugins.each do |plugin|
|
||||
# desc "Generate documentation for the #{plugin} plugin"
|
||||
task(plugin => :environment) do
|
||||
plugin_base = "vendor/plugins/#{plugin}"
|
||||
options = []
|
||||
files = Rake::FileList.new
|
||||
options << "-o doc/plugins/#{plugin}"
|
||||
options << "--title '#{plugin.titlecase} Plugin Documentation'"
|
||||
options << '--line-numbers'
|
||||
options << '--charset' << 'utf-8'
|
||||
options << '-T html'
|
||||
|
||||
files.include("#{plugin_base}/lib/**/*.rb")
|
||||
if File.exist?("#{plugin_base}/README")
|
||||
files.include("#{plugin_base}/README")
|
||||
options << "--main '#{plugin_base}/README'"
|
||||
end
|
||||
files.include("#{plugin_base}/CHANGELOG") if File.exist?("#{plugin_base}/CHANGELOG")
|
||||
|
||||
options << files.to_s
|
||||
|
||||
sh %(rdoc #{options * ' '})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -45,7 +45,7 @@ end
|
|||
|
||||
task :default => :test
|
||||
|
||||
desc 'Runs test:units, test:functionals, test:integration together (also available: test:benchmark, test:profile, test:plugins)'
|
||||
desc 'Runs test:units, test:functionals, test:integration together (also available: test:benchmark, test:profile)'
|
||||
task :test do
|
||||
Rake::Task[ENV['TEST'] ? 'test:single' : 'test:run'].invoke
|
||||
end
|
||||
|
@ -119,14 +119,4 @@ namespace :test do
|
|||
t.libs << 'test'
|
||||
t.pattern = 'test/performance/**/*_test.rb'
|
||||
end
|
||||
|
||||
Rails::SubTestTask.new(:plugins => :environment) do |t|
|
||||
t.libs << "test"
|
||||
|
||||
if ENV['PLUGIN']
|
||||
t.pattern = "vendor/plugins/#{ENV['PLUGIN']}/test/**/*_test.rb"
|
||||
else
|
||||
t.pattern = 'vendor/plugins/*/**/test/**/*_test.rb'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -46,7 +46,6 @@ module ApplicationTests
|
|||
assert_path @paths["app/views"], "app/views"
|
||||
assert_path @paths["lib"], "lib"
|
||||
assert_path @paths["vendor"], "vendor"
|
||||
assert_path @paths["vendor/plugins"], "vendor/plugins"
|
||||
assert_path @paths["tmp"], "tmp"
|
||||
assert_path @paths["config"], "config"
|
||||
assert_path @paths["config/locales"], "config/locales/en.yml"
|
||||
|
|
|
@ -9,8 +9,6 @@ class ActionsTest < Rails::Generators::TestCase
|
|||
def setup
|
||||
Rails.application = TestApp::Application
|
||||
super
|
||||
@git_plugin_uri = 'git://github.com/technoweenie/restful-authentication.git'
|
||||
@svn_plugin_uri = 'svn://svnhub.com/technoweenie/restful-authentication/trunk'
|
||||
end
|
||||
|
||||
def teardown
|
||||
|
@ -37,41 +35,6 @@ class ActionsTest < Rails::Generators::TestCase
|
|||
assert_file 'lib/test_file.rb', 'heres block data'
|
||||
end
|
||||
|
||||
def test_plugin_with_git_option_should_run_plugin_install
|
||||
generator.expects(:run_ruby_script).once.with("script/rails plugin install #{@git_plugin_uri}", :verbose => false)
|
||||
action :plugin, 'restful-authentication', :git => @git_plugin_uri
|
||||
end
|
||||
|
||||
def test_plugin_with_svn_option_should_run_plugin_install
|
||||
generator.expects(:run_ruby_script).once.with("script/rails plugin install #{@svn_plugin_uri}", :verbose => false)
|
||||
action :plugin, 'restful-authentication', :svn => @svn_plugin_uri
|
||||
end
|
||||
|
||||
def test_plugin_with_git_option_and_branch_should_run_plugin_install
|
||||
generator.expects(:run_ruby_script).once.with("script/rails plugin install -b stable #{@git_plugin_uri}", :verbose => false)
|
||||
action :plugin, 'restful-authentication', :git => @git_plugin_uri, :branch => 'stable'
|
||||
end
|
||||
|
||||
def test_plugin_with_svn_option_and_revision_should_run_plugin_install
|
||||
generator.expects(:run_ruby_script).once.with("script/rails plugin install -r 1234 #{@svn_plugin_uri}", :verbose => false)
|
||||
action :plugin, 'restful-authentication', :svn => @svn_plugin_uri, :revision => 1234
|
||||
end
|
||||
|
||||
def test_plugin_with_git_option_and_submodule_should_use_git_scm
|
||||
generator.expects(:run).with("git submodule add #{@git_plugin_uri} vendor/plugins/rest_auth", :verbose => false)
|
||||
action :plugin, 'rest_auth', :git => @git_plugin_uri, :submodule => true
|
||||
end
|
||||
|
||||
def test_plugin_with_git_option_and_submodule_should_use_git_scm
|
||||
generator.expects(:run).with("git submodule add -b stable #{@git_plugin_uri} vendor/plugins/rest_auth", :verbose => false)
|
||||
action :plugin, 'rest_auth', :git => @git_plugin_uri, :submodule => true, :branch => 'stable'
|
||||
end
|
||||
|
||||
def test_plugin_with_no_options_should_skip_method
|
||||
generator.expects(:run).never
|
||||
action :plugin, 'rest_auth', {}
|
||||
end
|
||||
|
||||
def test_add_source_adds_source_to_gemfile
|
||||
run_generator
|
||||
action :add_source, 'http://gems.github.com'
|
||||
|
|
|
@ -32,7 +32,6 @@ DEFAULT_APP_FILES = %w(
|
|||
test/unit
|
||||
vendor
|
||||
vendor/assets
|
||||
vendor/plugins
|
||||
tmp/cache
|
||||
tmp/cache/assets
|
||||
)
|
||||
|
|
|
@ -178,20 +178,6 @@ module TestHelpers
|
|||
end
|
||||
end
|
||||
|
||||
def plugin(name, string = "")
|
||||
dir = "#{app_path}/vendor/plugins/#{name}"
|
||||
FileUtils.mkdir_p(dir)
|
||||
|
||||
File.open("#{dir}/init.rb", 'w') do |f|
|
||||
f.puts "::#{name.upcase} = 'loaded'"
|
||||
f.puts string
|
||||
end
|
||||
|
||||
Bukkit.new(dir).tap do |bukkit|
|
||||
yield bukkit if block_given?
|
||||
end
|
||||
end
|
||||
|
||||
def engine(name)
|
||||
dir = "#{app_path}/random/#{name}"
|
||||
FileUtils.mkdir_p(dir)
|
||||
|
|
|
@ -151,46 +151,6 @@ module RailtiesTest
|
|||
assert_equal "foo", last_response.body
|
||||
end
|
||||
|
||||
test "engine can load its own plugins" do
|
||||
@plugin.write "lib/bukkits.rb", <<-RUBY
|
||||
module Bukkits
|
||||
class Engine < ::Rails::Engine
|
||||
end
|
||||
end
|
||||
RUBY
|
||||
|
||||
@plugin.write "vendor/plugins/yaffle/init.rb", <<-RUBY
|
||||
config.yaffle_loaded = true
|
||||
RUBY
|
||||
|
||||
boot_rails
|
||||
|
||||
assert Bukkits::Engine.config.yaffle_loaded
|
||||
end
|
||||
|
||||
test "engine does not load plugins that already exists in application" do
|
||||
@plugin.write "lib/bukkits.rb", <<-RUBY
|
||||
module Bukkits
|
||||
class Engine < ::Rails::Engine
|
||||
end
|
||||
end
|
||||
RUBY
|
||||
|
||||
@plugin.write "vendor/plugins/yaffle/init.rb", <<-RUBY
|
||||
config.engine_yaffle_loaded = true
|
||||
RUBY
|
||||
|
||||
app_file "vendor/plugins/yaffle/init.rb", <<-RUBY
|
||||
config.app_yaffle_loaded = true
|
||||
RUBY
|
||||
|
||||
warnings = capture(:stderr) { boot_rails }
|
||||
|
||||
assert !warnings.empty?
|
||||
assert !Bukkits::Engine.config.respond_to?(:engine_yaffle_loaded)
|
||||
assert Rails.application.config.app_yaffle_loaded
|
||||
end
|
||||
|
||||
test "it loads its environment file" do
|
||||
@plugin.write "lib/bukkits.rb", <<-RUBY
|
||||
module Bukkits
|
||||
|
|
|
@ -1,76 +0,0 @@
|
|||
require "isolation/abstract_unit"
|
||||
|
||||
module RailtiesTest
|
||||
class PluginOrderingTest < Test::Unit::TestCase
|
||||
include ActiveSupport::Testing::Isolation
|
||||
|
||||
def setup
|
||||
build_app
|
||||
$arr = []
|
||||
plugin "a_plugin", "$arr << :a"
|
||||
plugin "b_plugin", "$arr << :b"
|
||||
plugin "c_plugin", "$arr << :c"
|
||||
end
|
||||
|
||||
def teardown
|
||||
teardown_app
|
||||
end
|
||||
|
||||
def boot_rails
|
||||
super
|
||||
require "#{app_path}/config/environment"
|
||||
end
|
||||
|
||||
test "plugins are loaded alphabetically by default" do
|
||||
boot_rails
|
||||
assert_equal [:a, :b, :c], $arr
|
||||
end
|
||||
|
||||
test "if specified, only those plugins are loaded" do
|
||||
add_to_config "config.plugins = [:b_plugin]"
|
||||
boot_rails
|
||||
assert_equal [:b], $arr
|
||||
end
|
||||
|
||||
test "the plugins are initialized in the order they are specified" do
|
||||
add_to_config "config.plugins = [:b_plugin, :a_plugin]"
|
||||
boot_rails
|
||||
assert_equal [:b, :a], $arr
|
||||
end
|
||||
|
||||
test "if :all is specified, the remaining plugins are loaded in alphabetical order" do
|
||||
add_to_config "config.plugins = [:c_plugin, :all]"
|
||||
boot_rails
|
||||
assert_equal [:c, :a, :b], $arr
|
||||
end
|
||||
|
||||
test "if :all is at the beginning, it represents the plugins not otherwise specified" do
|
||||
add_to_config "config.plugins = [:all, :b_plugin]"
|
||||
boot_rails
|
||||
assert_equal [:a, :c, :b], $arr
|
||||
end
|
||||
|
||||
test "plugin order array is strings" do
|
||||
add_to_config "config.plugins = %w( c_plugin all )"
|
||||
boot_rails
|
||||
assert_equal [:c, :a, :b], $arr
|
||||
end
|
||||
|
||||
test "can require lib file from a different plugin" do
|
||||
plugin "foo", "require 'bar'" do |plugin|
|
||||
plugin.write "lib/foo.rb", "$foo = true"
|
||||
end
|
||||
|
||||
plugin "bar", "require 'foo'" do |plugin|
|
||||
plugin.write "lib/bar.rb", "$bar = true"
|
||||
end
|
||||
|
||||
add_to_config "config.plugins = [:foo, :bar]"
|
||||
|
||||
boot_rails
|
||||
|
||||
assert $foo
|
||||
assert $bar
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,123 +0,0 @@
|
|||
require "isolation/abstract_unit"
|
||||
require "railties/shared_tests"
|
||||
|
||||
module RailtiesTest
|
||||
class PluginTest < Test::Unit::TestCase
|
||||
include ActiveSupport::Testing::Isolation
|
||||
include SharedTests
|
||||
|
||||
def setup
|
||||
build_app
|
||||
|
||||
@plugin = plugin "bukkits", "::LEVEL = config.log_level" do |plugin|
|
||||
plugin.write "lib/bukkits.rb", "class Bukkits; end"
|
||||
plugin.write "lib/another.rb", "class Another; end"
|
||||
end
|
||||
end
|
||||
|
||||
def teardown
|
||||
teardown_app
|
||||
end
|
||||
|
||||
test "Rails::Plugin itself does not respond to config" do
|
||||
boot_rails
|
||||
assert !Rails::Plugin.respond_to?(:config)
|
||||
end
|
||||
|
||||
test "cannot inherit from Rails::Plugin" do
|
||||
boot_rails
|
||||
assert_raise RuntimeError do
|
||||
class Foo < Rails::Plugin; end
|
||||
end
|
||||
end
|
||||
|
||||
test "plugin can load the file with the same name in lib" do
|
||||
boot_rails
|
||||
require "bukkits"
|
||||
assert_equal "Bukkits", Bukkits.name
|
||||
end
|
||||
|
||||
test "plugin gets added to dependency list" do
|
||||
boot_rails
|
||||
assert_equal "Another", Another.name
|
||||
end
|
||||
|
||||
test "plugin constants get reloaded if config.reload_plugins is set to true" do
|
||||
add_to_config <<-RUBY
|
||||
config.reload_plugins = true
|
||||
RUBY
|
||||
|
||||
boot_rails
|
||||
|
||||
assert_equal "Another", Another.name
|
||||
ActiveSupport::Dependencies.clear
|
||||
@plugin.delete("lib/another.rb")
|
||||
assert_raises(NameError) { Another }
|
||||
end
|
||||
|
||||
test "plugin constants are not reloaded by default" do
|
||||
boot_rails
|
||||
assert_equal "Another", Another.name
|
||||
ActiveSupport::Dependencies.clear
|
||||
@plugin.delete("lib/another.rb")
|
||||
assert_nothing_raised { Another }
|
||||
end
|
||||
|
||||
test "it loads the plugin's init.rb file" do
|
||||
boot_rails
|
||||
assert_equal "loaded", BUKKITS
|
||||
end
|
||||
|
||||
test "the init.rb file has access to the config object" do
|
||||
boot_rails
|
||||
assert_equal :debug, LEVEL
|
||||
end
|
||||
|
||||
test "plugin_init_is_run_before_application_ones" do
|
||||
plugin "foo", "$foo = true" do |plugin|
|
||||
plugin.write "lib/foo.rb", "module Foo; end"
|
||||
end
|
||||
|
||||
app_file 'config/initializers/foo.rb', <<-RUBY
|
||||
raise "no $foo" unless $foo
|
||||
raise "no Foo" unless Foo
|
||||
RUBY
|
||||
|
||||
boot_rails
|
||||
assert $foo
|
||||
end
|
||||
|
||||
test "plugin should work without init.rb" do
|
||||
@plugin.delete("init.rb")
|
||||
|
||||
boot_rails
|
||||
|
||||
require "bukkits"
|
||||
assert_nothing_raised { Bukkits }
|
||||
end
|
||||
|
||||
test "plugin cannot declare an engine for it" do
|
||||
@plugin.write "lib/bukkits.rb", <<-RUBY
|
||||
class Bukkits
|
||||
class Engine < Rails::Engine
|
||||
end
|
||||
end
|
||||
RUBY
|
||||
|
||||
@plugin.write "init.rb", <<-RUBY
|
||||
require "bukkits"
|
||||
RUBY
|
||||
|
||||
rescued = false
|
||||
|
||||
begin
|
||||
boot_rails
|
||||
rescue Exception => e
|
||||
rescued = true
|
||||
assert_equal '"bukkits" is a Railtie/Engine and cannot be installed as a plugin', e.message
|
||||
end
|
||||
|
||||
assert rescued, "Expected boot rails to fail"
|
||||
end
|
||||
end
|
||||
end
|
|
@ -61,15 +61,6 @@ module RailtiesTest
|
|||
end
|
||||
RUBY
|
||||
|
||||
yaffle = plugin "acts_as_yaffle", "::LEVEL = config.log_level" do |plugin|
|
||||
plugin.write "lib/acts_as_yaffle.rb", "class ActsAsYaffle; end"
|
||||
end
|
||||
|
||||
yaffle.write "db/migrate/1_create_yaffles.rb", <<-RUBY
|
||||
class CreateYaffles < ActiveRecord::Migration
|
||||
end
|
||||
RUBY
|
||||
|
||||
add_to_config "ActiveRecord::Base.timestamped_migrations = false"
|
||||
|
||||
boot_rails
|
||||
|
@ -87,14 +78,10 @@ module RailtiesTest
|
|||
|
||||
output = `bundle exec rake railties:install:migrations`.split("\n")
|
||||
|
||||
assert File.exists?("#{app_path}/db/migrate/4_create_yaffles.acts_as_yaffle.rb")
|
||||
assert_no_match(/2_create_users/, output.join("\n"))
|
||||
|
||||
yaffle_migration_order = output.index(output.detect{|o| /Copied migration 4_create_yaffles.acts_as_yaffle.rb from acts_as_yaffle/ =~ o })
|
||||
bukkits_migration_order = output.index(output.detect{|o| /NOTE: Migration 3_create_sessions.rb from bukkits has been skipped/ =~ o })
|
||||
assert_not_nil yaffle_migration_order, "Expected migration to be copied"
|
||||
assert_not_nil bukkits_migration_order, "Expected migration to be skipped"
|
||||
assert_equal(railties.index('acts_as_yaffle') > railties.index('bukkits'), yaffle_migration_order > bukkits_migration_order)
|
||||
|
||||
migrations_count = Dir["#{app_path}/db/migrate/*.rb"].length
|
||||
output = `bundle exec rake railties:install:migrations`
|
||||
|
|
Loading…
Reference in a new issue