tabletastic 0.2.0.pre6 → 0.2.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.
data/CHANGELOG.rdoc CHANGED
@@ -1,12 +1,14 @@
1
- Git (for upcoming v0.2.0 release)
1
+ v0.2.0 (Oct 24, 2010)
2
2
 
3
- * [DEPRECATED] use of table.data method without = in erb or haml. See README for more information.
3
+ * This gem is now Rails 3 only
4
4
  * Update to Rails 3 API and idioms
5
+ * [DEPRECATED] use of table.data method without = in erb or haml. See README for more information.
5
6
  * Add default table html options
6
7
  * Add default lambda (table block) so that table_for can be called without passing a block
7
8
  * Add has_one associations
8
9
  * Add heading html hook for <th> elements
9
10
  * Super-basic mongoid support (2.x branch)
11
+ * Add ability to pass :action_prefix an array (Thanks, brunowernimont)
10
12
 
11
13
  v0.1.3 (Dec 28, 2009)
12
14
 
@@ -104,18 +104,21 @@ module Tabletastic
104
104
  # Dynamically builds links for the action
105
105
  def action_link(action, prefix)
106
106
  html_class = "actions #{action.to_s}_link"
107
- proc = lambda do |resource|
107
+ block = lambda do |resource|
108
108
  compound_resource = [prefix, resource].compact
109
+ compound_resource.flatten! if prefix.kind_of?(Array)
109
110
  case action
110
111
  when :show
111
112
  @template.link_to("Show", compound_resource)
112
113
  when :destroy
113
- @template.link_to("Destroy", compound_resource, :method => :delete, :confirm => @@destroy_confirm_message)
114
+ @template.link_to("Destroy", compound_resource,
115
+ :method => :delete, :confirm => @@destroy_confirm_message)
114
116
  else # edit, other resource GET actions
115
- @template.link_to(action.to_s.titleize, @template.polymorphic_path(compound_resource, :action => action))
117
+ @template.link_to(action.to_s.titleize,
118
+ @template.polymorphic_path(compound_resource, :action => action))
116
119
  end
117
120
  end
118
- self.cell(action, :heading => "", :cell_html => {:class => html_class}, &proc)
121
+ self.cell(action, :heading => "", :cell_html => {:class => html_class}, &block)
119
122
  end
120
123
 
121
124
  protected
@@ -1,3 +1,3 @@
1
1
  module Tabletastic
2
- VERSION = "0.2.0.pre6"
2
+ VERSION = "0.2.0"
3
3
  end
data/spec/spec_helper.rb CHANGED
@@ -1,134 +1,130 @@
1
- require 'rubygems'
2
- require 'spork'
3
-
4
- Spork.prefork do
5
- ## Use bundler to exec the specs
6
- $LOAD_PATH.unshift(File.dirname(__FILE__))
7
- require 'bundler'
8
- Bundler.setup
9
- require 'rspec'
10
-
11
- require 'rspec_tag_matchers'
12
- require 'active_record'
13
- require 'action_controller'
14
-
15
- require 'action_view/base'
16
- require 'action_view/template'
17
- require 'action_view/helpers'
18
-
19
- RSpec.configure do |config|
20
- config.include(RspecTagMatchers)
21
- end
1
+ ## Use bundler to exec the specs
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'bundler'
4
+ Bundler.setup
5
+ require 'rspec'
6
+
7
+ require 'rspec_tag_matchers'
8
+ require 'active_record'
9
+ require 'action_controller'
10
+
11
+ require 'action_view/base'
12
+ require 'action_view/template'
13
+ require 'action_view/helpers'
14
+
15
+ RSpec.configure do |config|
16
+ config.include(RspecTagMatchers)
17
+ end
22
18
 
23
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
24
-
25
- module TabletasticSpecHelper
26
- include ActiveSupport
27
- include ActionView
28
- include ActionView::Helpers::UrlHelper
29
- include ActionView::Helpers::TagHelper
30
- include ActionView::Helpers::TextHelper
31
- include ActionView::Helpers::ActiveModelHelper
32
- include ActionView::Helpers::RecordTagHelper
33
- include ActionView::Helpers::CaptureHelper
34
- include ActionView::Helpers::RawOutputHelper
35
- include ActionDispatch::Routing::PolymorphicRoutes
36
-
37
- def self.included(base)
38
- base.class_eval do
39
- attr_accessor :output_buffer
40
- end
19
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
20
+
21
+ module TabletasticSpecHelper
22
+ include ActiveSupport
23
+ include ActionView
24
+ include ActionView::Helpers::UrlHelper
25
+ include ActionView::Helpers::TagHelper
26
+ include ActionView::Helpers::TextHelper
27
+ include ActionView::Helpers::ActiveModelHelper
28
+ include ActionView::Helpers::RecordTagHelper
29
+ include ActionView::Helpers::CaptureHelper
30
+ include ActionView::Helpers::RawOutputHelper
31
+ include ActionDispatch::Routing::PolymorphicRoutes
32
+
33
+ def self.included(base)
34
+ base.class_eval do
35
+ attr_accessor :output_buffer
41
36
  end
37
+ end
42
38
 
43
- def reset_output_buffer!
44
- @output_buffer = ActionView::OutputBuffer.new
45
- end
39
+ def reset_output_buffer!
40
+ @output_buffer = ActionView::OutputBuffer.new
41
+ end
46
42
 
47
- module ::RspecTagMatchers
48
- def have_table_with_tag(selector, inner_text_or_options = nil, options = {}, &block)
49
- HaveTag.new("table", nil, {}) &&
50
- HaveTag.new(selector, inner_text_or_options, options, &block)
43
+ module ::RspecTagMatchers
44
+ class HaveTag
45
+ def description
46
+ description = "have tag <#@selector>"
47
+ description << " with inner text '#@inner_text'" if @inner_text
48
+ description
51
49
  end
52
50
  end
51
+ def have_table_with_tag(selector, inner_text_or_options = nil, options = {}, &block)
52
+ HaveTag.new("table", nil, {}) &&
53
+ HaveTag.new(selector, inner_text_or_options, options, &block)
54
+ end
55
+ end
53
56
 
54
- class ::Post
55
- def id
56
- end
57
+ class MockARModel
58
+ def id
59
+ end
60
+ def to_key
61
+ [id]
57
62
  end
58
- class ::Author
63
+ def self.human_attribute_name(col)
64
+ col.humanize if col
59
65
  end
60
- class ::Profile
66
+ def self.model_name
67
+ ActiveModel::Name.new(self)
68
+ end
69
+ end
70
+ class ::Author < MockARModel; end
71
+ class ::Post < MockARModel; end
72
+ class ::Profile < MockARModel; end
73
+
74
+ def mock_everything
75
+ def post_path(post); "/posts/#{post.id}"; end
76
+ def admin_post_path(post); "/admin/posts/#{post.id}"; end
77
+ def author_post_path(author, post); "/authors/#{author.id}/posts/#{post.id}"; end
78
+ def admin_author_post_path(author, post); "/admin/authors/#{author.id}/posts/#{post.id}"; end
79
+ def edit_post_path(post); "/posts/#{post.id}/edit"; end
80
+ def edit_admin_post_path(post); "/admin/posts/#{post.id}/edit"; end
81
+ def edit_admin_author_post_path(author, post)
82
+ "/admin/authors/#{author.id}/posts/#{post.id}/edit"
61
83
  end
62
84
 
63
- def mock_everything
64
- def post_path(post); "/posts/#{post.id}"; end
65
- def admin_post_path(post); "/admin/posts/#{post.id}"; end
66
- def edit_post_path(post); "/posts/#{post.id}/edit"; end
67
- def edit_admin_post_path(post); "/admin/posts/#{post.id}/edit"; end
68
-
69
- # Sometimes we need a mock @post object and some Authors for belongs_to
70
- @post = mock('post')
71
- @post.stub!(:class).and_return(::Post)
72
- @post.stub!(:id).and_return(nil)
73
- @post.stub!(:author)
74
- @post.stub!(:to_key).and_return([2])
75
- ::Post.stub!(:human_attribute_name).and_return { |column_name| column_name.humanize }
76
- ::Post.stub!(:model_name).and_return(ActiveModel::Name.new(::Post))
77
-
78
- @fred = mock('author', :to_key => nil)
79
- @fred.stub!(:class).and_return(::Author)
80
- @fred.stub!(:name).and_return('Fred Smith')
81
- @fred.stub!(:id).and_return(37)
82
-
83
- @profile = mock('profile')
84
- @profile.stub!(:author).and_return(@fred)
85
- @profile.stub!(:bio).and_return("This is my bio")
86
- @fred.stub!(:profile).and_return(@profile)
87
-
88
- ::Author.stub!(:content_columns).and_return([mock('column', :name => "name")])
89
-
90
- ::Author.stub!(:find).and_return([@fred])
91
- ::Author.stub!(:human_attribute_name).and_return { |column_name| column_name.humanize }
92
- ::Author.stub!(:human_name).and_return('Author')
93
- ::Author.stub!(:model_name).and_return(ActiveModel::Name.new(::Author))
94
-
95
- @freds_post = mock('post')
96
- @freds_post.stub!(:class).and_return(::Post)
97
- @freds_post.stub!(:title).and_return('Fred\'s Post')
98
- @freds_post.stub!(:body)
99
- @freds_post.stub!(:id).and_return(19)
100
- @freds_post.stub!(:to_key).and_return([19])
101
- @freds_post.stub!(:author).and_return(@fred)
102
- @freds_post.stub!(:author_id).and_return(@fred.id)
103
- @fred.stub!(:posts).and_return([@freds_post])
104
- @fred.stub!(:post_ids).and_return([@freds_post.id])
105
-
106
- @mock_reflection_belongs_to_author = mock('reflection1', :options => {}, :name => :author, :macro => :belongs_to, :collection => false)
107
-
108
- @mock_reflection_has_one_profile = mock('reflection2', :options => {}, :name => :profile, :macro => :has_one, :collection => false)
109
-
110
- ::Post.stub!(:reflect_on_association).and_return do |column_name|
111
- @mock_reflection_belongs_to_author if column_name == :author
112
- end
85
+ # Sometimes we need a mock @post object and some Authors for belongs_to
86
+ @post = Post.new
87
+ @post.stub(:id => nil)
88
+ @post.stub!(:author)
89
+ ::Post.stub!(:human_attribute_name).and_return { |column_name| column_name.humanize }
113
90
 
114
- ::Author.stub!(:reflect_on_association).and_return do |column_name|
115
- mock('reflection', :options => {}, :klass => Post, :macro => :has_many) if column_name == :posts
116
- @mock_reflection_has_one_profile if column_name == :profile
117
- end
91
+ @fred = Author.new
92
+ @fred.stub(:name => "Fred Smith", :id => 37)
93
+
94
+ @profile = Profile.new
95
+ @profile.stub(:author => @fred, :bio => "This is my bio")
96
+ @fred.stub(:profile => @profile)
97
+
98
+ ::Author.stub!(:content_columns).and_return([mock('column', :name => "name")])
99
+ ::Author.stub!(:find).and_return([@fred])
118
100
 
101
+ @freds_post = Post.new
102
+ @freds_post.stub(:title => "Fred's Post", :id => 19, :author => @fred, :author_id => @fred.id)
103
+ @freds_post.stub!(:body)
104
+ @fred.stub(:posts => [@freds_post])
119
105
 
120
- ::Post.stub!(:reflect_on_all_associations).and_return([])
121
- ::Author.stub!(:reflect_on_all_associations).and_return([])
106
+ @mock_reflection_belongs_to_author = mock('reflection1', :options => {}, :name => :author, :macro => :belongs_to, :collection => false)
107
+
108
+ @mock_reflection_has_one_profile = mock('reflection2', :options => {}, :name => :profile, :macro => :has_one, :collection => false)
109
+
110
+ ::Post.stub!(:reflect_on_association).and_return do |column_name|
111
+ @mock_reflection_belongs_to_author if column_name == :author
122
112
  end
123
- end
124
113
 
125
- end
114
+ ::Author.stub!(:reflect_on_association).and_return do |column_name|
115
+ mock('reflection', :options => {}, :klass => Post, :macro => :has_many) if column_name == :posts
116
+ @mock_reflection_has_one_profile if column_name == :profile
117
+ end
126
118
 
127
- Spork.each_run do
128
- # This code will be run each time you run your specs.
129
- require 'tabletastic'
130
119
 
131
- include TabletasticSpecHelper
132
- include Tabletastic
133
- include Tabletastic::Helper
120
+ ::Post.stub!(:reflect_on_all_associations).and_return([])
121
+ ::Author.stub!(:reflect_on_all_associations).and_return([])
122
+ end
134
123
  end
124
+
125
+
126
+ require 'tabletastic'
127
+
128
+ include TabletasticSpecHelper
129
+ include Tabletastic
130
+ include Tabletastic::Helper
@@ -65,6 +65,7 @@ describe Tabletastic::TableBuilder do
65
65
  reset_output_buffer!
66
66
  ::Post.stub!(:respond_to?).with(:content_columns).and_return(false)
67
67
  ::Post.stub!(:respond_to?).with(:fields).and_return(true)
68
+ ::Post.stub!(:respond_to?).with(:empty?).and_return(false)
68
69
  ::Post.stub!(:fields).and_return({'title' => '', 'created_at' => ''})
69
70
  concat(table_for(@posts) { |t| t.data })
70
71
  end
@@ -143,34 +144,66 @@ describe Tabletastic::TableBuilder do
143
144
  end
144
145
 
145
146
  context "with options[:actions_prefix]" do
146
- it "includes path to admin post for :show" do
147
- concat(table_for(@posts) do |t|
148
- t.data(:actions => :show, :action_prefix => :admin)
149
- end)
150
- output_buffer.should have_tag("td:nth-child(3) a[@href=\"/admin/posts/#{@post.id}\"]", "Show")
151
- end
147
+ context "with a single symbol as argument" do
148
+ it "includes path to admin post for :show" do
149
+ concat(table_for(@posts) do |t|
150
+ t.data(:actions => :show, :action_prefix => :admin)
151
+ end)
152
+ output_buffer.should have_tag("td:nth-child(3) a[@href=\"/admin/posts/#{@post.id}\"]", "Show")
153
+ end
152
154
 
153
- it "includes path to admin post for :edit" do
154
- concat(table_for(@posts) do |t|
155
- t.data(:actions => :edit, :action_prefix => :admin)
156
- end)
157
- output_buffer.should have_tag("td:nth-child(3) a[@href=\"/admin/posts/#{@post.id}/edit\"]", "Edit")
155
+ it "includes path to admin post for :edit" do
156
+ concat(table_for(@posts) do |t|
157
+ t.data(:actions => :edit, :action_prefix => :admin)
158
+ end)
159
+ output_buffer.should have_tag("td:nth-child(3) a[@href=\"/admin/posts/#{@post.id}/edit\"]", "Edit")
160
+ end
161
+
162
+ it "includes path to admin post for :destroy" do
163
+ concat(table_for(@posts) do |t|
164
+ t.data(:actions => :destroy, :action_prefix => :admin)
165
+ end)
166
+ output_buffer.should have_tag("td:nth-child(3) a[@href=\"/admin/posts/#{@post.id}\"]", "Destroy")
167
+ end
168
+
169
+ it "includes path to admin for all actions" do
170
+ concat(table_for(@posts) do |t|
171
+ concat(t.data(:actions => :all, :action_prefix => :admin))
172
+ end)
173
+ output_buffer.should have_tag("td:nth-child(3) a[@href=\"/admin/posts/#{@post.id}\"]", "Show")
174
+ output_buffer.should have_tag("td:nth-child(4) a[@href=\"/admin/posts/#{@post.id}/edit\"]", "Edit")
175
+ output_buffer.should have_tag("td:nth-child(5) a[@href=\"/admin/posts/#{@post.id}\"]", "Destroy")
176
+ end
158
177
  end
159
178
 
160
- it "includes path to admin post for :destroy" do
161
- concat(table_for(@posts) do |t|
162
- t.data(:actions => :destroy, :action_prefix => :admin)
163
- end)
164
- output_buffer.should have_tag("td:nth-child(3) a[@href=\"/admin/posts/#{@post.id}\"]", "Destroy")
179
+ context "with a resource as an argument" do
180
+ it "nests the link within the resource correctly for :show" do
181
+ concat(table_for(@posts) do |t|
182
+ t.data(:actions => :show, :action_prefix => @fred)
183
+ end)
184
+ output_buffer.should have_tag("td:nth-child(3) a[@href=\"/authors/#{@fred.id}/posts/#{@post.id}\"]", "Show")
185
+ end
165
186
  end
166
187
 
167
- it "includes path to admin for all actions" do
168
- concat(table_for(@posts) do |t|
169
- concat(t.data(:actions => :all, :action_prefix => :admin))
170
- end)
171
- output_buffer.should have_tag("td:nth-child(3) a[@href=\"/admin/posts/#{@post.id}\"]", "Show")
172
- output_buffer.should have_tag("td:nth-child(4) a[@href=\"/admin/posts/#{@post.id}/edit\"]", "Edit")
173
- output_buffer.should have_tag("td:nth-child(5) a[@href=\"/admin/posts/#{@post.id}\"]", "Destroy")
188
+ context "with an array as an argument" do
189
+ it "nests correctly for namespace and resource for :show" do
190
+ concat(table_for(@posts) do |t|
191
+ t.data(:actions => :show, :action_prefix => [:admin, @fred])
192
+ end)
193
+ output_buffer.should have_tag(
194
+ "td a[@href=\"/admin/authors/#{@fred.id}/posts/#{@post.id}\"]", "Show")
195
+ end
196
+ it "includes path to admin for all actions" do
197
+ concat(table_for(@posts) do |t|
198
+ concat(t.data(:actions => :all, :action_prefix => [:admin, @fred]))
199
+ end)
200
+ output_buffer.should have_tag(
201
+ "td a[@href=\"/admin/authors/#{@fred.id}/posts/#{@post.id}\"]", "Show")
202
+ output_buffer.should have_tag(
203
+ "td a[@href=\"/admin/authors/#{@fred.id}/posts/#{@post.id}/edit\"]", "Edit")
204
+ output_buffer.should have_tag(
205
+ "td a[@href=\"/admin/authors/#{@fred.id}/posts/#{@post.id}\"]", "Destroy")
206
+ end
174
207
  end
175
208
  end
176
209
  end
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tabletastic
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: true
4
+ prerelease: false
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
8
  - 0
9
- - pre6
10
- version: 0.2.0.pre6
9
+ version: 0.2.0
11
10
  platform: ruby
12
11
  authors:
13
12
  - Joshua Davey
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-09-11 00:00:00 -04:00
17
+ date: 2010-09-11 00:00:00 -05:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency