webmachine-actionview 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in webmachine-actionview.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Russell Garner
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,98 @@
1
+ # Webmachine::Actionview
2
+
3
+ Integration of some Rails-style view conventions into Webmachine. Uses your resource as a view context.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'webmachine-actionview'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install webmachine-actionview
18
+
19
+ ## Usage
20
+
21
+ Include `Webmachine::ActionView::Resource` in resources you want to use ActionView. Somewhere in your app's
22
+ startup, you'll need to tell it where views live and (optionally) what handlers you're supporting, for example:
23
+
24
+ ```ruby
25
+ Webmachine::ActionView.configure do |config|
26
+ config.view_paths = [MY_VIEWS_PATH]
27
+ config.handlers = [:erb, :haml, :builder]
28
+ end
29
+ ```
30
+
31
+ In your resource, you'll need to render the view at some point. Rendering is broadly similar to that in Rails.
32
+ The simplest thing you can do is this:
33
+
34
+ ```ruby
35
+ class HomeResource < Webmachine::Resource
36
+ include Webmachine::ActionView::Resource
37
+ def to_html
38
+ render
39
+ end
40
+ end
41
+ ```
42
+
43
+ This will look for a template called "home" in your `Webmachine::ActionView.configuration.view_paths`. By default, this
44
+ will look for an application layout of `layouts/application`.
45
+
46
+ You can be more specific:
47
+
48
+ ```ruby
49
+ render template: 'other_template', layout: 'mini'
50
+ ```
51
+
52
+ You can suppress a layout:
53
+
54
+ ```ruby
55
+ render layout: nil
56
+ # or
57
+ render layout: false
58
+ ```
59
+
60
+ Your resource itself is used as the view context. This means that you can use instance variables as you would in Rails.
61
+ For example:
62
+
63
+ ```ruby
64
+ class Customer << Webmachine::Resource
65
+ include Webmachine::ActionView::Resource
66
+
67
+ def resource_exists?
68
+ @customer = Customer.find(some_id)
69
+ end
70
+
71
+ def to_html
72
+ render
73
+ end
74
+ end
75
+ ```
76
+
77
+ And in an associated `customer.html.erb` template, `@customer` will be available:
78
+
79
+ ```erb
80
+ <p class="name"><%= @customer.name %></p>
81
+ ```
82
+
83
+ You can also render partials from your views:
84
+
85
+ ```ruby
86
+ render partial: 'shared/my_partial'
87
+ ```
88
+
89
+ Partials are subject to the same conventions as Rails, i.e. their filenames begin with an underscore, but no underscore
90
+ is required when making a call to `render partial: 'some_partial'`.
91
+
92
+ ## Contributing
93
+
94
+ 1. Fork it
95
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
96
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
97
+ 4. Push to the branch (`git push origin my-new-feature`)
98
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,4 @@
1
+ require 'action_view'
2
+ require 'webmachine/actionview/version'
3
+ require 'webmachine/actionview/configuration'
4
+ require 'webmachine/actionview/resource'
@@ -0,0 +1,21 @@
1
+ require 'active_support/configurable'
2
+
3
+ module Webmachine
4
+ module ActionView
5
+
6
+ # Configures settings for Webmachine::ActionView
7
+ def self.configure(&block)
8
+ yield @config ||= Configuration.new
9
+ end
10
+
11
+ def self.config
12
+ @config
13
+ end
14
+
15
+ class Configuration #:nodoc:
16
+ include ActiveSupport::Configurable
17
+
18
+ config_accessor :view_paths, :handlers
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,50 @@
1
+ module Webmachine
2
+ module ActionView
3
+ def self.view_paths
4
+ []
5
+ end
6
+
7
+ module Resource
8
+ def self.included(base)
9
+ base.class_eval do
10
+ include ::ActionView::Helpers::CaptureHelper
11
+ include ::ActionView::Context
12
+ end
13
+ end
14
+
15
+ DEFAULT_LAYOUT = 'layouts/application'
16
+
17
+ def render(options = nil)
18
+ options ||= default_template_name
19
+ options = { :template => options } if options.is_a?(String)
20
+
21
+ unless options[:partial]
22
+ if options.has_key?(:layout) && !options[:layout]
23
+ options.delete(:layout)
24
+ else
25
+ options.reverse_merge!(layout: DEFAULT_LAYOUT)
26
+ end
27
+ _prepare_context
28
+ end
29
+
30
+ view_renderer.render(self, options)
31
+ end
32
+
33
+ def default_template_name
34
+ @default_template_name ||= self.class.name.underscore.sub(/_resource$/, '')
35
+ end
36
+
37
+ def view_paths
38
+ @view_paths ||= ::ActionView::PathSet.new(Webmachine::ActionView.config.view_paths)
39
+ end
40
+
41
+ def lookup_context
42
+ @lookup_context ||= ::ActionView::LookupContext.new(view_paths)
43
+ end
44
+
45
+ def view_renderer
46
+ @view_renderer ||= ::ActionView::Renderer.new(lookup_context)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,5 @@
1
+ module Webmachine
2
+ module ActionView
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
data/spec/dummy/app.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'dummy/resources/home_resource'
2
+
3
+ module Dummy
4
+ Application = Webmachine::Application.new do |app|
5
+ end
6
+
7
+ Application.routes do
8
+ add [], HomeResource
9
+ end
10
+ end
11
+
@@ -0,0 +1,15 @@
1
+ class HomeResource < Webmachine::Resource
2
+ include Webmachine::ActionView::Resource
3
+
4
+ def to_html
5
+ @home = HomeResource.home_instance
6
+ render
7
+ end
8
+
9
+ def self.home_instance
10
+ Struct.new(:id, :name).new.tap do |h|
11
+ h.id = 1
12
+ h.name = "some name"
13
+ end
14
+ end
15
+ end
File without changes
@@ -0,0 +1,4 @@
1
+ <p>home.html.erb content</p>
2
+ <p>id: <%= @home.id %></p>
3
+ <p>name: <%= @home.name %></p>
4
+ <div class="from_a_partial"><%= render partial: 'shared/some_partial' %></div>
@@ -0,0 +1,4 @@
1
+ <div id="application">
2
+ <p>content from the application layout</p>
3
+ <%= yield %>
4
+ </div>
@@ -0,0 +1 @@
1
+ FUSKING CLOFF PRUNKER
@@ -0,0 +1 @@
1
+ <p>content from shared/some_partial</p>
@@ -0,0 +1,3 @@
1
+ require 'webmachine'
2
+ require 'webmachine/actionview'
3
+ require 'dummy/app'
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe Webmachine::ActionView::Configuration do
4
+ describe "Configuring" do
5
+ let(:paths) { ['somewhere/over/the/rainbow'] }
6
+ let(:handlers) { ['erb', 'slim', 'haml'] }
7
+
8
+ before do
9
+ Webmachine::ActionView.configure do |c|
10
+ c.view_paths = paths
11
+ c.handlers = handlers
12
+ end
13
+ end
14
+
15
+ subject(:config) { Webmachine::ActionView.config }
16
+
17
+ its(:view_paths) { should eql(paths) }
18
+ its(:handlers) { should eql(handlers) }
19
+ end
20
+ end
@@ -0,0 +1,103 @@
1
+ require "spec_helper"
2
+
3
+ class BaseResource < Webmachine::Resource
4
+ include Webmachine::ActionView::Resource
5
+ end
6
+
7
+ class UnconventionalName < BaseResource
8
+ end
9
+
10
+ describe "A resource including Webmachine::ActionView::Resource" do
11
+ let(:request) { nil }
12
+ let(:response) { nil }
13
+
14
+ let(:resource) { HomeResource.new(request, response) }
15
+ let(:unconventional_resource) { UnconventionalName.new(request, response) }
16
+
17
+ before :all do
18
+ Webmachine::ActionView.configure do |c|
19
+ c.view_paths = ['spec/dummy/views']
20
+ end
21
+ end
22
+
23
+ describe "Default places to look for templates" do
24
+ describe "the path set" do
25
+ subject(:view_paths) { resource.view_paths }
26
+
27
+ it { should be_an(ActionView::PathSet) }
28
+ it "has the path we previously configured" do
29
+ view_paths.paths.map(&:to_s).should include(File.expand_path('spec/dummy/views'))
30
+ end
31
+ end
32
+
33
+ context "A conventionally-named resource" do
34
+ it "looks for a template without resource in the class name" do
35
+ resource.default_template_name.should == 'home'
36
+ end
37
+ end
38
+ context "An unconventionally-named resource" do
39
+ it "looks for a template as an underscored version of its class name" do
40
+ unconventional_resource.default_template_name.should == 'unconventional_name'
41
+ end
42
+ end
43
+ end
44
+
45
+ describe "Finding templates through the lookup context" do
46
+ subject(:lookup_context) { resource.lookup_context }
47
+
48
+ it { should be_an(ActionView::LookupContext) }
49
+
50
+ it "finds templates implicitly" do
51
+ lookup_context.find('home').should be_a(ActionView::Template)
52
+ end
53
+ it "finds templates implicitly when html is mentioned" do
54
+ lookup_context.find('home.html').should be_a(ActionView::Template)
55
+ end
56
+ it "fails to find templates for unmentioned extensions" do
57
+ lambda { resource.lookup_context.find('foo') }.should raise_error(ActionView::MissingTemplate)
58
+ end
59
+ end
60
+
61
+ describe "Rendering from a template with a context" do
62
+ subject(:rendered) { resource.to_html }
63
+
64
+ it { should include('id: 1') }
65
+ it { should include('name: some name') }
66
+
67
+ it { should include('content from the application layout')}
68
+ it { should include('content from shared/some_partial')}
69
+ end
70
+
71
+ describe "Explicit template rendering" do
72
+ subject(:rendered) { resource.to_html }
73
+
74
+ context "With an explicit layout" do
75
+ let(:resource) do
76
+ HomeResource.new(request, response).tap do |h|
77
+ def h.to_html
78
+ @home = HomeResource.home_instance
79
+ render template: 'home', layout: 'layouts/explicit'
80
+ end
81
+ end
82
+ end
83
+
84
+ it "should include explicit content" do
85
+ rendered.should include('FUSKING CLOFF PRUNKER')
86
+ end
87
+ end
88
+ context "Suppressing default layout" do
89
+ let(:resource) do
90
+ HomeResource.new(request, response).tap do |h|
91
+ def h.to_html
92
+ @home = HomeResource.home_instance
93
+ render template: 'home', layout: false
94
+ end
95
+ end
96
+ end
97
+
98
+ it "should not include explicit content" do
99
+ rendered.should_not include('FUSKING CLOFF PRUNKER')
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'webmachine/actionview/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "webmachine-actionview"
8
+ gem.version = Webmachine::ActionView::VERSION
9
+ gem.authors = ["Russell Garner"]
10
+ gem.email = ["rgarner@zephyros-systems.co.uk"]
11
+ gem.description = %q{Brings ActionView to webmachine-ruby}
12
+ gem.summary = %q{Want the Rails conventions that you're used to for HTML views in webmachine-ruby? This is your gem.}
13
+ gem.homepage = "http://github.com/rgarner/webmachine-actionview"
14
+
15
+ gem.add_development_dependency "rspec"
16
+ gem.add_development_dependency "webmachine-test"
17
+
18
+ gem.add_runtime_dependency "webmachine"
19
+ gem.add_runtime_dependency "activesupport"
20
+ gem.add_runtime_dependency "actionpack"
21
+
22
+ gem.files = `git ls-files`.split($/)
23
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
24
+ gem.require_paths = ["lib"]
25
+ end
metadata ADDED
@@ -0,0 +1,131 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: webmachine-actionview
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Russell Garner
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &2152313240 !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: *2152313240
25
+ - !ruby/object:Gem::Dependency
26
+ name: webmachine-test
27
+ requirement: &2152312620 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *2152312620
36
+ - !ruby/object:Gem::Dependency
37
+ name: webmachine
38
+ requirement: &2152311940 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *2152311940
47
+ - !ruby/object:Gem::Dependency
48
+ name: activesupport
49
+ requirement: &2152311380 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *2152311380
58
+ - !ruby/object:Gem::Dependency
59
+ name: actionpack
60
+ requirement: &2152310840 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *2152310840
69
+ description: Brings ActionView to webmachine-ruby
70
+ email:
71
+ - rgarner@zephyros-systems.co.uk
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - Gemfile
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - lib/webmachine/actionview.rb
82
+ - lib/webmachine/actionview/configuration.rb
83
+ - lib/webmachine/actionview/resource.rb
84
+ - lib/webmachine/actionview/version.rb
85
+ - spec/dummy/app.rb
86
+ - spec/dummy/resources/home_resource.rb
87
+ - spec/dummy/views/foo.html.unsupportedfiletype
88
+ - spec/dummy/views/home.html.erb
89
+ - spec/dummy/views/layouts/application.html.erb
90
+ - spec/dummy/views/layouts/explicit.html.erb
91
+ - spec/dummy/views/shared/_some_partial.html.erb
92
+ - spec/spec_helper.rb
93
+ - spec/webmachine/actionview/configuration_spec.rb
94
+ - spec/webmachine/actionview/resource_spec.rb
95
+ - webmachine-actionview.gemspec
96
+ homepage: http://github.com/rgarner/webmachine-actionview
97
+ licenses: []
98
+ post_install_message:
99
+ rdoc_options: []
100
+ require_paths:
101
+ - lib
102
+ required_ruby_version: !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ! '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ! '>='
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ requirements: []
115
+ rubyforge_project:
116
+ rubygems_version: 1.8.16
117
+ signing_key:
118
+ specification_version: 3
119
+ summary: Want the Rails conventions that you're used to for HTML views in webmachine-ruby?
120
+ This is your gem.
121
+ test_files:
122
+ - spec/dummy/app.rb
123
+ - spec/dummy/resources/home_resource.rb
124
+ - spec/dummy/views/foo.html.unsupportedfiletype
125
+ - spec/dummy/views/home.html.erb
126
+ - spec/dummy/views/layouts/application.html.erb
127
+ - spec/dummy/views/layouts/explicit.html.erb
128
+ - spec/dummy/views/shared/_some_partial.html.erb
129
+ - spec/spec_helper.rb
130
+ - spec/webmachine/actionview/configuration_spec.rb
131
+ - spec/webmachine/actionview/resource_spec.rb