happy 0.1.0.pre20 → 0.1.0.pre21
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/example/config.ru +31 -9
- data/happy.gemspec +1 -1
- data/lib/happy/controller/configurable.rb +9 -5
- data/lib/happy/controller/helpers.rb +12 -1
- data/lib/happy/controller.rb +15 -3
- data/lib/happy/extras/resources.rb +2 -4
- data/lib/happy/version.rb +1 -1
- data/spec/controller/configurable_spec.rb +59 -0
- metadata +21 -30
data/example/config.ru
CHANGED
@@ -1,19 +1,26 @@
|
|
1
|
+
# Just run this script through the 'rackup' command.
|
2
|
+
|
1
3
|
lib_path = File.expand_path("#{File.dirname(__FILE__)}/../lib")
|
2
4
|
$LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
|
3
5
|
|
4
6
|
require 'happy'
|
5
|
-
require 'cgi'
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
# Controllers are the core building blocks of Happy applications.
|
9
|
+
# They're also just Rack apps, so in any Happy app, you will
|
10
|
+
# declare at least a "root" controller class and run that through Rack.
|
9
11
|
|
10
|
-
|
11
|
-
path_name ||= name.parameterize
|
12
|
-
examples[name] = path_name
|
12
|
+
class TestApp < Happy::Controller
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
# A controller's most important method is #route. Whenever a request hits
|
15
|
+
# your application, a new instance of your root controller class is
|
16
|
+
# created, and its #route method is called.
|
17
|
+
#
|
18
|
+
# This method can be as simple or complex as you like. In this example
|
19
|
+
# application, it wraps around a couple of annotated Happy examples.
|
20
|
+
# Usually, you'd use the #path method to specify code to be executed if
|
21
|
+
# a certain path was requested; in this app, we're using a custom #example
|
22
|
+
# method, that does the same thing but also records the example in a hash
|
23
|
+
# so we can generated a "table of contents" in index.erb.
|
17
24
|
|
18
25
|
def route
|
19
26
|
example 'Returning just a string' do
|
@@ -25,6 +32,11 @@ class TestApp < Happy::Controller
|
|
25
32
|
serve! "I'm not being served, since the above call to #serve! halted processing."
|
26
33
|
end
|
27
34
|
|
35
|
+
example 'Content-type' do
|
36
|
+
content_type 'text/css'
|
37
|
+
"/* I'm CSS! */\n\nbody { color: red }\n"
|
38
|
+
end
|
39
|
+
|
28
40
|
example 'Path parameters' do
|
29
41
|
path 'hello' do
|
30
42
|
path :name do
|
@@ -100,6 +112,16 @@ class TestApp < Happy::Controller
|
|
100
112
|
|
101
113
|
render 'index.erb'
|
102
114
|
end
|
115
|
+
|
116
|
+
def examples; @examples ||= {}; end
|
117
|
+
|
118
|
+
def example(name, path_name = nil, &blk)
|
119
|
+
path_name ||= name.parameterize
|
120
|
+
examples[name] = path_name
|
121
|
+
|
122
|
+
# Create a path containing the example's code block
|
123
|
+
path(path_name, &blk)
|
124
|
+
end
|
103
125
|
end
|
104
126
|
|
105
127
|
run TestApp
|
data/happy.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |gem|
|
|
20
20
|
gem.add_dependency 'happy-helpers', '~> 0.1.0.pre11'
|
21
21
|
gem.add_dependency 'allowance', '>= 0.1.1'
|
22
22
|
|
23
|
-
gem.add_dependency 'happy-cli', '>= 0.1.0.pre1'
|
23
|
+
# gem.add_dependency 'happy-cli', '>= 0.1.0.pre1'
|
24
24
|
|
25
25
|
gem.add_development_dependency 'rake'
|
26
26
|
gem.add_development_dependency 'rspec', '~> 2.8'
|
@@ -3,17 +3,21 @@ module Happy
|
|
3
3
|
module Configurable
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
|
-
def
|
7
|
-
self.class.
|
6
|
+
def options
|
7
|
+
@options ||= self.class.options.dup
|
8
|
+
end
|
9
|
+
|
10
|
+
def set(k, v)
|
11
|
+
options[k.to_sym] = v
|
8
12
|
end
|
9
13
|
|
10
14
|
module ClassMethods
|
11
|
-
def
|
12
|
-
@
|
15
|
+
def options
|
16
|
+
@options ||= {}
|
13
17
|
end
|
14
18
|
|
15
19
|
def set(k, v)
|
16
|
-
|
20
|
+
options[k.to_sym] = v
|
17
21
|
end
|
18
22
|
end
|
19
23
|
end
|
@@ -2,9 +2,16 @@ require 'happy-helpers'
|
|
2
2
|
|
3
3
|
module Happy
|
4
4
|
class Controller
|
5
|
+
# A collection of useful helper methods.
|
6
|
+
#
|
5
7
|
module Helpers
|
8
|
+
# Load a whole bunch of helpers fromi HappyHelpers. This includes stuff
|
9
|
+
# like url_for, link_to and more.
|
6
10
|
include HappyHelpers::Helpers
|
7
11
|
|
12
|
+
# Renders "something". This method takes a closer look at what this
|
13
|
+
# "something" is and then dispatches to a more specific method.
|
14
|
+
#
|
8
15
|
def render(what, options = {}, &blk)
|
9
16
|
case what
|
10
17
|
when NilClass then ''
|
@@ -14,11 +21,15 @@ module Happy
|
|
14
21
|
end
|
15
22
|
end
|
16
23
|
|
24
|
+
# Render a template from the controller's view folder.
|
25
|
+
#
|
17
26
|
def render_template(name, variables = {}, &blk)
|
18
|
-
path =
|
27
|
+
path = options[:views] || './views'
|
19
28
|
HappyHelpers::Templates.render(File.join(path, name), self, variables, &blk)
|
20
29
|
end
|
21
30
|
|
31
|
+
# Render a resource.
|
32
|
+
#
|
22
33
|
def render_resource(resource, options = {})
|
23
34
|
# build name strings
|
24
35
|
singular_name = resource.class.to_s.tableize.singularize
|
data/lib/happy/controller.rb
CHANGED
@@ -24,7 +24,9 @@ module Happy
|
|
24
24
|
include Permissions
|
25
25
|
include Helpers
|
26
26
|
|
27
|
-
attr_reader :
|
27
|
+
attr_reader :env
|
28
|
+
|
29
|
+
CASCADING_OPTIONS = [:views]
|
28
30
|
|
29
31
|
# Creates a new instance of {Controller}. When a block is provided,
|
30
32
|
# it is run against the new instance, allowing custom controller classes
|
@@ -35,7 +37,7 @@ module Happy
|
|
35
37
|
# @param options [Hash]
|
36
38
|
# Controller options.
|
37
39
|
#
|
38
|
-
def initialize(env_or_parent = {},
|
40
|
+
def initialize(env_or_parent = {}, opts = {}, &blk)
|
39
41
|
if env_or_parent.is_a?(Happy::Controller)
|
40
42
|
@parent_controller = env_or_parent
|
41
43
|
@env = @parent_controller.env
|
@@ -47,7 +49,15 @@ module Happy
|
|
47
49
|
@processed_path = []
|
48
50
|
end
|
49
51
|
|
50
|
-
|
52
|
+
# Augment this instance's options hash with the options given to this constructor
|
53
|
+
options.merge!(opts)
|
54
|
+
|
55
|
+
# Copy missing options from our parent
|
56
|
+
if @parent_controller
|
57
|
+
CASCADING_OPTIONS.each do |opt|
|
58
|
+
options[opt] ||= @parent_controller.options[opt]
|
59
|
+
end
|
60
|
+
end
|
51
61
|
|
52
62
|
# Save a copy of the current path as this controller's root path.
|
53
63
|
@root_url = processed_path.join('/')
|
@@ -67,6 +77,8 @@ module Happy
|
|
67
77
|
|
68
78
|
protected
|
69
79
|
|
80
|
+
attr_reader :unprocessed_path, :processed_path
|
81
|
+
|
70
82
|
def root_url(*extras)
|
71
83
|
url_for(@root_url, extras)
|
72
84
|
end
|
@@ -92,10 +92,8 @@ module Happy
|
|
92
92
|
end
|
93
93
|
|
94
94
|
def route
|
95
|
-
|
96
|
-
|
97
|
-
:plural_name => options[:class].to_s.tableize.pluralize
|
98
|
-
}.merge(@options)
|
95
|
+
options[:singular_name] ||= options[:class].to_s.tableize.singularize
|
96
|
+
options[:plural_name] ||= options[:class].to_s.tableize.pluralize
|
99
97
|
|
100
98
|
path options[:plural_name] do
|
101
99
|
get('new') { do_new }
|
data/lib/happy/version.rb
CHANGED
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Happy
|
4
|
+
describe Controller::Configurable do
|
5
|
+
class TestController < Happy::Controller
|
6
|
+
set :foo, 'bar'
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '.set' do
|
10
|
+
it 'sets a class-level option' do
|
11
|
+
TestController.options[:foo].should == 'bar'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#set' do
|
16
|
+
before do
|
17
|
+
@instance = TestController.new
|
18
|
+
@instance.set :foo, 'baz'
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'sets an instance-level option, overriding the class default' do
|
22
|
+
@instance.options[:foo].should == 'baz'
|
23
|
+
end
|
24
|
+
|
25
|
+
it "doesn't modify the class-level default option" do
|
26
|
+
TestController.options[:foo].should == 'bar'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe 'class-level options' do
|
31
|
+
it 'are the defaults for instance-level options' do
|
32
|
+
TestController.new.options[:foo].should == 'bar'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'cascading options' do
|
37
|
+
class OuterController < Controller
|
38
|
+
set :views, './foo/'
|
39
|
+
set :foo, 'bar'
|
40
|
+
end
|
41
|
+
|
42
|
+
class InnerController < Controller
|
43
|
+
end
|
44
|
+
|
45
|
+
it "are copied from the parent controller if necessary" do
|
46
|
+
@instance = InnerController.new(OuterController.new)
|
47
|
+
@instance.options[:views].should == './foo/'
|
48
|
+
@instance.options[:foo].should be_nil
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe 'options passed to the initializer' do
|
53
|
+
it "override default options" do
|
54
|
+
@instance = TestController.new({}, :foo => 'baz')
|
55
|
+
@instance.options[:foo].should == 'baz'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: happy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.0.
|
4
|
+
version: 0.1.0.pre21
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-06-12 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
|
-
requirement: &
|
16
|
+
requirement: &70146774651160 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '3.1'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70146774651160
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rack
|
27
|
-
requirement: &
|
27
|
+
requirement: &70146774650120 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '1.4'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70146774650120
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: happy-helpers
|
38
|
-
requirement: &
|
38
|
+
requirement: &70146774648720 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.1.0.pre11
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70146774648720
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: allowance
|
49
|
-
requirement: &
|
49
|
+
requirement: &70146774646980 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,21 +54,10 @@ dependencies:
|
|
54
54
|
version: 0.1.1
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
58
|
-
- !ruby/object:Gem::Dependency
|
59
|
-
name: happy-cli
|
60
|
-
requirement: &70246363056880 !ruby/object:Gem::Requirement
|
61
|
-
none: false
|
62
|
-
requirements:
|
63
|
-
- - ! '>='
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
version: 0.1.0.pre1
|
66
|
-
type: :runtime
|
67
|
-
prerelease: false
|
68
|
-
version_requirements: *70246363056880
|
57
|
+
version_requirements: *70146774646980
|
69
58
|
- !ruby/object:Gem::Dependency
|
70
59
|
name: rake
|
71
|
-
requirement: &
|
60
|
+
requirement: &70146774662260 !ruby/object:Gem::Requirement
|
72
61
|
none: false
|
73
62
|
requirements:
|
74
63
|
- - ! '>='
|
@@ -76,10 +65,10 @@ dependencies:
|
|
76
65
|
version: '0'
|
77
66
|
type: :development
|
78
67
|
prerelease: false
|
79
|
-
version_requirements: *
|
68
|
+
version_requirements: *70146774662260
|
80
69
|
- !ruby/object:Gem::Dependency
|
81
70
|
name: rspec
|
82
|
-
requirement: &
|
71
|
+
requirement: &70146774660060 !ruby/object:Gem::Requirement
|
83
72
|
none: false
|
84
73
|
requirements:
|
85
74
|
- - ~>
|
@@ -87,10 +76,10 @@ dependencies:
|
|
87
76
|
version: '2.8'
|
88
77
|
type: :development
|
89
78
|
prerelease: false
|
90
|
-
version_requirements: *
|
79
|
+
version_requirements: *70146774660060
|
91
80
|
- !ruby/object:Gem::Dependency
|
92
81
|
name: rspec-html-matchers
|
93
|
-
requirement: &
|
82
|
+
requirement: &70146774658460 !ruby/object:Gem::Requirement
|
94
83
|
none: false
|
95
84
|
requirements:
|
96
85
|
- - ! '>='
|
@@ -98,10 +87,10 @@ dependencies:
|
|
98
87
|
version: '0'
|
99
88
|
type: :development
|
100
89
|
prerelease: false
|
101
|
-
version_requirements: *
|
90
|
+
version_requirements: *70146774658460
|
102
91
|
- !ruby/object:Gem::Dependency
|
103
92
|
name: rack-test
|
104
|
-
requirement: &
|
93
|
+
requirement: &70146774657580 !ruby/object:Gem::Requirement
|
105
94
|
none: false
|
106
95
|
requirements:
|
107
96
|
- - ! '>='
|
@@ -109,10 +98,10 @@ dependencies:
|
|
109
98
|
version: '0'
|
110
99
|
type: :development
|
111
100
|
prerelease: false
|
112
|
-
version_requirements: *
|
101
|
+
version_requirements: *70146774657580
|
113
102
|
- !ruby/object:Gem::Dependency
|
114
103
|
name: watchr
|
115
|
-
requirement: &
|
104
|
+
requirement: &70146774656440 !ruby/object:Gem::Requirement
|
116
105
|
none: false
|
117
106
|
requirements:
|
118
107
|
- - ! '>='
|
@@ -120,7 +109,7 @@ dependencies:
|
|
120
109
|
version: '0'
|
121
110
|
type: :development
|
122
111
|
prerelease: false
|
123
|
-
version_requirements: *
|
112
|
+
version_requirements: *70146774656440
|
124
113
|
description: A happy little toolkit for writing web applications.
|
125
114
|
email:
|
126
115
|
- hendrik@mans.de
|
@@ -161,6 +150,7 @@ files:
|
|
161
150
|
- lib/happy/version.rb
|
162
151
|
- spec/controller/actions_spec.rb
|
163
152
|
- spec/controller/cascadable_spec.rb
|
153
|
+
- spec/controller/configurable_spec.rb
|
164
154
|
- spec/controller/routing_spec.rb
|
165
155
|
- spec/controller_spec.rb
|
166
156
|
- spec/happy_spec.rb
|
@@ -192,6 +182,7 @@ summary: A happy little toolkit for writing web applications.
|
|
192
182
|
test_files:
|
193
183
|
- spec/controller/actions_spec.rb
|
194
184
|
- spec/controller/cascadable_spec.rb
|
185
|
+
- spec/controller/configurable_spec.rb
|
195
186
|
- spec/controller/routing_spec.rb
|
196
187
|
- spec/controller_spec.rb
|
197
188
|
- spec/happy_spec.rb
|