parlement 0.3 → 0.4
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/CHANGES +16 -0
- data/README +36 -3
- data/Rakefile +8 -12
- data/app/controllers/account_controller.rb +2 -0
- data/app/controllers/elt_controller.rb +1 -5
- data/app/controllers/subscriber_controller.rb +1 -1
- data/app/helpers/elt_helper.rb +30 -10
- data/app/models/elt.rb +2 -1
- data/app/models/mail.rb +41 -41
- data/app/models/mail_notify.rb +27 -10
- data/app/views/account/_login.rhtml +9 -7
- data/app/views/account/_show.rhtml +4 -4
- data/app/views/elt/_elt.rhtml +52 -51
- data/app/views/elt/_list.rhtml +22 -14
- data/app/views/elt/new.rhtml +1 -1
- data/app/views/elt/show.rhtml +15 -16
- data/app/views/layouts/top.rhtml +13 -1
- data/app/views/person/show.rhtml +1 -7
- data/config/boot.rb +32 -7
- data/config/database.yml +3 -0
- data/config/environment.rb +3 -1
- data/config/environments/development.rb +1 -1
- data/db/ROOT/parlement/ddRing.txt +14 -0
- data/db/ROOT/parlement/top-politics.txt +12 -0
- data/db/ROOT/perso.txt +1 -1
- data/db/development_structure.sql +30 -16
- data/db/schema.rb +18 -10
- data/db/schema.sql +34 -34
- data/public/javascripts/application.js +2 -0
- data/public/javascripts/blank.gif +0 -0
- data/public/javascripts/borders.js +687 -0
- data/public/javascripts/controls.js +95 -30
- data/public/javascripts/dragdrop.js +161 -21
- data/public/javascripts/effects.js +310 -211
- data/public/javascripts/ie7-load.htc +1 -0
- data/public/javascripts/prototype.js +228 -28
- data/test/fixtures/attachments.yml +3 -0
- data/test/fixtures/mail/mail_ruby +1 -0
- data/test/fixtures/people.yml +14 -0
- data/test/functional/account_controller_test.rb +3 -2
- data/test/unit/mail_notify_test.rb +2 -0
- data/test/unit/mail_test.rb +59 -6
- data/test/unit/person_test.rb +1 -1
- data/vendor/plugins/engines/CHANGELOG +92 -0
- data/vendor/plugins/engines/MIT-LICENSE +21 -0
- data/vendor/plugins/engines/README +325 -39
- data/vendor/plugins/engines/generators/engine/USAGE +26 -0
- data/vendor/plugins/engines/generators/engine/engine_generator.rb +199 -0
- data/vendor/plugins/engines/generators/engine/templates/README +85 -0
- data/vendor/plugins/engines/generators/engine/templates/init_engine.erb +13 -0
- data/vendor/plugins/engines/generators/engine/templates/install.erb +4 -0
- data/vendor/plugins/engines/generators/engine/templates/lib/engine.erb +6 -0
- data/vendor/plugins/engines/generators/engine/templates/licenses/GPL +18 -0
- data/vendor/plugins/engines/generators/engine/templates/licenses/LGPL +19 -0
- data/vendor/plugins/engines/generators/engine/templates/licenses/MIT +22 -0
- data/vendor/plugins/engines/generators/engine/templates/licenses/None +1 -0
- data/vendor/plugins/engines/generators/engine/templates/public/javascripts/engine.js +0 -0
- data/vendor/plugins/engines/generators/engine/templates/public/stylesheets/engine.css +0 -0
- data/vendor/plugins/engines/generators/engine/templates/tasks/engine.rake +0 -0
- data/vendor/plugins/engines/generators/engine/templates/test/test_helper.erb +13 -0
- data/vendor/plugins/engines/init.rb +18 -3
- data/vendor/plugins/engines/lib/bundles/require_resource.rb +124 -0
- data/vendor/plugins/engines/lib/bundles.rb +77 -0
- data/vendor/plugins/engines/lib/{action_mailer_extensions.rb → engines/action_mailer_extensions.rb} +15 -36
- data/vendor/plugins/engines/lib/{action_view_extensions.rb → engines/action_view_extensions.rb} +40 -33
- data/vendor/plugins/engines/lib/engines/active_record_extensions.rb +19 -0
- data/vendor/plugins/engines/lib/engines/dependencies_extensions.rb +118 -0
- data/vendor/plugins/engines/lib/engines/migration_extensions.rb +53 -0
- data/vendor/plugins/engines/lib/{ruby_extensions.rb → engines/ruby_extensions.rb} +14 -28
- data/vendor/plugins/engines/lib/engines/testing_extensions.rb +323 -0
- data/vendor/plugins/engines/lib/engines.rb +258 -148
- data/vendor/plugins/engines/tasks/engines.rake +161 -0
- data/vendor/plugins/engines/test/action_view_extensions_test.rb +9 -0
- data/vendor/plugins/engines/test/ruby_extensions_test.rb +24 -3
- data/vendor/plugins/guid/README.TXT +14 -4
- data/vendor/plugins/guid/init.rb +9 -2
- data/vendor/plugins/guid/lib/uuidtools.rb +22 -15
- data/vendor/plugins/login_engine/CHANGELOG +14 -0
- data/vendor/plugins/login_engine/README +93 -7
- data/vendor/plugins/login_engine/app/controllers/user_controller.rb +30 -20
- data/vendor/plugins/login_engine/app/helpers/user_helper.rb +1 -1
- data/vendor/plugins/login_engine/app/views/user/forgot_password.rhtml +2 -2
- data/vendor/plugins/login_engine/db/migrate/001_initial_schema.rb +25 -0
- data/vendor/plugins/login_engine/install.rb +4 -0
- data/vendor/plugins/login_engine/lib/login_engine/authenticated_system.rb +11 -5
- data/vendor/plugins/login_engine/lib/login_engine/authenticated_user.rb +15 -9
- data/vendor/plugins/login_engine/lib/login_engine.rb +7 -3
- data/vendor/plugins/login_engine/test/functional/user_controller_test.rb +22 -19
- data/vendor/plugins/login_engine/test/test_helper.rb +4 -8
- data/vendor/plugins/login_engine/test/unit/user_test.rb +31 -11
- metadata +60 -57
- data/app/models/attachment.rb +0 -6
- data/public/attachment/file/architecture.png +0 -0
- data/public/attachment/file/architecture.svg +0 -8972
- data/public/attachment/file/security.svg +0 -8960
- data/public/engine_files/login_engine/stylesheets/login_engine.css +0 -81
- data/public/oldREADME +0 -190
- data/public/stylesheets/default.css +0 -235
- data/public/stylesheets/live_tree.css +0 -62
- data/public/stylesheets/scaffold.css +0 -74
- data/script/about +0 -3
- data/script/benchmarker +0 -19
- data/script/breakpointer +0 -3
- data/script/console +0 -3
- data/script/create_db +0 -7
- data/script/destroy +0 -3
- data/script/generate +0 -3
- data/script/performance/benchmarker +0 -3
- data/script/performance/profiler +0 -3
- data/script/plugin +0 -3
- data/script/process/reaper +0 -3
- data/script/process/spawner +0 -3
- data/script/process/spinner +0 -3
- data/script/profiler +0 -34
- data/script/runner +0 -3
- data/script/server +0 -3
- data/test/unit/user_test.rb +0 -94
- data/vendor/plugins/engines/lib/dependencies_extensions.rb +0 -56
- data/vendor/plugins/engines/lib/testing_extensions.rb +0 -33
- data/vendor/plugins/login_engine/db/schema.rb +0 -25
- data/vendor/plugins/login_engine/test/fixtures/templates/users.yml +0 -41
- /data/public/images/{eltBackground.png → eltBackground.jng} +0 -0
@@ -1,37 +1,64 @@
|
|
1
|
-
|
2
|
-
# Copyright (c) 2005 James Adam
|
3
|
-
#
|
4
|
-
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
-
# a copy of this software and associated documentation files (the
|
6
|
-
# "Software"), to deal in the Software without restriction, including
|
7
|
-
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
-
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
-
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
-
# the following conditions:
|
11
|
-
#
|
12
|
-
# The above copyright notice and this permission notice shall be
|
13
|
-
# included in all copies or substantial portions of the Software.
|
14
|
-
#
|
15
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
-
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
-
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
-
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
-
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
-
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
-
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
-
#++
|
1
|
+
require 'logger'
|
23
2
|
|
24
|
-
|
25
|
-
|
26
|
-
require '
|
27
|
-
|
28
|
-
require '
|
3
|
+
# load this before doing ANYTHING freaky with the reloading.
|
4
|
+
begin
|
5
|
+
require 'rails_version' # Rails 1.0, 1.1.0
|
6
|
+
rescue LoadError, Gem::Exception
|
7
|
+
require 'rails/version' # renamed as of Rails 1.1.1
|
8
|
+
end
|
29
9
|
|
10
|
+
require 'engines/ruby_extensions'
|
11
|
+
# ... further files are required at the bottom of this file
|
30
12
|
|
31
13
|
# Holds the Rails Engine loading logic and default constants
|
32
|
-
module
|
14
|
+
module Engines
|
15
|
+
|
16
|
+
class << self
|
17
|
+
# Return the version string for this plugin
|
18
|
+
def version
|
19
|
+
"#{Version::Major}.#{Version::Minor}.#{Version::Release}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# The DummyLogger is a class which might pass through to a real Logger
|
24
|
+
# if one is assigned. However, it can gracefully swallow any logging calls
|
25
|
+
# if there is now Logger assigned.
|
26
|
+
class LoggerWrapper
|
27
|
+
def initialize(logger=nil)
|
28
|
+
set_logger(logger)
|
29
|
+
end
|
30
|
+
# Assign the 'real' Logger instance that this dummy instance wraps around.
|
31
|
+
def set_logger(logger)
|
32
|
+
@logger = logger
|
33
|
+
end
|
34
|
+
# log using the appropriate method if we have a logger
|
35
|
+
# if we dont' have a logger, ignore completely.
|
36
|
+
def method_missing(name, *args)
|
37
|
+
if @logger && @logger.respond_to?(name)
|
38
|
+
@logger.send(name, *args)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
LOGGER = Engines::LoggerWrapper.new
|
44
|
+
|
45
|
+
class << self
|
46
|
+
# Create a new Logger instance for Engines, with the given outputter and level
|
47
|
+
def create_logger(outputter=STDOUT, level=Logger::INFO)
|
48
|
+
LOGGER.set_logger(Logger.new(outputter, level))
|
49
|
+
end
|
50
|
+
# Sets the Logger instance that Engines will use to send logging information to
|
51
|
+
def set_logger(logger)
|
52
|
+
Engines::LOGGER.set_logger(logger) # TODO: no need for Engines:: part
|
53
|
+
end
|
54
|
+
# Retrieves the current Logger instance
|
55
|
+
def log
|
56
|
+
Engines::LOGGER # TODO: no need for Engines:: part
|
57
|
+
end
|
58
|
+
alias :logger :log
|
59
|
+
end
|
33
60
|
|
34
|
-
# An array of active engines
|
61
|
+
# An array of active engines. This should be accessed via the Engines.active method.
|
35
62
|
ActiveEngines = []
|
36
63
|
|
37
64
|
# The root directory for engines
|
@@ -59,8 +86,6 @@ module ::Engines
|
|
59
86
|
#
|
60
87
|
# Options can include:
|
61
88
|
# * :copy_files => true | false
|
62
|
-
# * :engine_name => the name within the plugins directory this engine resides, if
|
63
|
-
# different from the first parameter
|
64
89
|
#
|
65
90
|
# Note that if a list of engines is given, the options will apply to ALL engines.
|
66
91
|
def start(*args)
|
@@ -69,7 +94,6 @@ module ::Engines
|
|
69
94
|
|
70
95
|
if args.empty?
|
71
96
|
start_all
|
72
|
-
return
|
73
97
|
else
|
74
98
|
args.each do |engine_name|
|
75
99
|
start_engine(engine_name, options)
|
@@ -79,72 +103,81 @@ module ::Engines
|
|
79
103
|
|
80
104
|
# Starts all available engines. Plugins are considered engines if they
|
81
105
|
# include an init_engine.rb file, or they are named <something>_engine.
|
82
|
-
def start_all
|
106
|
+
def start_all
|
83
107
|
plugins = Dir[File.join(config(:root), "*")]
|
84
|
-
|
108
|
+
Engines.log.debug "considering plugins: #{plugins.inspect}"
|
85
109
|
plugins.each { |plugin|
|
86
110
|
engine_name = File.basename(plugin)
|
87
|
-
if File.exist?(File.join(plugin, "init_engine.rb"))
|
88
|
-
|
89
|
-
#
|
90
|
-
|
111
|
+
if File.exist?(File.join(plugin, "init_engine.rb")) || # if the directory contains an init_engine.rb file
|
112
|
+
(engine_name =~ /_engine$/) || # or it engines in '_engines'
|
113
|
+
(engine_name =~ /_bundle$/) # or even ends in '_bundle'
|
114
|
+
|
115
|
+
start(engine_name) # start the engine...
|
116
|
+
|
91
117
|
end
|
92
118
|
}
|
93
119
|
end
|
94
120
|
|
95
121
|
def start_engine(engine_name, options={})
|
96
|
-
|
97
|
-
current_engine = Engine.new
|
98
|
-
current_engine.name = options[:engine_name] || engine_name
|
99
|
-
current_engine.root = get_engine_dir(engine_name)
|
100
122
|
|
101
|
-
#
|
102
|
-
|
123
|
+
# Create a new Engine and put this engine at the front of the ActiveEngines list
|
124
|
+
current_engine = Engine.new(engine_name)
|
125
|
+
Engines.active.unshift current_engine
|
126
|
+
Engines.log.info "Starting engine '#{current_engine.name}' from '#{File.expand_path(current_engine.root)}'"
|
103
127
|
|
104
|
-
|
128
|
+
# add the code directories of this engine to the load path
|
129
|
+
add_engine_to_load_path(current_engine)
|
105
130
|
|
106
|
-
#
|
107
|
-
|
131
|
+
# add the controller & component path to the Dependency system
|
132
|
+
engine_controllers = File.join(current_engine.root, 'app', 'controllers')
|
133
|
+
engine_components = File.join(current_engine.root, 'components')
|
108
134
|
|
109
|
-
|
110
|
-
|
135
|
+
|
136
|
+
# This mechanism is no longer required in Rails trunk
|
137
|
+
if Rails::VERSION::STRING =~ /^1.0/ && !Engines.config(:edge)
|
138
|
+
Controllers.add_path(engine_controllers) if File.exist?(engine_controllers)
|
139
|
+
Controllers.add_path(engine_components) if File.exist?(engine_components)
|
140
|
+
end
|
141
|
+
|
142
|
+
# copy the files unless indicated otherwise
|
143
|
+
if options[:copy_files] != false
|
144
|
+
current_engine.mirror_engine_files
|
145
|
+
end
|
111
146
|
|
112
147
|
# load the engine's init.rb file
|
113
148
|
startup_file = File.join(current_engine.root, "init_engine.rb")
|
114
149
|
if File.exist?(startup_file)
|
115
150
|
eval(IO.read(startup_file), binding, startup_file)
|
116
|
-
#
|
151
|
+
# possibly use require_dependency? Hmm.
|
117
152
|
else
|
118
|
-
|
119
|
-
end
|
120
|
-
|
121
|
-
# add the controller path to the Dependency system
|
122
|
-
Controllers.add_path(File.join(current_engine.root, 'app', 'controllers'))
|
123
|
-
|
124
|
-
# copy the files unless indicated otherwise
|
125
|
-
if options[:copy_files] != false
|
126
|
-
copy_engine_files(current_engine)
|
153
|
+
Engines.log.debug "No init_engines.rb file found for engine '#{current_engine.name}'..."
|
127
154
|
end
|
128
155
|
end
|
129
156
|
|
130
157
|
# Adds all directories in the /app and /lib directories within the engine
|
131
158
|
# to the load path
|
132
159
|
def add_engine_to_load_path(engine)
|
160
|
+
|
161
|
+
# remove the lib directory added by load_plugin, and place it in the corrent
|
162
|
+
# location *after* the application/lib. This can be removed when
|
163
|
+
# http://dev.rubyonrails.org/ticket/2910 is fixed.
|
164
|
+
app_lib_index = $LOAD_PATH.index(File.join(RAILS_ROOT, "lib"))
|
165
|
+
engine_lib = File.join(engine.root, "lib")
|
166
|
+
if app_lib_index
|
167
|
+
$LOAD_PATH.delete(engine_lib)
|
168
|
+
$LOAD_PATH.insert(app_lib_index+1, engine_lib)
|
169
|
+
end
|
170
|
+
|
133
171
|
# Add ALL paths under the engine root to the load path
|
134
|
-
app_dirs = [engine.root + "/app
|
135
|
-
|
136
|
-
lib_dirs = Dir[engine.root + "/lib/**/*"]
|
137
|
-
load_paths = (app_dirs + lib_dirs).select { |d|
|
172
|
+
app_dirs = Dir[engine.root + "/app/**/*"] # maybe only models?
|
173
|
+
component_dir = Dir[engine.root + "/components"]
|
174
|
+
lib_dirs = Dir[engine.root + "/lib/**/*"]
|
175
|
+
load_paths = (app_dirs + component_dir + lib_dirs).select { |d|
|
138
176
|
File.directory?(d)
|
139
177
|
}
|
140
178
|
|
141
|
-
# Remove other engines from the $LOAD_PATH
|
179
|
+
# Remove other engines from the $LOAD_PATH by matching against the engine.root values
|
142
180
|
# in ActiveEngines. Store the removed engines in the order they came off.
|
143
|
-
#
|
144
|
-
# This is a hack - if Ticket http://dev.rubyonrails.com/ticket/2817 is accepted, then
|
145
|
-
# a new Engines system can be developed which only modifies load paths in one sweep,
|
146
|
-
# thus avoiding this.
|
147
|
-
#
|
148
181
|
|
149
182
|
old_plugin_paths = []
|
150
183
|
# assumes that all engines are at the bottom of the $LOAD_PATH
|
@@ -156,8 +189,9 @@ module ::Engines
|
|
156
189
|
# add these LAST on the load path.
|
157
190
|
load_paths.reverse.each { |dir|
|
158
191
|
if File.directory?(dir)
|
159
|
-
|
160
|
-
|
192
|
+
Engines.log.debug "adding #{File.expand_path(dir)} to the load path"
|
193
|
+
#$LOAD_PATH.push(File.expand_path(dir))
|
194
|
+
$LOAD_PATH.push dir
|
161
195
|
end
|
162
196
|
}
|
163
197
|
|
@@ -167,18 +201,16 @@ module ::Engines
|
|
167
201
|
$LOAD_PATH.uniq!
|
168
202
|
end
|
169
203
|
|
170
|
-
#
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
public_engine_dir = File.expand_path(File.join(RAILS_ROOT, "public", Engines.config(:public_dir)))
|
178
|
-
|
204
|
+
# Returns the directory in which all engine public assets are mirrored.
|
205
|
+
def public_engine_dir
|
206
|
+
File.expand_path(File.join(RAILS_ROOT, "public", Engines.config(:public_dir)))
|
207
|
+
end
|
208
|
+
|
209
|
+
# create the /public/engine_files directory if it doesn't exist
|
210
|
+
def create_base_public_directory
|
179
211
|
if !File.exists?(public_engine_dir)
|
180
212
|
# create the public/engines directory, with a warning message in it.
|
181
|
-
|
213
|
+
Engines.log.debug "Creating public engine files directory '#{public_engine_dir}'"
|
182
214
|
FileUtils.mkdir(public_engine_dir)
|
183
215
|
File.open(File.join(public_engine_dir, "README"), "w") do |f|
|
184
216
|
f.puts <<EOS
|
@@ -186,107 +218,185 @@ Files in this directory are automatically generated from your Rails Engines.
|
|
186
218
|
They are copied from the 'public' directories of each engine into this directory
|
187
219
|
each time Rails starts (server, console... any time 'start_engine' is called).
|
188
220
|
Any edits you make will NOT persist across the next server restart; instead you
|
189
|
-
should edit the files within the <engine_name>/public directory itself.
|
221
|
+
should edit the files within the <engine_name>/public/ directory itself.
|
190
222
|
EOS
|
191
223
|
end
|
192
224
|
end
|
225
|
+
end
|
226
|
+
|
227
|
+
# Returns the Engine object for the specified engine, e.g.:
|
228
|
+
# Engines.get(:login)
|
229
|
+
def get(name)
|
230
|
+
active.find { |e| e.name == name.to_s || e.name == "#{name}_engine" }
|
231
|
+
end
|
232
|
+
alias_method :[], :get
|
193
233
|
|
194
|
-
|
195
|
-
|
234
|
+
# Returns the Engine object for the current engine, i.e. the engine
|
235
|
+
# in which the currently executing code lies.
|
236
|
+
def current
|
237
|
+
current_file = caller[0]
|
238
|
+
active.find do |engine|
|
239
|
+
File.expand_path(current_file).index(File.expand_path(engine.root)) == 0
|
240
|
+
end
|
241
|
+
end
|
196
242
|
|
243
|
+
# Returns an array of active engines
|
244
|
+
def active
|
245
|
+
ActiveEngines
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
# A simple class for holding information about loaded engines
|
251
|
+
class Engine
|
252
|
+
|
253
|
+
# Returns the base path of this engine
|
254
|
+
attr_accessor :root
|
255
|
+
|
256
|
+
# Returns the name of this engine
|
257
|
+
attr_reader :name
|
258
|
+
|
259
|
+
# An attribute for holding the current version of this engine. There are three
|
260
|
+
# ways of providing an engine version. The simplest is using a string:
|
261
|
+
#
|
262
|
+
# Engines.current.version = "1.0.7"
|
263
|
+
#
|
264
|
+
# Alternatively you can set it to a module which contains Major, Minor and Release
|
265
|
+
# constants:
|
266
|
+
#
|
267
|
+
# module LoginEngine::Version
|
268
|
+
# Major = 1; Minor = 0; Release = 6;
|
269
|
+
# end
|
270
|
+
# Engines.current.version = LoginEngine::Version
|
271
|
+
#
|
272
|
+
# Finally, you can set it to your own Proc, if you need something really fancy:
|
273
|
+
#
|
274
|
+
# Engines.current.version = Proc.new { File.open('VERSION', 'r').readlines[0] }
|
275
|
+
#
|
276
|
+
attr_writer :version
|
277
|
+
|
278
|
+
# Engine developers can store any information they like in here.
|
279
|
+
attr_writer :info
|
280
|
+
|
281
|
+
# Creates a new object holding information about an Engine.
|
282
|
+
def initialize(name)
|
283
|
+
|
284
|
+
@root = ''
|
285
|
+
suffixes = ['', '_engine', '_bundle']
|
286
|
+
while !File.exist?(@root) && !suffixes.empty?
|
287
|
+
suffix = suffixes.shift
|
288
|
+
@root = File.join(Engines.config(:root), name.to_s + suffix)
|
289
|
+
end
|
290
|
+
|
291
|
+
if !File.exist?(@root)
|
292
|
+
raise "Cannot find the engine '#{name}' in either /vendor/plugins/#{name}, " +
|
293
|
+
"/vendor/plugins/#{name}_engine or /vendor/plugins/#{name}_bundle."
|
294
|
+
end
|
295
|
+
|
296
|
+
@name = File.basename(@root)
|
297
|
+
end
|
298
|
+
|
299
|
+
# Returns the version string of this engine
|
300
|
+
def version
|
301
|
+
case @version
|
302
|
+
when Module
|
303
|
+
"#{@version::Major}.#{@version::Minor}.#{@version::Release}"
|
304
|
+
when Proc # not sure about this
|
305
|
+
@version.call
|
306
|
+
when NilClass
|
307
|
+
'unknown'
|
308
|
+
else
|
309
|
+
@version
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
# Returns a string describing this engine
|
314
|
+
def info
|
315
|
+
@info || '(none)'
|
316
|
+
end
|
317
|
+
|
318
|
+
# Returns a string representation of this engine
|
319
|
+
def to_s
|
320
|
+
"Engine<'#{@name}' [#{version}]:#{root.gsub(RAILS_ROOT, '')}>"
|
321
|
+
end
|
322
|
+
|
323
|
+
# return the path to this Engine's public files (with a leading '/' for use in URIs)
|
324
|
+
def public_dir
|
325
|
+
File.join("/", Engines.config(:public_dir), name)
|
326
|
+
end
|
327
|
+
|
328
|
+
# Replicates the subdirectories under the engine's /public directory into
|
329
|
+
# the corresponding public directory.
|
330
|
+
def mirror_engine_files
|
331
|
+
|
332
|
+
begin
|
333
|
+
Engines.create_base_public_directory
|
334
|
+
|
335
|
+
source = File.join(root, "public")
|
336
|
+
Engines.log.debug "Attempting to copy public engine files from '#{source}'"
|
337
|
+
|
197
338
|
# if there is no public directory, just return after this file
|
198
339
|
return if !File.exist?(source)
|
199
340
|
|
200
341
|
source_files = Dir[source + "/**/*"]
|
201
342
|
source_dirs = source_files.select { |d| File.directory?(d) }
|
202
343
|
source_files -= source_dirs
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
# ensure that we are copying to <something>_engine, whatever the user gives us
|
207
|
-
full_engine_name = engine.name
|
208
|
-
full_engine_name += "_engine" if !(full_engine_name =~ /\_engine$/)
|
344
|
+
|
345
|
+
Engines.log.debug "source dirs: #{source_dirs.inspect}"
|
209
346
|
|
347
|
+
# Create the engine_files/<something>_engine dir if it doesn't exist
|
348
|
+
new_engine_dir = File.join(RAILS_ROOT, "public", public_dir)
|
349
|
+
if !File.exists?(new_engine_dir)
|
350
|
+
# Create <something>_engine dir with a message
|
351
|
+
Engines.log.debug "Creating #{public_dir} public dir"
|
352
|
+
FileUtils.mkdir_p(new_engine_dir)
|
353
|
+
end
|
210
354
|
|
211
355
|
# create all the directories, transforming the old path into the new path
|
212
356
|
source_dirs.uniq.each { |dir|
|
213
357
|
begin
|
214
|
-
|
215
|
-
#
|
216
|
-
|
217
|
-
|
358
|
+
# strip out the base path and add the result to the public path, i.e. replace
|
359
|
+
# ../script/../vendor/plugins/engine_name/public/javascript
|
360
|
+
# with
|
361
|
+
# engine_name/javascript
|
362
|
+
#
|
363
|
+
relative_dir = dir.gsub(File.join(root, "public"), name)
|
364
|
+
target_dir = File.join(Engines.public_engine_dir, relative_dir)
|
218
365
|
unless File.exist?(target_dir)
|
219
|
-
|
220
|
-
FileUtils.mkdir_p(
|
366
|
+
Engines.log.debug "creating directory '#{target_dir}'"
|
367
|
+
FileUtils.mkdir_p(target_dir)
|
221
368
|
end
|
222
369
|
rescue Exception => e
|
223
370
|
raise "Could not create directory #{target_dir}: \n" + e
|
224
371
|
end
|
225
372
|
}
|
226
373
|
|
227
|
-
|
228
|
-
|
229
374
|
# copy all the files, transforming the old path into the new path
|
230
375
|
source_files.uniq.each { |file|
|
231
376
|
begin
|
232
377
|
# change the path from the ENGINE ROOT to the public directory root for this engine
|
233
|
-
target = file.gsub(File.join(
|
234
|
-
File.join(public_engine_dir,
|
378
|
+
target = file.gsub(File.join(root, "public"),
|
379
|
+
File.join(Engines.public_engine_dir, name))
|
235
380
|
unless File.exist?(target) && FileUtils.identical?(file, target)
|
236
|
-
|
381
|
+
Engines.log.debug "copying file '#{file}' to '#{target}'"
|
237
382
|
FileUtils.cp(file, target)
|
238
383
|
end
|
239
384
|
rescue Exception => e
|
240
385
|
raise "Could not copy #{file} to #{target}: \n" + e
|
241
386
|
end
|
242
387
|
}
|
388
|
+
rescue Exception => e
|
389
|
+
Engines.log.warn "WARNING: Couldn't create the engine public file structure for engine '#{name}'; Error follows:"
|
390
|
+
Engines.log.warn e
|
243
391
|
end
|
244
|
-
|
245
|
-
|
246
|
-
#private
|
247
|
-
# Return the directory in which this engine is present
|
248
|
-
def get_engine_dir(engine_name)
|
249
|
-
engine_dir=File.join(Engines.config(:root), engine_name.to_s)
|
250
|
-
|
251
|
-
if !File.exist?(engine_dir)
|
252
|
-
# try adding "_engine" to the end of the path.
|
253
|
-
engine_dir += "_engine"
|
254
|
-
if !File.exist?(engine_dir)
|
255
|
-
raise "Cannot find the engine '#{engine_name}' in either /vendor/plugins/#{engine} or /vendor/plugins/#{engine}_engine..."
|
256
|
-
end
|
257
|
-
end
|
258
|
-
|
259
|
-
engine_dir
|
260
|
-
end
|
261
|
-
|
262
|
-
# Returns the Engine object for the specified engine, e.g.:
|
263
|
-
# Engines.get(:login)
|
264
|
-
def get(name)
|
265
|
-
ActiveEngines.find { |e| e.name == name.to_s || e.name == "#{name}_engine" }
|
266
|
-
end
|
267
|
-
|
268
|
-
# Returns the Engine object for the current engine, i.e. the engine
|
269
|
-
# in which the currently executing code lies.
|
270
|
-
def current()
|
271
|
-
#puts caller.inspect
|
272
|
-
#puts ">>> " + caller[0]
|
273
|
-
current_file = caller[0]
|
274
|
-
ActiveEngines.find do |engine|
|
275
|
-
File.expand_path(current_file).index(File.expand_path(engine.root)) == 0
|
276
|
-
end
|
277
|
-
end
|
278
|
-
end
|
392
|
+
end
|
279
393
|
end
|
280
394
|
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
def name=(val) @name = val.to_s end
|
291
|
-
def to_s() "Engine<#{@name}>" end
|
292
|
-
end
|
395
|
+
|
396
|
+
# These files must be required after the Engines module has been defined.
|
397
|
+
require 'engines/dependencies_extensions'
|
398
|
+
require 'engines/action_view_extensions'
|
399
|
+
require 'engines/action_mailer_extensions'
|
400
|
+
require 'engines/testing_extensions'
|
401
|
+
require 'engines/migration_extensions'
|
402
|
+
require 'engines/active_record_extensions'
|
@@ -0,0 +1,161 @@
|
|
1
|
+
module Engines
|
2
|
+
module RakeTasks
|
3
|
+
def self.all_engines
|
4
|
+
# An engine is informally defined as any subdirectory in vendor/plugins
|
5
|
+
# which ends in '_engine', '_bundle', or contains an 'init_engine.rb' file.
|
6
|
+
engine_base_dirs = ['vendor/plugins']
|
7
|
+
# The engine root may be different; if possible try to include
|
8
|
+
# those directories too
|
9
|
+
if Engines.const_defined?(:CONFIG)
|
10
|
+
engine_base_dirs << Engines::CONFIG[:root]
|
11
|
+
end
|
12
|
+
engine_base_dirs.map! {|d| [d + '/*_engine/*',
|
13
|
+
d + '/*_bundle/*',
|
14
|
+
d + '/*/init_engine.rb']}.flatten!
|
15
|
+
engine_dirs = FileList.new(*engine_base_dirs)
|
16
|
+
engine_dirs.map do |engine|
|
17
|
+
File.basename(File.dirname(engine))
|
18
|
+
end.uniq
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
namespace :engines do
|
25
|
+
desc "Display version information about active engines"
|
26
|
+
task :info => :environment do
|
27
|
+
if ENV["ENGINE"]
|
28
|
+
e = Engines.get(ENV["ENGINE"])
|
29
|
+
header = "Details for engine '#{e.name}':"
|
30
|
+
puts header
|
31
|
+
puts "-" * header.length
|
32
|
+
puts "Version: #{e.version}"
|
33
|
+
puts "Details: #{e.info}"
|
34
|
+
else
|
35
|
+
puts "Engines plugin: #{Engines.version}"
|
36
|
+
Engines.active.each do |e|
|
37
|
+
puts "#{e.name}: #{e.version}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
namespace :db do
|
44
|
+
namespace :fixtures do
|
45
|
+
namespace :engines do
|
46
|
+
|
47
|
+
desc "Load plugin/engine fixtures into the current environment's database."
|
48
|
+
task :load => :environment do
|
49
|
+
require 'active_record/fixtures'
|
50
|
+
ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
|
51
|
+
plugin = ENV['ENGINE'] || '*'
|
52
|
+
Dir.glob(File.join(RAILS_ROOT, 'vendor', 'plugins', plugin, 'test', 'fixtures', '*.yml')).each do |fixture_file|
|
53
|
+
Fixtures.create_fixtures(File.dirname(fixture_file), File.basename(fixture_file, '.*'))
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
namespace :migrate do
|
62
|
+
|
63
|
+
desc "Migrate all engines. Target specific version with VERSION=x, specific engine with ENGINE=x"
|
64
|
+
task :engines => :environment do
|
65
|
+
engines_to_migrate = ENV["ENGINE"] ? [Engines.get(ENV["ENGINE"])].compact : Engines.active
|
66
|
+
if engines_to_migrate.empty?
|
67
|
+
puts "Couldn't find an engine called '#{ENV["ENGINE"]}'"
|
68
|
+
else
|
69
|
+
if ENV["VERSION"] && !ENV["ENGINE"]
|
70
|
+
# ignore the VERSION, since it makes no sense in this context; we wouldn't
|
71
|
+
# want to revert ALL engines to the same version because of a misttype
|
72
|
+
puts "Ignoring the given version (#{ENV["VERSION"]})."
|
73
|
+
puts "To control individual engine versions, use the ENGINE=<engine> argument"
|
74
|
+
else
|
75
|
+
engines_to_migrate.each do |engine|
|
76
|
+
Engines::EngineMigrator.current_engine = engine
|
77
|
+
migration_directory = File.join(engine.root, 'db', 'migrate')
|
78
|
+
if File.exist?(migration_directory)
|
79
|
+
puts "Migrating engine '#{engine.name}'"
|
80
|
+
Engines::EngineMigrator.migrate(migration_directory, ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
|
81
|
+
else
|
82
|
+
puts "The db/migrate directory for engine '#{engine.name}' appears to be missing."
|
83
|
+
puts "Should be: #{migration_directory}"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
if ActiveRecord::Base.schema_format == :ruby && !engines_to_migrate.empty?
|
87
|
+
Rake::Task[:db_schema_dump].invoke
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
namespace :engines do
|
94
|
+
Engines::RakeTasks.all_engines.each do |engine_name|
|
95
|
+
desc "Migrate the '#{engine_name}' engine. Target specific version with VERSION=x"
|
96
|
+
task engine_name => :environment do
|
97
|
+
ENV['ENGINE'] = engine_name; Rake::Task['db:migrate:engines'].invoke
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
# this is just a rip-off from the plugin stuff in railties/lib/tasks/documentation.rake,
|
107
|
+
# because the default plugindoc stuff doesn't support subdirectories like <engine>/app or
|
108
|
+
# <engine>/component.
|
109
|
+
namespace :doc do
|
110
|
+
|
111
|
+
desc "Generate documation for all installed engines"
|
112
|
+
task :engines => Engines::RakeTasks.all_engines.map {|engine| "doc:engines:#{engine}"}
|
113
|
+
|
114
|
+
namespace :engines do
|
115
|
+
# Define doc tasks for each engine
|
116
|
+
Engines::RakeTasks.all_engines.each do |engine_name|
|
117
|
+
desc "Generation documentation for the '#{engine_name}' engine"
|
118
|
+
task engine_name => :environment do
|
119
|
+
engine_base = "vendor/plugins/#{engine_name}"
|
120
|
+
options = []
|
121
|
+
files = Rake::FileList.new
|
122
|
+
options << "-o doc/plugins/#{engine_name}"
|
123
|
+
options << "--title '#{engine_name.titlecase} Documentation'"
|
124
|
+
options << '--line-numbers --inline-source'
|
125
|
+
options << '--all' # include protected methods
|
126
|
+
options << '-T html'
|
127
|
+
|
128
|
+
files.include("#{engine_base}/lib/**/*.rb")
|
129
|
+
files.include("#{engine_base}/app/**/*.rb") # include the app directory
|
130
|
+
files.include("#{engine_base}/components/**/*.rb") # include the components directory
|
131
|
+
if File.exists?("#{engine_base}/README")
|
132
|
+
files.include("#{engine_base}/README")
|
133
|
+
options << "--main '#{engine_base}/README'"
|
134
|
+
end
|
135
|
+
files.include("#{engine_base}/CHANGELOG") if File.exists?("#{engine_base}/CHANGELOG")
|
136
|
+
|
137
|
+
options << files.to_s
|
138
|
+
|
139
|
+
sh %(rdoc #{options * ' '})
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
namespace :test do
|
146
|
+
desc "Run the engine tests in vendor/plugins/**/test (or specify with ENGINE=name)"
|
147
|
+
# NOTE: we're using the Rails 1.0 non-namespaced task here, just to maintain
|
148
|
+
# compatibility with Rails 1.0
|
149
|
+
# TODO: make this work with Engines.config(:root)
|
150
|
+
Rake::TestTask.new(:engines => :prepare_test_database) do |t|
|
151
|
+
t.libs << "test"
|
152
|
+
|
153
|
+
if ENV['ENGINE']
|
154
|
+
t.pattern = "vendor/plugins/#{ENV['ENGINE']}/test/**/*_test.rb"
|
155
|
+
else
|
156
|
+
t.pattern = 'vendor/plugins/**/test/**/*_test.rb'
|
157
|
+
end
|
158
|
+
|
159
|
+
t.verbose = true
|
160
|
+
end
|
161
|
+
end
|