amrita2 2.0.0 → 2.0.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.
Files changed (53) hide show
  1. data/README +1 -1
  2. data/init.rb +1 -0
  3. data/lib/amrita2/rails_bridge.rb +92 -7
  4. data/lib/amrita2/template.rb +12 -127
  5. data/lib/amrita2/testsupport.rb +0 -25
  6. data/lib/amrita2/version.rb +1 -1
  7. data/sample/depot/app/controllers/admin_controller.rb +3 -1
  8. data/sample/depot/app/helpers/cart_helper.rb +8 -0
  9. data/sample/depot/app/helpers/price_helper.rb +7 -0
  10. data/sample/depot/config/environment.rb +0 -14
  11. data/sample/depot/config/environments/development.rb +2 -2
  12. data/sample/depot/db/schema.rb +27 -20
  13. data/sample/depot/test/functional/admin_controller_test.rb +63 -22
  14. data/sample/depot/test/functional/store_controller_test.rb +30 -18
  15. data/sample/depot/vendor/plugins/will_paginate/init.rb +4 -0
  16. data/sample/depot/vendor/plugins/will_paginate/lib/will_paginate.rb +61 -0
  17. data/sample/depot/vendor/plugins/will_paginate/lib/will_paginate/collection.rb +132 -0
  18. data/sample/depot/vendor/plugins/will_paginate/lib/will_paginate/core_ext.rb +80 -0
  19. data/sample/depot/vendor/plugins/will_paginate/lib/will_paginate/finder.rb +181 -0
  20. data/sample/depot/vendor/plugins/will_paginate/lib/will_paginate/view_helpers.rb +206 -0
  21. data/sample/depot/vendor/plugins/will_paginate/test/array_pagination_test.rb +131 -0
  22. data/sample/depot/vendor/plugins/will_paginate/test/boot.rb +23 -0
  23. data/sample/depot/vendor/plugins/will_paginate/test/finder_test.rb +290 -0
  24. data/sample/depot/vendor/plugins/will_paginate/test/fixtures/admin.rb +3 -0
  25. data/sample/depot/vendor/plugins/will_paginate/test/fixtures/company.rb +9 -0
  26. data/sample/depot/vendor/plugins/will_paginate/test/fixtures/developer.rb +11 -0
  27. data/sample/depot/vendor/plugins/will_paginate/test/fixtures/project.rb +15 -0
  28. data/sample/depot/vendor/plugins/will_paginate/test/fixtures/reply.rb +5 -0
  29. data/sample/depot/vendor/plugins/will_paginate/test/fixtures/schema.rb +38 -0
  30. data/sample/depot/vendor/plugins/will_paginate/test/fixtures/topic.rb +4 -0
  31. data/sample/depot/vendor/plugins/will_paginate/test/fixtures/user.rb +2 -0
  32. data/sample/depot/vendor/plugins/will_paginate/test/helper.rb +25 -0
  33. data/sample/depot/vendor/plugins/will_paginate/test/lib/activerecord_test_case.rb +23 -0
  34. data/sample/depot/vendor/plugins/will_paginate/test/lib/activerecord_test_connector.rb +67 -0
  35. data/sample/depot/vendor/plugins/will_paginate/test/lib/load_fixtures.rb +13 -0
  36. data/sample/depot/vendor/plugins/will_paginate/test/pagination_test.rb +240 -0
  37. data/sample/hello/test1.rb +23 -0
  38. data/sample/login_engine/config/environment.rb +18 -20
  39. data/sample/login_engine/config/environments/development.rb +2 -2
  40. data/sample/login_engine/db/schema.rb +24 -17
  41. data/sample/login_engine/lib/login_engine/authenticated_system.rb +18 -18
  42. data/sample/login_engine/test/functional/user_controller_test.rb +1 -0
  43. data/sample/ramaze/ramaise_amrita2.rb +156 -0
  44. data/specs/attribute.rb +11 -0
  45. data/specs/datatypes.rb +13 -0
  46. data/specs/sample.rb +1 -2
  47. data/specs/sanitize.rb +14 -0
  48. metadata +28 -7
  49. data/sample/depot/app/helpers/ar_form.rb +0 -169
  50. data/sample/depot/app/helpers/form_tag.rb +0 -24
  51. data/sample/depot/app/helpers/standard_form.rb +0 -73
  52. data/sample/depot/test/integration/dsl_user_stories_test.rb +0 -126
  53. data/sample/depot/test/integration/user_stories_test.rb +0 -70
@@ -0,0 +1,9 @@
1
+ class Company < ActiveRecord::Base
2
+ attr_protected :rating
3
+ set_sequence_name :companies_nonstd_seq
4
+
5
+ validates_presence_of :name
6
+ def validate
7
+ errors.add('rating', 'rating should not be 2') if rating == 2
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ class Developer < User
2
+ has_and_belongs_to_many :projects, :include => :topics, :order => 'projects.name'
3
+
4
+ def self.with_poor_ones(&block)
5
+ with_scope :find => { :conditions => ['salary <= ?', 80000], :order => 'salary' } do
6
+ yield
7
+ end
8
+ end
9
+
10
+ def self.per_page() 10 end
11
+ end
@@ -0,0 +1,15 @@
1
+ class Project < ActiveRecord::Base
2
+ has_and_belongs_to_many :developers, :uniq => true
3
+
4
+ has_many :topics
5
+ # :finder_sql => 'SELECT * FROM topics WHERE (topics.project_id = #{id})',
6
+ # :counter_sql => 'SELECT COUNT(*) FROM topics WHERE (topics.project_id = #{id})'
7
+
8
+ has_many :replies, :through => :topics do
9
+ def find_recent(params = {})
10
+ with_scope :find => { :conditions => ['replies.created_at > ?', 15.minutes.ago] } do
11
+ find :all, params
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ class Reply < ActiveRecord::Base
2
+ belongs_to :topic, :include => [:replies]
3
+
4
+ validates_presence_of :content
5
+ end
@@ -0,0 +1,38 @@
1
+ ActiveRecord::Schema.define do
2
+
3
+ create_table "developers_projects", :id => false, :force => true do |t|
4
+ t.column "developer_id", :integer, :null => false
5
+ t.column "project_id", :integer, :null => false
6
+ t.column "joined_on", :date
7
+ t.column "access_level", :integer, :default => 1
8
+ end
9
+
10
+ create_table "projects", :force => true do |t|
11
+ t.column "name", :text
12
+ end
13
+
14
+ create_table "replies", :force => true do |t|
15
+ t.column "content", :text
16
+ t.column "created_at", :datetime
17
+ t.column "updated_at", :datetime
18
+ t.column "topic_id", :integer
19
+ end
20
+
21
+ create_table "topics", :force => true do |t|
22
+ t.column "project_id", :integer
23
+ t.column "title", :string
24
+ t.column "subtitle", :string
25
+ t.column "content", :text
26
+ t.column "created_at", :datetime
27
+ t.column "updated_at", :datetime
28
+ end
29
+
30
+ create_table "users", :force => true do |t|
31
+ t.column "name", :text
32
+ t.column "salary", :integer, :default => 70000
33
+ t.column "created_at", :datetime
34
+ t.column "updated_at", :datetime
35
+ t.column "type", :text
36
+ end
37
+
38
+ end
@@ -0,0 +1,4 @@
1
+ class Topic < ActiveRecord::Base
2
+ has_many :replies, :dependent => :destroy, :order => 'replies.created_at DESC'
3
+ belongs_to :project
4
+ end
@@ -0,0 +1,2 @@
1
+ class User < ActiveRecord::Base
2
+ end
@@ -0,0 +1,25 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+
4
+ # gem install redgreen for colored test output
5
+ begin require 'redgreen'; rescue LoadError; end
6
+
7
+ require File.join(File.dirname(__FILE__), 'boot') unless defined?(ActiveRecord)
8
+
9
+ class Test::Unit::TestCase
10
+ protected
11
+ def assert_respond_to_all object, methods
12
+ methods.each do |method|
13
+ [method.to_s, method.to_sym].each { |m| assert_respond_to object, m }
14
+ end
15
+ end
16
+ end
17
+
18
+ # Wrap tests that use Mocha and skip if unavailable.
19
+ def uses_mocha(test_name)
20
+ require 'mocha' unless Object.const_defined?(:Mocha)
21
+ yield
22
+ rescue LoadError => load_error
23
+ raise unless load_error.message =~ /mocha/i
24
+ $stderr.puts "Skipping #{test_name} tests. `gem install mocha` and try again."
25
+ end
@@ -0,0 +1,23 @@
1
+ require File.join(File.dirname(__FILE__), 'activerecord_test_connector')
2
+
3
+ class ActiveRecordTestCase < Test::Unit::TestCase
4
+ # Set our fixture path
5
+ if ActiveRecordTestConnector.able_to_connect
6
+ self.fixture_path = File.join(File.dirname(__FILE__), '..', 'fixtures')
7
+ self.use_transactional_fixtures = false
8
+ end
9
+
10
+ def self.fixtures(*args)
11
+ super if ActiveRecordTestConnector.connected
12
+ end
13
+
14
+ def run(*args)
15
+ super if ActiveRecordTestConnector.connected
16
+ end
17
+
18
+ # Default so Test::Unit::TestCase doesn't complain
19
+ def test_truth
20
+ end
21
+ end
22
+
23
+ ActiveRecordTestConnector.setup
@@ -0,0 +1,67 @@
1
+ require 'active_record'
2
+ require 'active_record/version'
3
+ require 'active_record/fixtures'
4
+
5
+ class ActiveRecordTestConnector
6
+ cattr_accessor :able_to_connect
7
+ cattr_accessor :connected
8
+
9
+ # Set our defaults
10
+ self.connected = false
11
+ self.able_to_connect = true
12
+
13
+ def self.setup
14
+ unless self.connected || !self.able_to_connect
15
+ setup_connection
16
+ load_schema
17
+ # require_fixture_models
18
+ Dependencies.load_paths.unshift(File.dirname(__FILE__) + "/../fixtures")
19
+ self.connected = true
20
+ end
21
+ rescue Exception => e # errors from ActiveRecord setup
22
+ $stderr.puts "\nSkipping ActiveRecord assertion tests: #{e}"
23
+ #$stderr.puts " #{e.backtrace.join("\n ")}\n"
24
+ self.able_to_connect = false
25
+ end
26
+
27
+ private
28
+
29
+ def self.setup_connection
30
+ if Object.const_defined?(:ActiveRecord)
31
+ defaults = { :database => ':memory:' }
32
+ ActiveRecord::Base.logger = Logger.new STDOUT if $0 == 'irb'
33
+
34
+ begin
35
+ options = defaults.merge :adapter => 'sqlite3', :timeout => 500
36
+ ActiveRecord::Base.establish_connection(options)
37
+ ActiveRecord::Base.configurations = { 'sqlite3_ar_integration' => options }
38
+ ActiveRecord::Base.connection
39
+ rescue Exception # errors from establishing a connection
40
+ $stderr.puts 'SQLite 3 unavailable; trying SQLite 2.'
41
+ options = defaults.merge :adapter => 'sqlite'
42
+ ActiveRecord::Base.establish_connection(options)
43
+ ActiveRecord::Base.configurations = { 'sqlite2_ar_integration' => options }
44
+ ActiveRecord::Base.connection
45
+ end
46
+
47
+ unless Object.const_defined?(:QUOTED_TYPE)
48
+ Object.send :const_set, :QUOTED_TYPE, ActiveRecord::Base.connection.quote_column_name('type')
49
+ end
50
+ else
51
+ raise "Can't setup connection since ActiveRecord isn't loaded."
52
+ end
53
+ end
54
+
55
+ def self.load_schema
56
+ ActiveRecord::Base.silence do
57
+ ActiveRecord::Migration.verbose = false
58
+ load File.dirname(__FILE__) + "/../fixtures/schema.rb"
59
+ end
60
+ end
61
+
62
+ def self.require_fixture_models
63
+ models = Dir.glob(File.dirname(__FILE__) + "/../fixtures/*.rb")
64
+ models = (models.grep(/user.rb/) + models).uniq
65
+ models.each { |f| require f }
66
+ end
67
+ end
@@ -0,0 +1,13 @@
1
+ dirname = File.dirname(__FILE__)
2
+ require File.join(dirname, '..', 'boot')
3
+ require File.join(dirname, 'activerecord_test_connector')
4
+
5
+ # setup the connection
6
+ ActiveRecordTestConnector.setup
7
+
8
+ # load all fixtures
9
+ fixture_path = File.join(dirname, '..', 'fixtures')
10
+ Fixtures.create_fixtures(fixture_path, ActiveRecord::Base.connection.tables)
11
+
12
+ require 'will_paginate'
13
+ WillPaginate.enable_activerecord
@@ -0,0 +1,240 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+ require 'action_controller'
3
+ require 'action_controller/test_process'
4
+
5
+ ActionController::Routing::Routes.draw do |map|
6
+ map.connect ':controller/:action/:id'
7
+ end
8
+
9
+ ActionController::Base.perform_caching = false
10
+
11
+ require 'will_paginate'
12
+ WillPaginate.enable_actionpack
13
+
14
+ class PaginationTest < Test::Unit::TestCase
15
+
16
+ class DevelopersController < ActionController::Base
17
+ def list_developers
18
+ @options = session[:wp] || {}
19
+
20
+ @developers = (1..11).to_a.paginate(
21
+ :page => params[@options[:param_name] || :page] || 1,
22
+ :per_page => params[:per_page] || 4
23
+ )
24
+
25
+ render :inline => '<%= will_paginate @developers, @options %>'
26
+ end
27
+
28
+ def guess_collection_name
29
+ @developers = session[:wp]
30
+ @options = session[:wp_options]
31
+ render :inline => '<%= will_paginate @options %>'
32
+ end
33
+
34
+ protected
35
+ def rescue_errors(e) raise e end
36
+ def rescue_action(e) raise e end
37
+ end
38
+
39
+ def setup
40
+ @controller = DevelopersController.new
41
+ @request = ActionController::TestRequest.new
42
+ @response = ActionController::TestResponse.new
43
+ super
44
+ end
45
+
46
+ def test_will_paginate
47
+ get :list_developers
48
+
49
+ entries = assigns :developers
50
+ assert entries
51
+ assert_equal 4, entries.size
52
+
53
+ assert_select 'div.pagination', 1, 'no main DIV' do |el|
54
+ assert_select 'a[href]', 3 do |elements|
55
+ validate_page_numbers [2,3,2], elements
56
+ assert_select elements.last, ':last-child', "Next &raquo;"
57
+ end
58
+ assert_select 'span', 2
59
+ assert_select 'span.disabled:first-child', "&laquo; Previous"
60
+ assert_select 'span.current', entries.current_page.to_s
61
+ end
62
+ end
63
+
64
+ def test_will_paginate_with_options
65
+ get :list_developers, { :page => 2 }, :wp => {
66
+ :class => 'will_paginate', :prev_label => 'Prev', :next_label => 'Next'
67
+ }
68
+ assert_response :success
69
+
70
+ entries = assigns :developers
71
+ assert entries
72
+ assert_equal 4, entries.size
73
+
74
+ assert_select 'div.will_paginate', 1, 'no main DIV' do
75
+ assert_select 'a[href]', 4 do |elements|
76
+ validate_page_numbers [1,1,3,3], elements
77
+ assert_select elements.first, 'a', "Prev"
78
+ assert_select elements.last, 'a', "Next"
79
+ end
80
+ assert_select 'span.current', entries.current_page.to_s
81
+ end
82
+ end
83
+
84
+ def test_will_paginate_without_container
85
+ get :list_developers, {}, :wp => { :container => false }
86
+ assert_select 'div.pagination', 0, 'no main DIV'
87
+ assert_select 'a[href]', 3
88
+ end
89
+
90
+ def test_will_paginate_without_page_links
91
+ get :list_developers, { :page => 2 }, :wp => { :page_links => false }
92
+ assert_select 'a[href]', 2 do |elements|
93
+ validate_page_numbers [1,3], elements
94
+ end
95
+ end
96
+
97
+ def test_will_paginate_preserves_parameters_on_get
98
+ get :list_developers, :foo => { :bar => 'baz' }
99
+ assert_links_match /foo%5Bbar%5D=baz/
100
+ end
101
+
102
+ def test_will_paginate_doesnt_preserve_parameters_on_post
103
+ post :list_developers, :foo => 'bar'
104
+ assert_no_links_match /foo=bar/
105
+ end
106
+
107
+ def test_adding_additional_parameters
108
+ get :list_developers, {}, :wp => { :params => { :foo => 'bar' } }
109
+ assert_links_match /foo=bar/
110
+ end
111
+
112
+ def test_removing_arbitrary_parameters
113
+ get :list_developers, { :foo => 'bar' }, :wp => { :params => { :foo => nil } }
114
+ assert_no_links_match /foo=bar/
115
+ end
116
+
117
+ def test_adding_additional_route_parameters
118
+ get :list_developers, {}, :wp => { :params => { :controller => 'baz' } }
119
+ assert_links_match %r{\Wbaz/list_developers\W}
120
+ end
121
+
122
+ def test_will_paginate_with_custom_page_param
123
+ get :list_developers, { :developers_page => 2 }, :wp => { :param_name => :developers_page }
124
+ assert_response :success
125
+
126
+ entries = assigns :developers
127
+ assert entries
128
+ assert_equal 4, entries.size
129
+
130
+ assert_select 'div.pagination', 1, 'no main DIV' do
131
+ assert_select 'a[href]', 4 do |elements|
132
+ validate_page_numbers [1,1,3,3], elements, :developers_page
133
+ end
134
+ assert_select 'span.current', entries.current_page.to_s
135
+ end
136
+ end
137
+
138
+ def test_will_paginate_windows
139
+ get :list_developers, { :page => 6, :per_page => 1 }, :wp => { :inner_window => 1 }
140
+ assert_response :success
141
+
142
+ entries = assigns :developers
143
+ assert entries
144
+ assert_equal 1, entries.size
145
+
146
+ assert_select 'div.pagination', 1, 'no main DIV' do
147
+ assert_select 'a[href]', 8 do |elements|
148
+ validate_page_numbers [5,1,2,5,7,10,11,7], elements
149
+ assert_select elements.first, 'a', "&laquo; Previous"
150
+ assert_select elements.last, 'a', "Next &raquo;"
151
+ end
152
+ assert_select 'span.current', entries.current_page.to_s
153
+ end
154
+ end
155
+
156
+ def test_will_paginate_eliminates_small_gaps
157
+ get :list_developers, { :page => 6, :per_page => 1 }, :wp => { :inner_window => 2 }
158
+ assert_response :success
159
+
160
+ assert_select 'div.pagination', 1, 'no main DIV' do
161
+ assert_select 'a[href]', 12 do |elements|
162
+ validate_page_numbers [5,1,2,3,4,5,7,8,9,10,11,7], elements
163
+ end
164
+ end
165
+ end
166
+
167
+ def test_no_pagination
168
+ get :list_developers, :per_page => 12
169
+ entries = assigns :developers
170
+ assert_equal 1, entries.page_count
171
+ assert_equal 11, entries.size
172
+
173
+ assert_equal '', @response.body
174
+ end
175
+
176
+ def test_faulty_input_raises_error
177
+ assert_raise WillPaginate::InvalidPage do
178
+ get :list_developers, :page => 'foo'
179
+ end
180
+ end
181
+
182
+ uses_mocha 'helper internals' do
183
+ def test_collection_name_can_be_guessed
184
+ collection = mock
185
+ collection.expects(:page_count).returns(1)
186
+ get :guess_collection_name, {}, :wp => collection
187
+ end
188
+ end
189
+
190
+ def test_inferred_collection_name_raises_error_when_nil
191
+ ex = assert_raise ArgumentError do
192
+ get :guess_collection_name, {}, :wp => nil
193
+ end
194
+ assert ex.message.include?('@developers')
195
+ end
196
+
197
+ def test_setting_id_for_container
198
+ get :list_developers
199
+ assert_select 'div.pagination', 1 do |div|
200
+ assert_nil div.first['id']
201
+ end
202
+ # magic ID
203
+ get :list_developers, {}, :wp => { :id => true }
204
+ assert_select 'div.pagination', 1 do |div|
205
+ assert_equal 'fixnums_pagination', div.first['id']
206
+ end
207
+ # explicit ID
208
+ get :list_developers, {}, :wp => { :id => 'custom_id' }
209
+ assert_select 'div.pagination', 1 do |div|
210
+ assert_equal 'custom_id', div.first['id']
211
+ end
212
+ end
213
+
214
+ protected
215
+
216
+ def validate_page_numbers expected, links, param_name = :page
217
+ param_pattern = /\W#{param_name}=([^&]*)/
218
+
219
+ assert_equal(expected, links.map { |e|
220
+ e['href'] =~ param_pattern
221
+ $1 ? $1.to_i : $1
222
+ })
223
+ end
224
+
225
+ def assert_links_match pattern
226
+ assert_select 'div.pagination a[href]' do |elements|
227
+ elements.each do |el|
228
+ assert_match pattern, el['href']
229
+ end
230
+ end
231
+ end
232
+
233
+ def assert_no_links_match pattern
234
+ assert_select 'div.pagination a[href]' do |elements|
235
+ elements.each do |el|
236
+ assert_no_match pattern, el['href']
237
+ end
238
+ end
239
+ end
240
+ end