presenter-pattern 0.1.1
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/Manifest +10 -0
- data/README.rdoc +12 -0
- data/Rakefile +14 -0
- data/lib/presenter-pattern.rb +9 -0
- data/lib/presenter-pattern/no_querying_views.rb +38 -0
- data/presenter-pattern.gemspec +30 -0
- data/rails/init.rb +1 -0
- data/test/no_querying_view_test.rb +37 -0
- data/test/schema.rb +11 -0
- data/test/setup_test.rb +13 -0
- data/test/test_helper.rb +19 -0
- metadata +67 -0
data/Manifest
ADDED
data/README.rdoc
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
|
5
|
+
Echoe.new('presenter-pattern', '0.1.1') do |p|
|
6
|
+
p.description = "Enables and enforces the presenter pattern in rails"
|
7
|
+
p.url = "https://github.com/jleven/presenter-pattern"
|
8
|
+
p.author = "Josh Leven"
|
9
|
+
p.email = "josh.leven@gmail.com"
|
10
|
+
p.ignore_pattern = /^(tmp|pkg|doc|test\/rails_app)|(\.svn|CVS|\.bzr|\.DS|\.git)$/
|
11
|
+
p.development_dependencies = []
|
12
|
+
end
|
13
|
+
|
14
|
+
Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
|
@@ -0,0 +1,38 @@
|
|
1
|
+
no_querying_views = begin
|
2
|
+
Rails.env.development? || Rails.env.test?
|
3
|
+
rescue
|
4
|
+
false
|
5
|
+
end
|
6
|
+
|
7
|
+
if no_querying_views
|
8
|
+
module PresenterPattern
|
9
|
+
class IllegalDatabaseQueryFromView < RuntimeError; end
|
10
|
+
end
|
11
|
+
|
12
|
+
module ::ActiveRecord
|
13
|
+
module ConnectionAdapters
|
14
|
+
%w(PostgreSQLAdapter MysqlAdapter SQLite3Adapter).each do |adapter_name|
|
15
|
+
begin
|
16
|
+
adapter = const_get adapter_name
|
17
|
+
adapter.class_eval do
|
18
|
+
puts "[WARNING] Presenter::Rails is preventing your views from triggering PG, MySQL or SQLite3 database connections."
|
19
|
+
alias :orig_execute :execute
|
20
|
+
def execute(*args)
|
21
|
+
first_view = caller.grep(/app\/views/).first
|
22
|
+
first_helper = caller.grep(/app\/helpers/).first
|
23
|
+
|
24
|
+
# if we're coming from a view, let's analyze the situation
|
25
|
+
if !first_view.nil? and (first_helper.nil? or (caller.index(first_view) < caller.index(first_helper)))
|
26
|
+
raise PresenterPattern::IllegalDatabaseQueryFromView, "No query from view prohibited, eager-load from a controller instead."
|
27
|
+
else
|
28
|
+
orig_execute *args
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
rescue
|
33
|
+
# the adapter has not been instantiated
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{presenter-pattern}
|
5
|
+
s.version = "0.1.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Josh Leven"]
|
9
|
+
s.date = %q{2011-05-23}
|
10
|
+
s.description = %q{Enables and enforces the presenter pattern in rails}
|
11
|
+
s.email = %q{josh.leven@gmail.com}
|
12
|
+
s.extra_rdoc_files = ["README.rdoc", "lib/presenter-pattern.rb", "lib/presenter-pattern/no_querying_views.rb"]
|
13
|
+
s.files = ["README.rdoc", "Rakefile", "lib/presenter-pattern.rb", "lib/presenter-pattern/no_querying_views.rb", "rails/init.rb", "test/no_querying_view_test.rb", "test/schema.rb", "test/setup_test.rb", "test/test_helper.rb", "Manifest", "presenter-pattern.gemspec"]
|
14
|
+
s.homepage = %q{https://github.com/jleven/presenter-pattern}
|
15
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Presenter-pattern", "--main", "README.rdoc"]
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
s.rubyforge_project = %q{presenter-pattern}
|
18
|
+
s.rubygems_version = %q{1.5.2}
|
19
|
+
s.summary = %q{Enables and enforces the presenter pattern in rails}
|
20
|
+
s.test_files = ["test/no_querying_view_test.rb", "test/setup_test.rb", "test/test_helper.rb"]
|
21
|
+
|
22
|
+
if s.respond_to? :specification_version then
|
23
|
+
s.specification_version = 3
|
24
|
+
|
25
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
26
|
+
else
|
27
|
+
end
|
28
|
+
else
|
29
|
+
end
|
30
|
+
end
|
data/rails/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'presenter-pattern'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class NoQueryingViewTest < ActionController::TestCase
|
4
|
+
tests FoosController
|
5
|
+
|
6
|
+
def setup
|
7
|
+
super
|
8
|
+
#Foo.delete_all
|
9
|
+
|
10
|
+
# @controller = FoosController.new
|
11
|
+
# @request = ActionController::TestRequest.new
|
12
|
+
# @response = ActionController::TestResponse.new
|
13
|
+
|
14
|
+
# PresenterPattern::Application.routes.draw do
|
15
|
+
# resource :foo
|
16
|
+
# end
|
17
|
+
|
18
|
+
@foo = Foo.create :name => "name"
|
19
|
+
end
|
20
|
+
|
21
|
+
# def teardown
|
22
|
+
# super
|
23
|
+
# Foo.delete_all
|
24
|
+
# end
|
25
|
+
|
26
|
+
def test_thin_views_are_successful
|
27
|
+
get :show, :id => @foo.id
|
28
|
+
assert_response :success
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_thick_views_fail
|
32
|
+
assert_raise(ActionView::Template::Error) do
|
33
|
+
get :index
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/test/schema.rb
ADDED
data/test/setup_test.rb
ADDED
data/test/test_helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'active_support'
|
4
|
+
|
5
|
+
ENV['RAILS_ENV'] = 'test'
|
6
|
+
ENV['DB'] = 'postgresql'
|
7
|
+
|
8
|
+
require 'rails_app/config/environment'
|
9
|
+
require 'rails/test_help'
|
10
|
+
|
11
|
+
require 'yaml'
|
12
|
+
require 'active_record'
|
13
|
+
require 'logger'
|
14
|
+
|
15
|
+
require File.expand_path('../rails/init', File.dirname(__FILE__))
|
16
|
+
|
17
|
+
#def app
|
18
|
+
# RailsApp::Application
|
19
|
+
#end
|
metadata
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: presenter-pattern
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Josh Leven
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-05-23 00:00:00.000000000Z
|
13
|
+
dependencies: []
|
14
|
+
description: Enables and enforces the presenter pattern in rails
|
15
|
+
email: josh.leven@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files:
|
19
|
+
- README.rdoc
|
20
|
+
- lib/presenter-pattern.rb
|
21
|
+
- lib/presenter-pattern/no_querying_views.rb
|
22
|
+
files:
|
23
|
+
- README.rdoc
|
24
|
+
- Rakefile
|
25
|
+
- lib/presenter-pattern.rb
|
26
|
+
- lib/presenter-pattern/no_querying_views.rb
|
27
|
+
- rails/init.rb
|
28
|
+
- test/no_querying_view_test.rb
|
29
|
+
- test/schema.rb
|
30
|
+
- test/setup_test.rb
|
31
|
+
- test/test_helper.rb
|
32
|
+
- Manifest
|
33
|
+
- presenter-pattern.gemspec
|
34
|
+
homepage: https://github.com/jleven/presenter-pattern
|
35
|
+
licenses: []
|
36
|
+
post_install_message:
|
37
|
+
rdoc_options:
|
38
|
+
- --line-numbers
|
39
|
+
- --inline-source
|
40
|
+
- --title
|
41
|
+
- Presenter-pattern
|
42
|
+
- --main
|
43
|
+
- README.rdoc
|
44
|
+
require_paths:
|
45
|
+
- lib
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ! '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '1.2'
|
58
|
+
requirements: []
|
59
|
+
rubyforge_project: presenter-pattern
|
60
|
+
rubygems_version: 1.8.3
|
61
|
+
signing_key:
|
62
|
+
specification_version: 3
|
63
|
+
summary: Enables and enforces the presenter pattern in rails
|
64
|
+
test_files:
|
65
|
+
- test/no_querying_view_test.rb
|
66
|
+
- test/setup_test.rb
|
67
|
+
- test/test_helper.rb
|