compass-rails 1.0.3 → 1.1.0.pre
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/.gitignore +1 -0
- data/.travis.yml +1 -2
- data/Appraisals +6 -5
- data/Gemfile +4 -3
- data/README.md +4 -31
- data/changelog.markdown +11 -0
- data/compass-rails.gemspec +3 -3
- data/gemfiles/rails3.gemfile +3 -2
- data/gemfiles/rails31.gemfile +3 -2
- data/gemfiles/rails32.gemfile +3 -2
- data/gemfiles/{rails2.gemfile → rails40.gemfile} +5 -3
- data/lib/compass-rails.rb +24 -9
- data/lib/compass-rails/configuration/3_1.rb +4 -0
- data/lib/compass-rails/patches.rb +4 -4
- data/lib/compass-rails/patches/3_1.rb +6 -1
- data/lib/compass-rails/patches/4_0.rb +30 -0
- data/lib/compass-rails/patches/sass_importer.rb +31 -0
- data/lib/compass-rails/patches/sprite_importer.rb +15 -23
- data/lib/compass-rails/patches/static_compiler.rb +1 -1
- data/lib/compass-rails/railties.rb +4 -4
- data/lib/compass-rails/railties/3_1.rb +10 -6
- data/lib/compass-rails/railties/4_0.rb +102 -0
- data/lib/compass-rails/version.rb +1 -1
- data/test/helpers/file_helper.rb +1 -1
- data/test/helpers/rails_helper.rb +15 -16
- data/test/helpers/rails_project.rb +10 -64
- data/test/integrations/rails3_test.rb +4 -4
- data/test/integrations/rails_32_without_pipeline_test.rb +37 -0
- data/test/integrations/{rails_23_test.rb → rails_40_test.rb} +21 -3
- metadata +33 -27
- data/gemfiles/rails2.gemfile.lock +0 -81
- data/gemfiles/rails3.gemfile.lock +0 -128
- data/gemfiles/rails31.gemfile.lock +0 -145
- data/gemfiles/rails32.gemfile.lock +0 -142
@@ -1,11 +1,11 @@
|
|
1
1
|
if defined?(::Rails)
|
2
|
-
if CompassRails.
|
3
|
-
require "compass-rails/railties/2_3"
|
4
|
-
elsif CompassRails.rails31? || CompassRails.rails32?
|
2
|
+
if CompassRails.rails31? || CompassRails.rails32?
|
5
3
|
require "compass-rails/railties/3_1"
|
6
4
|
elsif CompassRails.rails3?
|
7
5
|
require "compass-rails/railties/3_0"
|
6
|
+
elsif CompassRails.rails4?
|
7
|
+
require "compass-rails/railties/4_0"
|
8
8
|
else
|
9
9
|
$stderr.puts "Unsupported rails environment for compass"
|
10
10
|
end
|
11
|
-
end
|
11
|
+
end
|
@@ -88,12 +88,16 @@ module CompassRails
|
|
88
88
|
class Railtie < Rails::Railtie
|
89
89
|
|
90
90
|
initializer "compass.initialize_rails", :group => :all do |app|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
91
|
+
if CompassRails.asset_pipeline_enabled?
|
92
|
+
require 'compass-rails/patches/3_1'
|
93
|
+
# Configure compass for use within rails, and provide the project configuration
|
94
|
+
# that came via the rails boot process.
|
95
|
+
CompassRails.check_for_double_boot!
|
96
|
+
Compass.discover_extensions!
|
97
|
+
CompassRails.configure_rails!(app)
|
98
|
+
else
|
99
|
+
CompassRails.initialize!(app.config.compass)
|
100
|
+
end
|
97
101
|
end
|
98
102
|
end
|
99
103
|
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
#3.1.3
|
2
|
+
require 'compass'
|
3
|
+
require 'rails/railtie'
|
4
|
+
|
5
|
+
class Rails::Railtie::Configuration
|
6
|
+
# Adds compass configuration accessor to the application configuration.
|
7
|
+
#
|
8
|
+
# If a configuration file for compass exists, it will be read in and
|
9
|
+
# the project's configuration values will already be set on the config
|
10
|
+
# object.
|
11
|
+
#
|
12
|
+
# For example:
|
13
|
+
#
|
14
|
+
# module MyApp
|
15
|
+
# class Application < Rails::Application
|
16
|
+
# config.compass.line_comments = !Rails.env.production?
|
17
|
+
# config.compass.fonts_dir = "app/assets/fonts"
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# It is suggested that you create a compass configuration file if you
|
22
|
+
# want a quicker boot time when using the compass command line tool.
|
23
|
+
#
|
24
|
+
# For more information on available configuration options see:
|
25
|
+
# http://compass-style.org/help/tutorials/configuration-reference/
|
26
|
+
def compass
|
27
|
+
@compass ||= begin
|
28
|
+
data = if (config_file = Compass.detect_configuration_file) && (config_data = Compass.configuration_for(config_file))
|
29
|
+
config_data
|
30
|
+
else
|
31
|
+
Compass::Configuration::Data.new("rails_config")
|
32
|
+
end
|
33
|
+
data.project_type = :rails # Forcing this makes sure all the rails defaults will be loaded.
|
34
|
+
Compass.add_configuration(:rails)
|
35
|
+
Compass.add_configuration(data)
|
36
|
+
Compass.configuration.on_sprite_saved do |filename|
|
37
|
+
# This is a huge hack based on reading through the sprockets internals.
|
38
|
+
# Sprockets needs an API for adding assets during precompilation.
|
39
|
+
# At a minimum sprockets should provide this API:
|
40
|
+
#
|
41
|
+
# #filename is a path in the asset source directory
|
42
|
+
# Rails.application.assets.new_asset!(filename)
|
43
|
+
#
|
44
|
+
# # logical_path is how devs refer to it, data is the contents of it.
|
45
|
+
# Rails.application.assets.new_asset!(logical_path, data)
|
46
|
+
#
|
47
|
+
# I would also like to select one of the above calls based on whether
|
48
|
+
# the user is precompiling or not:
|
49
|
+
#
|
50
|
+
# Rails.application.assets.precompiling? #=> true or false
|
51
|
+
#
|
52
|
+
# But even the above is not an ideal API. The issue is that compass sprites need to
|
53
|
+
# avoid generation if the sprite file is already generated (which can be quite time
|
54
|
+
# consuming). To do this, compass has it's own uniqueness hash based on the user's
|
55
|
+
# inputs instead of being based on the file contents. So if we could provide our own
|
56
|
+
# hash or some metadata that is opaque to sprockets that could be read from the
|
57
|
+
# asset's attributes, we could avoid cluttering the assets directory with generated
|
58
|
+
# sprites and always just use the logical_path + data version of the api.
|
59
|
+
if Rails.application.config.assets.digest && # if digesting is enabled
|
60
|
+
caller.grep(%r{/sprockets/rails/task.rb}).any? && #OMG HAX - check if we're being precompiled
|
61
|
+
Compass.configuration.generated_images_path[Compass.configuration.images_path.to_s] # if the generated images path is not in the assets images directory, we don't have to do these backflips
|
62
|
+
|
63
|
+
# Clear entries in Hike::Index for this sprite's directory.
|
64
|
+
# This makes sure the asset can be found by find_assets
|
65
|
+
Rails.application.assets.send(:trail).instance_variable_get(:@entries).delete(File.dirname(filename))
|
66
|
+
|
67
|
+
pathname = Pathname.new(filename)
|
68
|
+
logical_path = pathname.relative_path_from(Pathname.new(Compass.configuration.images_path))
|
69
|
+
asset = Rails.application.assets.find_asset(logical_path)
|
70
|
+
target = File.join(Rails.public_path, Rails.application.config.assets.prefix, asset.digest_path)
|
71
|
+
|
72
|
+
# Adds the asset to the manifest file.
|
73
|
+
|
74
|
+
manifest = ActionView::Base.assets_manifest
|
75
|
+
manifest.assets[logical_path.to_s] = asset.digest_path
|
76
|
+
|
77
|
+
|
78
|
+
# Adds the fingerprinted asset to the public directory
|
79
|
+
FileUtils.mkdir_p File.dirname(target)
|
80
|
+
asset.write_to target
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
84
|
+
data
|
85
|
+
end
|
86
|
+
@compass
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
module CompassRails
|
91
|
+
class Railtie < Rails::Railtie
|
92
|
+
|
93
|
+
initializer "compass.initialize_rails", :group => :all do |app|
|
94
|
+
require 'compass-rails/patches/4_0'
|
95
|
+
# Configure compass for use within rails, and provide the project configuration
|
96
|
+
# that came via the rails boot process.
|
97
|
+
CompassRails.check_for_double_boot!
|
98
|
+
Compass.discover_extensions!
|
99
|
+
CompassRails.configure_rails!(app)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
data/test/helpers/file_helper.rb
CHANGED
@@ -5,32 +5,32 @@ module CompassRails
|
|
5
5
|
include FileHelper
|
6
6
|
include DebugHelper
|
7
7
|
include CommandHelper
|
8
|
+
RAILS_4_0 = "4.0"
|
8
9
|
RAILS_3_2 = "3.2"
|
9
10
|
RAILS_3_1 = "3.1"
|
10
11
|
RAILS_3 = "3.0"
|
11
|
-
RAILS_2 = "2.3"
|
12
12
|
|
13
13
|
WORKING_DIR = File.join(ROOT_PATH, 'rails-temp')
|
14
14
|
|
15
15
|
GEMFILES = {
|
16
|
+
RAILS_4_0 => GEMFILES_DIR.join("rails40.gemfile").to_s,
|
16
17
|
RAILS_3_2 => GEMFILES_DIR.join("rails32.gemfile").to_s,
|
17
18
|
RAILS_3_1 => GEMFILES_DIR.join("rails31.gemfile").to_s,
|
18
|
-
RAILS_3 => GEMFILES_DIR.join("rails3.gemfile").to_s
|
19
|
-
RAILS_2 => GEMFILES_DIR.join("rails2.gemfile").to_s
|
19
|
+
RAILS_3 => GEMFILES_DIR.join("rails3.gemfile").to_s
|
20
20
|
}
|
21
|
-
|
22
|
-
|
21
|
+
|
22
|
+
GENERATOR_OPTIONS = {
|
23
|
+
RAILS_4_0 => ['-q', '-G', '-O', '--skip-bundle'],
|
23
24
|
RAILS_3_2 => ['-q', '-G', '-O', '--skip-bundle'],
|
24
25
|
RAILS_3_1 => ['-q', '-G', '-O', '--skip-bundle'],
|
25
|
-
RAILS_3 => ['-q', '-G', '-O', '--skip-bundle']
|
26
|
-
RAILS_2 => ['-q']
|
26
|
+
RAILS_3 => ['-q', '-G', '-O', '--skip-bundle']
|
27
27
|
}
|
28
|
-
|
28
|
+
|
29
29
|
GENERATOR_COMMAND = {
|
30
|
+
RAILS_4_0 => 'new',
|
30
31
|
RAILS_3_2 => 'new',
|
31
32
|
RAILS_3_1 => 'new',
|
32
|
-
RAILS_3 => 'new'
|
33
|
-
RAILS_2 => ''
|
33
|
+
RAILS_3 => 'new'
|
34
34
|
}
|
35
35
|
|
36
36
|
def rails_command(options, version)
|
@@ -42,24 +42,23 @@ module CompassRails
|
|
42
42
|
# with the rails libraries. This will allow testing against multiple versions of rails
|
43
43
|
# by manipulating the load path.
|
44
44
|
def generate_rails_app(name, version, options=[])
|
45
|
-
options +=
|
45
|
+
options += GENERATOR_OPTIONS[version]
|
46
46
|
rails_command([GENERATOR_COMMAND[version], name, *options], version)
|
47
47
|
end
|
48
48
|
|
49
|
-
def within_rails_app(named, version, &block)
|
49
|
+
def within_rails_app(named, version, asset_pipeline_enabled = true, &block)
|
50
50
|
dir = "#{named}-#{version}"
|
51
51
|
rm_rf File.join(WORKING_DIR, dir)
|
52
52
|
mkdir_p WORKING_DIR
|
53
53
|
cd(WORKING_DIR) do
|
54
|
-
generate_rails_app(dir, version)
|
54
|
+
generate_rails_app(dir, version, asset_pipeline_enabled ? [] : ["-S"])
|
55
55
|
cd(dir) do
|
56
|
-
yield RailsProject.new(File.join(WORKING_DIR, dir), version)
|
56
|
+
yield RailsProject.new(File.join(WORKING_DIR, dir), version, asset_pipeline_enabled)
|
57
57
|
end
|
58
58
|
end
|
59
59
|
rm_rf File.join(WORKING_DIR, dir)
|
60
60
|
end
|
61
|
-
|
62
61
|
|
63
62
|
end
|
64
63
|
end
|
65
|
-
end
|
64
|
+
end
|
@@ -16,16 +16,16 @@ module CompassRails
|
|
16
16
|
BOOT_FILE = 'config/boot.rb'
|
17
17
|
|
18
18
|
|
19
|
-
attr_reader :directory, :version
|
19
|
+
attr_reader :directory, :version, :asset_pipeline_enabled
|
20
20
|
|
21
|
-
def initialize(directory, version)
|
21
|
+
def initialize(directory, version, asset_pipeline_enabled = true)
|
22
22
|
@directory = Pathname.new(directory)
|
23
23
|
@version = version
|
24
|
-
|
24
|
+
@asset_pipeline_enabled = asset_pipeline_enabled
|
25
25
|
end
|
26
26
|
|
27
27
|
## FILE METHODS
|
28
|
-
|
28
|
+
|
29
29
|
def to_s
|
30
30
|
directory_name
|
31
31
|
end
|
@@ -39,10 +39,9 @@ module CompassRails
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def screen_file
|
42
|
-
|
43
|
-
when RAILS_3_1, RAILS_3_2
|
42
|
+
if asset_pipeline_enabled
|
44
43
|
return directory.join('app', 'assets', 'stylesheets', 'screen.css.scss')
|
45
|
-
|
44
|
+
else
|
46
45
|
return directory.join('app', 'assets', 'stylesheets','screen.scss')
|
47
46
|
end
|
48
47
|
end
|
@@ -65,10 +64,6 @@ module CompassRails
|
|
65
64
|
directory.join(APPLICATION_FILE).exist?
|
66
65
|
end
|
67
66
|
|
68
|
-
def rails2?
|
69
|
-
directory.join(BOOT_FILE).exist? && !directory.join(APPLICATION_FILE).exist?
|
70
|
-
end
|
71
|
-
|
72
67
|
def boots?
|
73
68
|
string = 'THIS IS MY RANDOM AWESOME TEST STRING'
|
74
69
|
test_string = "puts \"#{string}\""
|
@@ -82,12 +77,7 @@ module CompassRails
|
|
82
77
|
end
|
83
78
|
|
84
79
|
def runner(string)
|
85
|
-
|
86
|
-
when RAILS_3_1, RAILS_3, RAILS_3_2
|
87
|
-
rails_command(['runner', "'#{string}'"], version)
|
88
|
-
when RAILS_2
|
89
|
-
run_command("script/runner '#{string}'", GEMFILES[version])
|
90
|
-
end
|
80
|
+
rails_command(['runner', "'#{string}'"], version)
|
91
81
|
end
|
92
82
|
|
93
83
|
# COMPASS METHODS
|
@@ -110,57 +100,13 @@ module CompassRails
|
|
110
100
|
else
|
111
101
|
"\n config.#{property} = '#{value}'\n"
|
112
102
|
end
|
113
|
-
inject_into_file(directory.join(APPLICATION_FILE), value, :after, '
|
103
|
+
inject_into_file(directory.join(APPLICATION_FILE), value, :after, 'class Application < Rails::Application')
|
114
104
|
end
|
115
105
|
|
116
106
|
## GEM METHODS
|
117
107
|
|
118
108
|
def configure_for_bundler!
|
119
|
-
|
120
|
-
bundle = <<-BUNDLER
|
121
|
-
class Rails::Boot
|
122
|
-
def run
|
123
|
-
load_initializer
|
124
|
-
|
125
|
-
Rails::Initializer.class_eval do
|
126
|
-
def load_gems
|
127
|
-
@bundler_loaded ||= Bundler.require :default, Rails.env
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
Rails::Initializer.run(:set_load_path)
|
132
|
-
end
|
133
|
-
end
|
134
|
-
BUNDLER
|
135
|
-
inject_into_file(directory.join('config/boot.rb'), bundle, :before, 'Rails.boot!')
|
136
|
-
|
137
|
-
touch directory.join('config/preinitializer.rb')
|
138
|
-
preinit = <<-PREINIT
|
139
|
-
begin
|
140
|
-
require "rubygems"
|
141
|
-
require "bundler"
|
142
|
-
rescue LoadError
|
143
|
-
raise "Could not load the bundler gem. Install it with `gem install bundler`."
|
144
|
-
end
|
145
|
-
|
146
|
-
if Gem::Version.new(Bundler::VERSION) <= Gem::Version.new("0.9.24")
|
147
|
-
raise RuntimeError, "Your bundler version is too old for Rails 2.3." +
|
148
|
-
"Run `gem install bundler` to upgrade."
|
149
|
-
end
|
150
|
-
|
151
|
-
begin
|
152
|
-
# Set up load paths for all bundled gems
|
153
|
-
ENV["BUNDLE_GEMFILE"] = File.expand_path("../../Gemfile", __FILE__)
|
154
|
-
Bundler.setup
|
155
|
-
rescue Bundler::GemNotFound
|
156
|
-
raise RuntimeError, "Bundler couldn't find some gems." +
|
157
|
-
"Did you run `bundle install`?"
|
158
|
-
end
|
159
|
-
PREINIT
|
160
|
-
inject_at_bottom(directory.join('config/preinitializer.rb'), preinit)
|
161
|
-
|
162
|
-
touch directory.join('Gemfile')
|
163
|
-
|
109
|
+
Rails.logger.warn("This method is deprecated") && return
|
164
110
|
end
|
165
111
|
|
166
112
|
def bundle
|
@@ -183,4 +129,4 @@ module CompassRails
|
|
183
129
|
end
|
184
130
|
end
|
185
131
|
end
|
186
|
-
end
|
132
|
+
end
|
@@ -4,13 +4,13 @@ class Rails3Test < Test::Unit::TestCase
|
|
4
4
|
RAILS_VERSION = RAILS_3
|
5
5
|
|
6
6
|
def test_rails_app_created
|
7
|
-
within_rails_app('test_railtie', RAILS_VERSION) do |project|
|
7
|
+
within_rails_app('test_railtie', RAILS_VERSION, false) do |project|
|
8
8
|
assert project.boots?
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
12
|
def test_installs_compass
|
13
|
-
within_rails_app('test_railtie', RAILS_VERSION) do |project|
|
13
|
+
within_rails_app('test_railtie', RAILS_VERSION, false) do |project|
|
14
14
|
project.run_compass('init')
|
15
15
|
assert project.has_config?
|
16
16
|
assert project.has_screen_file?
|
@@ -19,7 +19,7 @@ class Rails3Test < Test::Unit::TestCase
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def test_compass_compile
|
22
|
-
within_rails_app('test_railtie', RAILS_VERSION) do |project|
|
22
|
+
within_rails_app('test_railtie', RAILS_VERSION, false) do |project|
|
23
23
|
project.run_compass('init')
|
24
24
|
project.run_compass('compile')
|
25
25
|
assert project.directory.join('public/stylesheets/screen.css').exist?
|
@@ -27,7 +27,7 @@ class Rails3Test < Test::Unit::TestCase
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def test_install_blueprint
|
30
|
-
within_rails_app('test_railtie', RAILS_VERSION) do |project|
|
30
|
+
within_rails_app('test_railtie', RAILS_VERSION, false) do |project|
|
31
31
|
project.run_compass('init')
|
32
32
|
project.run_compass('install blueprint --force')
|
33
33
|
assert project.directory.join('app/assets/stylesheets/partials').directory?
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
class Rails32WithoutPipelineTest < Test::Unit::TestCase
|
3
|
+
include CompassRails::Test::RailsHelpers
|
4
|
+
RAILS_VERSION = RAILS_3_2
|
5
|
+
|
6
|
+
def test_rails_app_created
|
7
|
+
within_rails_app('test_railtie', RAILS_VERSION, false) do |project|
|
8
|
+
assert project.boots?
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_installs_compass
|
13
|
+
within_rails_app('test_railtie', RAILS_VERSION, false) do |project|
|
14
|
+
project.run_compass('init')
|
15
|
+
assert project.has_config?
|
16
|
+
assert project.has_screen_file?
|
17
|
+
assert project.has_compass_import?
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_compass_compile
|
22
|
+
within_rails_app('test_railtie', RAILS_VERSION, false) do |project|
|
23
|
+
project.run_compass('init')
|
24
|
+
project.run_compass('compile')
|
25
|
+
assert project.directory.join('public/stylesheets/screen.css').exist?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_install_blueprint
|
30
|
+
within_rails_app('test_railtie', RAILS_VERSION, false) do |project|
|
31
|
+
project.run_compass('init')
|
32
|
+
project.run_compass('install blueprint --force')
|
33
|
+
assert project.directory.join('app/assets/stylesheets/partials').directory?
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'test_helper'
|
2
|
-
class
|
2
|
+
class Rails40Test < Test::Unit::TestCase
|
3
3
|
include CompassRails::Test::RailsHelpers
|
4
|
-
RAILS_VERSION =
|
4
|
+
RAILS_VERSION = RAILS_4_0
|
5
5
|
|
6
6
|
def test_rails_app_created
|
7
7
|
within_rails_app('test_railtie', RAILS_VERSION) do |project|
|
@@ -9,6 +9,7 @@ class Rails23Test < Test::Unit::TestCase
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
+
|
12
13
|
def test_installs_compass
|
13
14
|
within_rails_app('test_railtie', RAILS_VERSION) do |project|
|
14
15
|
project.run_compass('init')
|
@@ -18,11 +19,28 @@ class Rails23Test < Test::Unit::TestCase
|
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
22
|
+
def test_compass_compile
|
23
|
+
within_rails_app('test_railtie', RAILS_VERSION) do |project|
|
24
|
+
project.run_compass('init')
|
25
|
+
project.run_compass('compile')
|
26
|
+
assert project.directory.join('public/assets/screen.css').exist?
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
21
30
|
def test_install_blueprint
|
22
31
|
within_rails_app('test_railtie', RAILS_VERSION) do |project|
|
32
|
+
project.run_compass('init')
|
23
33
|
project.run_compass('install blueprint --force')
|
24
34
|
assert project.directory.join('app/assets/stylesheets/partials').directory?
|
25
35
|
end
|
26
36
|
end
|
27
37
|
|
28
|
-
|
38
|
+
def test_compass_preferred_syntax
|
39
|
+
within_rails_app('test_railtie', RAILS_VERSION) do |project|
|
40
|
+
project.set_rails('sass.preferred_syntax', :sass)
|
41
|
+
project.run_compass('init')
|
42
|
+
assert project.directory.join('app/assets/stylesheets/screen.css.sass').exist?
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|