before_render 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 tim.teng
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,17 @@
1
+ = before_render
2
+
3
+ please reference http://github.com/xtoddx/before_render
4
+
5
+ == Note on Patches/Pull Requests
6
+
7
+ * Fork the project.
8
+ * Make your feature addition or bug fix.
9
+ * Add tests for it. This is important so I don't break it in a
10
+ future version unintentionally.
11
+ * Commit, do not mess with rakefile, version, or history.
12
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
13
+ * Send me a pull request. Bonus points for topic branches.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2010 tim.teng. See LICENSE for details.
@@ -0,0 +1,53 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "before_render"
8
+ gem.summary = %Q{a gem for before_render plugin}
9
+ gem.description = %Q{original source: http://github.com/xtoddx/before_render }
10
+ gem.email = "tim.rubist@gmail.com"
11
+ gem.homepage = "http://github.com/tteng/before_render"
12
+ gem.authors = ["tim.teng"]
13
+ #gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
14
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
+ end
16
+ Jeweler::GemcutterTasks.new
17
+ rescue LoadError
18
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
19
+ end
20
+
21
+ require 'rake/testtask'
22
+ Rake::TestTask.new(:test) do |test|
23
+ test.libs << 'lib' << 'test'
24
+ test.pattern = 'test/**/test_*.rb'
25
+ test.verbose = true
26
+ end
27
+
28
+ begin
29
+ require 'rcov/rcovtask'
30
+ Rcov::RcovTask.new do |test|
31
+ test.libs << 'test'
32
+ test.pattern = 'test/**/test_*.rb'
33
+ test.verbose = true
34
+ end
35
+ rescue LoadError
36
+ task :rcov do
37
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
38
+ end
39
+ end
40
+
41
+ task :test => :check_dependencies
42
+
43
+ task :default => :test
44
+
45
+ require 'rake/rdoctask'
46
+ Rake::RDocTask.new do |rdoc|
47
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
48
+
49
+ rdoc.rdoc_dir = 'rdoc'
50
+ rdoc.title = "before_render #{version}"
51
+ rdoc.rdoc_files.include('README*')
52
+ rdoc.rdoc_files.include('lib/**/*.rb')
53
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,55 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{before_render}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["tim.teng"]
12
+ s.date = %q{2010-03-26}
13
+ s.description = %q{original source: http://github.com/xtoddx/before_render }
14
+ s.email = %q{tim.rubist@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "before_render.gemspec",
27
+ "lib/action_controller/filters/before_render_filter.rb",
28
+ "lib/before_render.rb",
29
+ "lib/before_render_instance.rb",
30
+ "lib/filter_chain_has_many_types_of_filters.rb",
31
+ "lib/filter_has_before_render.rb",
32
+ "test/helper.rb",
33
+ "test/test_before_render.rb"
34
+ ]
35
+ s.homepage = %q{http://github.com/tteng/before_render}
36
+ s.rdoc_options = ["--charset=UTF-8"]
37
+ s.require_paths = ["lib"]
38
+ s.rubygems_version = %q{1.3.6}
39
+ s.summary = %q{a gem for before_render plugin}
40
+ s.test_files = [
41
+ "test/test_before_render.rb",
42
+ "test/helper.rb"
43
+ ]
44
+
45
+ if s.respond_to? :specification_version then
46
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
47
+ s.specification_version = 3
48
+
49
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
50
+ else
51
+ end
52
+ else
53
+ end
54
+ end
55
+
@@ -0,0 +1,30 @@
1
+ # Copyright (c) 2009 Todd Willey <todd@rubidine.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ class ActionController::Filters::BeforeRenderFilter < ActionController::Filters::Filter
23
+ def type
24
+ :before_render
25
+ end
26
+
27
+ def before_render?
28
+ true
29
+ end
30
+ end
@@ -0,0 +1,63 @@
1
+ # Copyright (c) 2009 Todd Willey <todd@rubidine.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ ##
23
+ #
24
+ # BeforeRender provides a callback chain that runs in the time between when the
25
+ # controller method completes and the render method is invoked. It can be used
26
+ # to prepare variables for common view options (headers/footers/sidebars) in
27
+ # a DRY manner.
28
+ #
29
+ module BeforeRender
30
+
31
+ ##
32
+ # Adding filters to this will run them after the controller action completes
33
+ # and before the view logic is invoked.
34
+ #
35
+ # This is the same sort of call chain as after filter, but after_filter runs
36
+ # after the view is complete as well, whereas this runs before the rendering
37
+ # but after the controller logic.
38
+ #
39
+ def append_before_render_filter *filters, &block
40
+ filter_chain.append_filter_to_chain(filters, :before_render, &block)
41
+ end
42
+
43
+ def prepend_before_render_filter *filters, &block
44
+ filter_chain.prepend_filter_to_chain(filters, :before_render, &block)
45
+ end
46
+
47
+ alias :before_render_filter :append_before_render_filter
48
+ alias :before_render :append_before_render_filter
49
+
50
+ def skip_before_render_filter *filters
51
+ filter_chain.skip_filter_in_chain(*filters, &:before_render?)
52
+ end
53
+
54
+ def before_render_filters
55
+ filter_chain.select(&:before_render?).map(&:method)
56
+ end
57
+
58
+ end
59
+
60
+ ActionController::Filters::Filter.send :include, FilterHasBeforeRender
61
+ ActionController::Base.send :extend, BeforeRender
62
+ ActionController::Base.send :include, BeforeRenderInstance
63
+ ActionController::Filters::FilterChain.send :include, FilterChainHasManyTypesOfFilters
@@ -0,0 +1,47 @@
1
+ # Copyright (c) 2009 Todd Willey <todd@rubidine.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ ##
23
+ # These methods get mixed into instances of ActionController::Base (by init.rb)
24
+ #
25
+ module BeforeRenderInstance
26
+ def self.included kls
27
+ kls.send :alias_method_chain, :render, :before_render_filter
28
+ end
29
+
30
+ ##
31
+ # This rewrites the vanilla render() call to run all callbacks registered
32
+ # with before_render method before actually rendering.
33
+ #
34
+ def render_with_before_render_filter *opts, &blk
35
+ run_before_render_filters
36
+ rv = render_without_before_render_filter(*opts, &blk)
37
+ return rv
38
+ end
39
+
40
+ private
41
+ def run_before_render_filters chain=self.class.filter_chain
42
+ chain.select{|x| x.is_a?(ActionController::Filters::BeforeRenderFilter)}.each do |filter|
43
+ filter.call(self)
44
+ end
45
+ end
46
+
47
+ end
@@ -0,0 +1,87 @@
1
+ # Copyright (c) 2009 Todd Willey <todd@rubidine.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ module FilterChainHasManyTypesOfFilters
23
+
24
+ def self.included kls
25
+ kls.send :alias_method, :find_filter_append_position, :find_filter_append_positions_multitype
26
+ kls.send :alias_method, :find_filter_prepend_position, :find_filter_prepend_positions_multitype
27
+ kls.send :alias_method, :find_or_create_filter, :find_or_create_filter_multitype
28
+
29
+ kls.send :cattr_accessor, :filter_order
30
+ kls.filter_order = [
31
+ :before,
32
+ :around,
33
+ :before_render,
34
+ :after
35
+ ]
36
+ end
37
+
38
+ private
39
+ def map_filter_types_to_positions
40
+ returning({}) do |rv|
41
+ self.class.filter_order.each_with_index do |filter, idx|
42
+ rv[filter] = idx
43
+ end
44
+ end
45
+ end
46
+
47
+ def find_filter_append_positions_multitype filters, filter_type
48
+ positions = map_filter_types_to_positions
49
+ i = 0
50
+ pos = positions[filter_type]
51
+
52
+ # shortcut the last type
53
+ return -1 if (pos + 1) >= self.class.filter_order.length
54
+
55
+ while self[i] and p2=positions[self[i].type] and p2 <= pos
56
+ i += 1
57
+ end
58
+ i
59
+ end
60
+
61
+ def find_filter_prepend_positions_multitype filters, filter_type
62
+ positions = map_filter_types_to_positions
63
+ i = 0
64
+ pos = positions[filter_type]
65
+
66
+ # shortcut the first type
67
+ return 0 if pos == 0
68
+
69
+ while self[i] and p2=positions[self[i].type] and p2 < pos
70
+ i += 1
71
+ end
72
+ i
73
+ end
74
+
75
+ def find_or_create_filter_multitype filter, filter_type, options={}
76
+ update_filter_in_chain([filter], options)
77
+ rv = find(filter){|f| f.type == filter_type}
78
+ rv ||= filter_class(filter_type).new(filter_type, filter, options)
79
+ rv
80
+ end
81
+
82
+ def filter_class filter_type
83
+ "ActionController::Filters::#{filter_type.to_s.camelize}Filter".constantize
84
+ rescue
85
+ raise "Invalid filter class: ActionController::Filters::#{filter_type.to_s.camelize}Filter"
86
+ end
87
+ end
@@ -0,0 +1,29 @@
1
+ # Copyright (c) 2009 Todd Willey <todd@rubidine.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ module FilterHasBeforeRender
23
+ ##
24
+ # Add default behavior to be overwritten in subclass
25
+ #
26
+ def before_render?
27
+ false
28
+ end
29
+ end
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+ require 'before_render'
8
+
9
+ class Test::Unit::TestCase
10
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestBeforeRender < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: before_render
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - tim.teng
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-03-26 00:00:00 +08:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: "original source: http://github.com/xtoddx/before_render "
22
+ email: tim.rubist@gmail.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files:
28
+ - LICENSE
29
+ - README.rdoc
30
+ files:
31
+ - .document
32
+ - .gitignore
33
+ - LICENSE
34
+ - README.rdoc
35
+ - Rakefile
36
+ - VERSION
37
+ - before_render.gemspec
38
+ - lib/action_controller/filters/before_render_filter.rb
39
+ - lib/before_render.rb
40
+ - lib/before_render_instance.rb
41
+ - lib/filter_chain_has_many_types_of_filters.rb
42
+ - lib/filter_has_before_render.rb
43
+ - test/helper.rb
44
+ - test/test_before_render.rb
45
+ has_rdoc: true
46
+ homepage: http://github.com/tteng/before_render
47
+ licenses: []
48
+
49
+ post_install_message:
50
+ rdoc_options:
51
+ - --charset=UTF-8
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ segments:
66
+ - 0
67
+ version: "0"
68
+ requirements: []
69
+
70
+ rubyforge_project:
71
+ rubygems_version: 1.3.6
72
+ signing_key:
73
+ specification_version: 3
74
+ summary: a gem for before_render plugin
75
+ test_files:
76
+ - test/test_before_render.rb
77
+ - test/helper.rb