garnish 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
@@ -0,0 +1,6 @@
1
+ rvm:
2
+ # - 1.8.7 # (current default)
3
+ - 1.9.2
4
+ - 1.9.3
5
+ # - rbx-2.0
6
+ # - ree
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,15 @@
1
+ guard 'bundler' do
2
+ watch('Gemfile')
3
+ # Uncomment next line if Gemfile contain `gemspec' command
4
+ # watch(/^.+\.gemspec/)
5
+ end
6
+
7
+ guard 'spork', :rspec_env => { 'RAILS_ENV' => 'test' }, :cucumber => false, :wait => 40 do
8
+ watch('Gemfile')
9
+ watch('Gemfile.lock')
10
+ watch('spec/spec_helper.rb')
11
+ end
12
+
13
+ guard 'rspec', :cli => "--drb", :version => 2, :rvm => ['1.9.3'] do
14
+ watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" }
15
+ end
@@ -0,0 +1,2 @@
1
+ No docs yet but I couldn't go without Travis'ing it
2
+ {<img src="http://travis-ci.org/brianp/garnish.png" />}[http://travis-ci.org/brianp/garnish]
@@ -0,0 +1,11 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rubygems'
3
+ require 'rake'
4
+ require 'rspec/core/rake_task'
5
+
6
+ desc "Run RSpec"
7
+ RSpec::Core::RakeTask.new do |t|
8
+ t.verbose = false
9
+ end
10
+
11
+ task :default => :spec
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "garnish/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "garnish"
7
+ s.version = Garnish::VERSION
8
+ s.authors = ["brianp"]
9
+ s.email = ["brian.o.pearce@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{Provides the decorator design pattern}
12
+ s.description = %q{Provides an easy to use and transparent system for implementing the Decorator Pattern}
13
+
14
+ s.rubyforge_project = "garnish"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ s.add_development_dependency "rspec"
23
+ s.add_development_dependency "rails", '~> 3.0.9'
24
+ end
@@ -0,0 +1,6 @@
1
+ require 'garnish/version'
2
+ require 'garnish/converter'
3
+ require 'garnish/responder'
4
+ require 'garnish/controller'
5
+ require 'garnish/presenter/relationships'
6
+ require 'garnish/presenter'
@@ -0,0 +1,18 @@
1
+ module Garnish
2
+ module Controller
3
+ extend ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+ def garnish(options = {}, &block)
7
+ self.responder = Garnish::Responder
8
+ respond_to :html
9
+ end
10
+ end
11
+ end
12
+ end
13
+
14
+ if defined? ActionController
15
+ ActionController::Base.class_eval do
16
+ include Garnish::Controller
17
+ end
18
+ end
@@ -0,0 +1,47 @@
1
+ module Garnish
2
+ module Converter
3
+ extend ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+ def class_exists?(class_name)
7
+ klass = Module.const_get(class_name)
8
+ return klass.is_a?(Class)
9
+ rescue NameError
10
+ return false
11
+ end
12
+ end
13
+
14
+ module InstanceMethods
15
+
16
+ def convert(record, view = nil)
17
+ view ||= self.template
18
+
19
+ if record.respond_to?(:each)
20
+ klass = record.first.class
21
+ else
22
+ klass = record.class
23
+ end
24
+
25
+ presenter_name = "#{klass.to_s}Presenter"
26
+
27
+ if self.class_exists?(presenter_name.to_sym)
28
+ if record.respond_to?(:each)
29
+ presenter = record.map{ |v| presenter_name.constantize.new(v, view) }
30
+ else
31
+ presenter = presenter_name.constantize.new(record, view)
32
+ end
33
+ end
34
+
35
+ presenter
36
+ end
37
+
38
+ def class_exists?(class_name)
39
+ klass = Module.const_get(class_name)
40
+ return klass.is_a?(Class)
41
+ rescue NameError
42
+ return false
43
+ end
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,50 @@
1
+ module Garnish
2
+ module Presenter
3
+ extend ActiveSupport::Concern
4
+ include Garnish::Presenter::Relationships
5
+
6
+ included do
7
+ attr_accessor :record
8
+ attr_accessor :template
9
+ attr_accessor :record_class
10
+ end
11
+
12
+ module InstanceMethods
13
+ def initialize(r, t)
14
+ self.record = r
15
+ self.template = t
16
+ self.record_class = r.class
17
+ end
18
+
19
+ def respond_to?(method, include_private = false)
20
+ if self.methods.include?(method)
21
+ super
22
+ else
23
+ self.record.respond_to?(method)
24
+ end
25
+ end
26
+
27
+ protected
28
+
29
+ def method_missing(method, *args, &block)
30
+ begin
31
+ # Check the record being presented first
32
+ # If method doesn't exists check the template for helper convenience
33
+ self.record.send(method, *args, &block)
34
+ rescue NoMethodError
35
+ self.template.send(method, *args, &block)
36
+ end
37
+ end
38
+ end
39
+
40
+ module ClassMethods
41
+
42
+ protected
43
+
44
+ def method_missing(method, *args, &block)
45
+ record_class.send(method, *args, &block)
46
+ end
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,28 @@
1
+ module Garnish
2
+ module Presenter
3
+ module Relationships
4
+ extend ActiveSupport::Concern
5
+ include Garnish::Converter
6
+
7
+ included do
8
+ relationships = self.record_class.relations.keys
9
+
10
+ relationships.map do |key|
11
+ define_method key do
12
+ arry = self.record.send(key)
13
+ arry = convert(arry)
14
+ arry
15
+ end
16
+ end
17
+ end
18
+
19
+ module ClassMethods
20
+ def record_class
21
+ str = self.to_s
22
+ str.slice!("Presenter")
23
+ str.constantize
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,19 @@
1
+ module Garnish
2
+ class Responder < ActionController::Responder
3
+ include Garnish::Converter
4
+ def to_html
5
+ vars = controller.instance_variables.reject {|x| x.to_s.include?("@_")}
6
+
7
+ vars.each do |var|
8
+ record = controller.instance_variable_get(var.to_s)
9
+
10
+ presenter = convert(record, controller.view_context)
11
+
12
+ controller.instance_variable_set(var.to_s, presenter)
13
+ end
14
+
15
+ super
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ module Garnish
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe "A Garnished Controller" do
4
+
5
+ subject { TestController }
6
+
7
+ it "should have the garnish method defined" do
8
+ subject.respond_to?(:garnish).should be_true
9
+ end
10
+
11
+ it "should set the responder to Garnish::Responder" do
12
+ subject.garnish
13
+ subject.responder.should equal Garnish::Responder
14
+ end
15
+ end
16
+
17
+
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ describe "A Garnish Converter" do
4
+
5
+ context "instance" do
6
+
7
+ before(:each) do
8
+ @test_class = TestClass.new
9
+ @template = Class.new
10
+ @test_presenter = TestClassPresenter.new(@test_class, @template)
11
+ end
12
+
13
+ subject { @test_presenter }
14
+
15
+ it "should define class_exists?" do
16
+ subject.respond_to?(:class_exists?).should be_true
17
+ end
18
+
19
+ it "should return true from class_exists if class exists" do
20
+ subject.class_exists?(:TestClassPresenter).should be_true
21
+ end
22
+
23
+ it "should return false from class_exists if class doesn't exists" do
24
+ subject.class_exists?(:BadClass).should be_false
25
+ end
26
+
27
+ context "with a template" do
28
+ it "should take a record variable and wrap it in a presenter if a presenter exists" do
29
+ presenter = subject.convert(@test_class, @template)
30
+ presenter.class.should equal TestClassPresenter
31
+ presenter.record.should equal @test_class
32
+ end
33
+ end
34
+
35
+ context "without a template" do
36
+ it "should take a record variable and wrap it in a presenter if a presenter exists" do
37
+ presenter = subject.convert(@test_class)
38
+ presenter.class.should equal TestClassPresenter
39
+ presenter.record.should equal @test_class
40
+ presenter.template.should equal @template
41
+ end
42
+ end end
43
+
44
+ context "class" do
45
+ subject { TestClassPresenter }
46
+
47
+ it "should define class_exists?" do
48
+ subject.respond_to?(:class_exists?).should be_true
49
+ end
50
+
51
+ it "should return true from class_exists if class exists" do
52
+ subject.class_exists?(:TestClassPresenter).should be_true
53
+ end
54
+
55
+ it "should return false from class_exists if class doesn't exists" do
56
+ subject.class_exists?(:BadClass).should be_false
57
+ end
58
+ end
59
+
60
+ end
61
+
62
+
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe "A Presenter Relationship" do
4
+
5
+ context "instance" do
6
+
7
+ before(:each) do
8
+ @test_class = TestClass.new
9
+ @template = Class.new
10
+ @test_presenter = TestClassPresenter.new(@test_class, @template)
11
+ end
12
+
13
+ subject { @test_presenter }
14
+
15
+ it "should have the records relationships defined" do
16
+ subject.respond_to?(:users).should be_true
17
+ end
18
+
19
+ end
20
+
21
+ context "class" do
22
+ subject { TestClassPresenter }
23
+
24
+ it "should return record_class" do
25
+ subject.record_class.should equal TestClass
26
+ end
27
+
28
+ it "should not have the records relationships defined" do
29
+ subject.respond_to?(:users).should be_false
30
+ end
31
+ end
32
+
33
+ end
34
+
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ describe "A Presenter" do
4
+ context "should initialize" do
5
+ it "with record and no template" do
6
+ TestClassPresenter.new(TestClass.new, nil).should be_true
7
+ end
8
+
9
+ context "and populate" do
10
+ before(:each) do
11
+ @test_class = TestClass.new
12
+ @template = Class.new
13
+ @test_presenter = TestClassPresenter.new(@test_class, @template)
14
+ end
15
+
16
+ subject {@test_presenter}
17
+
18
+ it "the record field" do
19
+ subject.record.should equal @test_class
20
+ end
21
+
22
+ it "the template field" do
23
+ subject.template.should equal @template
24
+ end
25
+
26
+ it "the record_class field" do
27
+ subject.record_class.should equal @test_class.class
28
+ end
29
+ end
30
+ end
31
+
32
+ context "class should delgate" do
33
+ subject { TestClassPresenter }
34
+
35
+ it "method missing to non presenter class" do
36
+ TestClass.should_receive(:test_method).and_raise(NoMethodError)
37
+ lambda {subject.test_method}.should raise_error
38
+ end
39
+ end
40
+
41
+ context "instance should" do
42
+ before(:each) do
43
+ @test_class = TestClass.new
44
+ @template = Class.new
45
+ @test_presenter = TestClassPresenter.new(@test_class, @template)
46
+ end
47
+
48
+ subject { @test_presenter }
49
+
50
+ context "delegate" do
51
+ it "method missing to record if method is missing" do
52
+ @test_class.should_receive(:test_method).and_return("Success!")
53
+ subject.test_method.should match "Success!"
54
+ end
55
+
56
+ it "method missing to template if record lacks method" do
57
+ @template.should_receive(:test_method).and_return("Success!")
58
+ subject.test_method.should match "Success!"
59
+ end
60
+
61
+ it "respond_to? to record if method doesn't exist" do
62
+ @test_class.should_receive(:respond_to?).with(:test_method).and_return(true)
63
+ subject.respond_to?(:test_method).should be_true
64
+ end
65
+ end
66
+
67
+ context "not delegate" do
68
+ it "respond_to? when methods exisits" do
69
+ @test_class.should_not_receive(:respond_to?)
70
+ subject.respond_to?(:respond_to?).should be_true
71
+ end
72
+ end
73
+
74
+ end
75
+ end
@@ -0,0 +1,37 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ Bundler.require(:development)
5
+
6
+ require 'active_support/all'
7
+ require 'action_controller'
8
+ require 'garnish'
9
+
10
+ # Spork.prefork do
11
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
12
+
13
+ RSpec.configure do |config|
14
+ config.mock_with :rspec
15
+
16
+ config.treat_symbols_as_metadata_keys_with_true_values = true
17
+ config.filter_run :focus => true
18
+ config.run_all_when_everything_filtered = true
19
+ end
20
+ # end
21
+
22
+ # Spork.each_run do
23
+
24
+ # end
25
+
26
+ class TestClass
27
+ def self.relations
28
+ {:users => []}
29
+ end
30
+ end
31
+
32
+ class TestClassPresenter
33
+ include Garnish::Presenter
34
+ end
35
+
36
+ class TestController < ActionController::Base
37
+ end
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: garnish
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - brianp
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-11-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &70236155352860 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70236155352860
25
+ - !ruby/object:Gem::Dependency
26
+ name: rails
27
+ requirement: &70236155352360 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 3.0.9
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70236155352360
36
+ description: Provides an easy to use and transparent system for implementing the Decorator
37
+ Pattern
38
+ email:
39
+ - brian.o.pearce@gmail.com
40
+ executables: []
41
+ extensions: []
42
+ extra_rdoc_files: []
43
+ files:
44
+ - .gitignore
45
+ - .travis.yml
46
+ - Gemfile
47
+ - Guardfile
48
+ - README.rdoc
49
+ - Rakefile
50
+ - garnish.gemspec
51
+ - lib/garnish.rb
52
+ - lib/garnish/controller.rb
53
+ - lib/garnish/converter.rb
54
+ - lib/garnish/presenter.rb
55
+ - lib/garnish/presenter/relationships.rb
56
+ - lib/garnish/responder.rb
57
+ - lib/garnish/version.rb
58
+ - spec/garnish/controller_spec.rb
59
+ - spec/garnish/converter_spec.rb
60
+ - spec/garnish/presenter/relationships_spec.rb
61
+ - spec/garnish/presenter_spec.rb
62
+ - spec/spec_helper.rb
63
+ homepage: ''
64
+ licenses: []
65
+ post_install_message:
66
+ rdoc_options: []
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ! '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ! '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ requirements: []
82
+ rubyforge_project: garnish
83
+ rubygems_version: 1.8.10
84
+ signing_key:
85
+ specification_version: 3
86
+ summary: Provides the decorator design pattern
87
+ test_files:
88
+ - spec/garnish/controller_spec.rb
89
+ - spec/garnish/converter_spec.rb
90
+ - spec/garnish/presenter/relationships_spec.rb
91
+ - spec/garnish/presenter_spec.rb
92
+ - spec/spec_helper.rb