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
@@ -1,6 +1,6 @@
1
1
  #---
2
2
  # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
- # We make no guarantees that this code is fit for any purpose.
3
+ # We make no guarantees that this code is fit for any purpose.
4
4
  # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
5
  #---
6
6
  # Settings specified here will take precedence over those in config/environment.rb
@@ -14,7 +14,7 @@ config.cache_classes = false
14
14
  config.whiny_nils = true
15
15
 
16
16
  # Enable the breakpoint server that script/breakpointer connects to
17
- config.breakpoint_server = true
17
+ #config.breakpoint_server = true
18
18
 
19
19
  # Show full error reports and disable caching
20
20
  config.action_controller.consider_all_requests_local = true
@@ -1,45 +1,52 @@
1
- # This file is autogenerated. Instead of editing this file, please use the
2
- # migrations feature of ActiveRecord to incrementally modify your database, and
1
+ # This file is auto-generated from the current state of the database. Instead of editing this file,
2
+ # please use the migrations feature of ActiveRecord to incrementally modify your database, and
3
3
  # then regenerate this schema definition.
4
+ #
5
+ # Note that this schema.rb definition is the authoritative source for your database schema. If you need
6
+ # to create the application database on another system, you should be using db:schema:load, not running
7
+ # all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
8
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
9
+ #
10
+ # It's strongly recommended to check this file into your version control system.
4
11
 
5
12
  ActiveRecord::Schema.define(:version => 7) do
6
13
 
7
14
  create_table "line_items", :force => true do |t|
8
- t.column "product_id", :integer, :null => false
9
- t.column "order_id", :integer, :null => false
10
- t.column "quantity", :integer, :null => false
11
- t.column "total_price", :decimal, :precision => 8, :scale => 2, :null => false
15
+ t.integer "product_id", :null => false
16
+ t.integer "order_id", :null => false
17
+ t.integer "quantity", :null => false
18
+ t.decimal "total_price", :precision => 8, :scale => 2, :null => false
12
19
  end
13
20
 
14
21
  add_index "line_items", ["product_id"], :name => "fk_line_item_products"
15
22
  add_index "line_items", ["order_id"], :name => "fk_line_item_orders"
16
23
 
17
24
  create_table "orders", :force => true do |t|
18
- t.column "name", :string
19
- t.column "address", :text
20
- t.column "email", :string
21
- t.column "pay_type", :string, :limit => 10
25
+ t.string "name"
26
+ t.text "address"
27
+ t.string "email"
28
+ t.string "pay_type", :limit => 10
22
29
  end
23
30
 
24
31
  create_table "products", :force => true do |t|
25
- t.column "title", :string
26
- t.column "description", :text
27
- t.column "image_url", :string
28
- t.column "price", :decimal, :precision => 8, :scale => 2, :default => 0.0
32
+ t.string "title"
33
+ t.text "description"
34
+ t.string "image_url"
35
+ t.decimal "price", :precision => 8, :scale => 2, :default => 0.0
29
36
  end
30
37
 
31
38
  create_table "sessions", :force => true do |t|
32
- t.column "session_id", :string
33
- t.column "data", :text
34
- t.column "updated_at", :datetime
39
+ t.string "session_id"
40
+ t.text "data"
41
+ t.datetime "updated_at"
35
42
  end
36
43
 
37
44
  add_index "sessions", ["session_id"], :name => "index_sessions_on_session_id"
38
45
 
39
46
  create_table "users", :force => true do |t|
40
- t.column "name", :string
41
- t.column "hashed_password", :string
42
- t.column "salt", :string
47
+ t.string "name"
48
+ t.string "hashed_password"
49
+ t.string "salt"
43
50
  end
44
51
 
45
52
  end
@@ -7,11 +7,34 @@ require File.dirname(__FILE__) + '/../test_helper'
7
7
  require 'admin_controller'
8
8
  require 'amrita2/testsupport'
9
9
 
10
- # Re-raise errors caught by the controller.
11
- class AdminController; def rescue_action(e) raise e end; end
10
+ module AdminControllerMixinForTest
11
+ def new_erb
12
+ new
13
+ render :template=>"admin/new.html.erb"
14
+ end
15
+
16
+ def list_erb
17
+ list
18
+ render :template=>"admin/list.html.erb"
19
+ end
20
+
21
+ def show_erb
22
+ show
23
+ render :template=>"admin/show.html.erb"
24
+ end
25
+
26
+ def edit_erb
27
+ edit
28
+ render :template=>"admin/edit.html.erb"
29
+ end
30
+ end
31
+
32
+ class AdminController
33
+ include AdminControllerMixinForTest
34
+ end
35
+
12
36
 
13
37
  class AdminControllerTest < Test::Unit::TestCase
14
- include Amrita2::RailsTestHelper
15
38
  fixtures :products
16
39
 
17
40
  def setup
@@ -20,35 +43,53 @@ class AdminControllerTest < Test::Unit::TestCase
20
43
  @controller = AdminController.new
21
44
  @request = ActionController::TestRequest.new
22
45
  @response = ActionController::TestResponse.new
46
+ ActionView::Base.register_template_handler(:a2, Amrita2View::Base)
23
47
  end
24
48
 
25
49
  def test_new
50
+ login
26
51
  get :new
27
- session[:user_id] = User.find_by_name('u1').id
28
- flash[:notice] = 'Please log in'
29
- compare_result do
30
- get :new
31
- @response.body
32
- end
52
+ amrita2_result = @response.body
53
+ get :new_erb
54
+ erb_result = @response.body
55
+ #puts amrita2_result
56
+ #puts erb_result
57
+ assert_equal_as_xml(erb_result, amrita2_result)
33
58
  end
34
59
 
35
60
  def test_list
36
- get :new
37
- session[:user_id] = User.find_by_name('u1').id
38
- flash[:notice] = 'Please log in'
39
- compare_result do
40
- get :list
41
- @response.body
42
- end
61
+ login
62
+ get :list
63
+ amrita2_result = @response.body
64
+ get :list_erb
65
+ erb_result = @response.body
66
+ assert_equal_as_xml(erb_result, amrita2_result)
43
67
  end
44
68
 
45
69
  def test_show
46
- get :new
70
+ login
71
+ get :show, :id=>1
72
+ amrita2_result = @response.body
73
+ get :show_erb, :id=>1
74
+ erb_result = @response.body
75
+ assert_equal_as_xml(erb_result, amrita2_result)
76
+ end
77
+
78
+ def test_edit
79
+ login
80
+ get :edit, :id=>1
81
+ amrita2_result = @response.body
82
+ get :edit_erb, :id=>1
83
+ erb_result = @response.body
84
+ #puts amrita2_result
85
+ #puts erb_result
86
+ assert_equal_as_xml(erb_result, amrita2_result)
87
+ end
88
+
89
+ private
90
+ def login
91
+ get :new # dummy
47
92
  session[:user_id] = User.find_by_name('u1').id
48
- flash[:notice] = 'Please log in'
49
- compare_result do
50
- get :show, :id=>1
51
- @response.body
52
- end
93
+ flash[:notice] = nil
53
94
  end
54
95
  end
@@ -7,25 +7,40 @@ require File.dirname(__FILE__) + '/../test_helper'
7
7
  require 'amrita2/testsupport'
8
8
  require 'store_controller'
9
9
 
10
- # Re-raise errors caught by the controller.
11
- class StoreController; def rescue_action(e) raise e end; end
10
+ module StoreControllerMixinForTest
11
+ def index_erb
12
+ index
13
+ render :template=>'store/index.html.erb', :layout=>'store.rhtml'
14
+ end
15
+
16
+ def checkout_erb
17
+ checkout
18
+ render :template=>'store/checkout.html.erb', :layout=>'store.rhtml'
19
+ end
20
+ end
21
+
22
+ class StoreController
23
+ include StoreControllerMixinForTest
24
+ end
12
25
 
13
26
  class StoreControllerTest < Test::Unit::TestCase
14
- include Amrita2::RailsTestHelper
15
27
  fixtures :products
16
28
 
17
29
  def setup
18
30
  @controller = StoreController.new
19
31
  @request = ActionController::TestRequest.new
20
32
  @response = ActionController::TestResponse.new
33
+ ActionView::Base.register_template_handler(:a2, Amrita2View::Base)
21
34
  end
22
35
 
23
36
  def test_index
24
- compare_result do
25
- get :index
26
- assert_response(:success)
27
- @response.body
28
- end
37
+ get :index_erb
38
+ erb_result = @response.body
39
+ #puts erb_result
40
+ get :index
41
+ amrita2_result = @response.body
42
+ #puts amrita2_result
43
+ assert_equal_as_xml(erb_result, amrita2_result)
29
44
  end
30
45
 
31
46
  def test_post_to_add_to_cart
@@ -35,11 +50,7 @@ class StoreControllerTest < Test::Unit::TestCase
35
50
 
36
51
  post :add_to_cart, :id=>ruby_id
37
52
 
38
- compare_result do
39
- get :index
40
- assert_response(:success)
41
- @response.body
42
- end
53
+ test_index
43
54
  end
44
55
 
45
56
  def test_checkout
@@ -47,11 +58,12 @@ class StoreControllerTest < Test::Unit::TestCase
47
58
  get :index
48
59
  post :add_to_cart, :id=>ruby_id
49
60
 
50
- compare_result do
51
- get :checkout
52
- assert_response(:success)
53
- @response.body
54
- end
61
+ get :checkout
62
+ amrita2_result = @response.body
63
+ #puts amrita2_result
64
+ get :checkout_erb
65
+ erb_result = @response.body
66
+ assert_equal_as_xml(erb_result, amrita2_result)
55
67
  end
56
68
 
57
69
  end
@@ -0,0 +1,4 @@
1
+ unless ActiveRecord::Base.respond_to? :paginate
2
+ require 'will_paginate'
3
+ WillPaginate.enable
4
+ end
@@ -0,0 +1,61 @@
1
+ require 'active_support'
2
+
3
+ # = You *will* paginate!
4
+ #
5
+ # First read about WillPaginate::Finder::ClassMethods, then see
6
+ # WillPaginate::ViewHelpers. The magical array you're handling in-between is
7
+ # WillPaginate::Collection.
8
+ #
9
+ # Happy paginating!
10
+ module WillPaginate
11
+ class << self
12
+ # shortcut for <tt>enable_actionpack; enable_activerecord</tt>
13
+ def enable
14
+ enable_actionpack
15
+ enable_activerecord
16
+ end
17
+
18
+ # mixes in WillPaginate::ViewHelpers in ActionView::Base
19
+ def enable_actionpack
20
+ return if ActionView::Base.instance_methods.include? 'will_paginate'
21
+ require 'will_paginate/view_helpers'
22
+ ActionView::Base.class_eval { include ViewHelpers }
23
+ end
24
+
25
+ # mixes in WillPaginate::Finder in ActiveRecord::Base and classes that deal
26
+ # with associations
27
+ def enable_activerecord
28
+ return if ActiveRecord::Base.respond_to? :paginate
29
+ require 'will_paginate/finder'
30
+ ActiveRecord::Base.class_eval { include Finder }
31
+
32
+ associations = ActiveRecord::Associations
33
+ collection = associations::AssociationCollection
34
+
35
+ # to support paginating finders on associations, we have to mix in the
36
+ # method_missing magic from WillPaginate::Finder::ClassMethods to AssociationProxy
37
+ # subclasses, but in a different way for Rails 1.2.x and 2.0
38
+ (collection.instance_methods.include?(:create!) ?
39
+ collection : collection.subclasses.map(&:constantize)
40
+ ).push(associations::HasManyThroughAssociation).each do |klass|
41
+ klass.class_eval do
42
+ include Finder::ClassMethods
43
+ alias_method_chain :method_missing, :paginate
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ module Deprecation #:nodoc:
50
+ extend ActiveSupport::Deprecation
51
+
52
+ def self.warn(message, callstack = caller)
53
+ message = 'WillPaginate: ' + message.strip.gsub(/ {3,}/, ' ')
54
+ behavior.call(message, callstack) if behavior && !silenced?
55
+ end
56
+
57
+ def self.silenced?
58
+ ActiveSupport::Deprecation.silenced?
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,132 @@
1
+ require 'will_paginate'
2
+
3
+ module WillPaginate
4
+ # = OMG, invalid page number!
5
+ # This is an ArgumentError raised in case a page was requested that is either
6
+ # zero or negative number. You should decide how do deal with such errors in
7
+ # the controller.
8
+ #
9
+ # This error is *not* raised when a page further than the last page is
10
+ # requested. Use <tt>WillPaginate::Collection#out_of_bounds?</tt> method to
11
+ # check for those cases and manually deal with them as you see fit.
12
+ class InvalidPage < ArgumentError
13
+ def initialize(page, page_num)
14
+ super "#{page.inspect} given as value, which translates to '#{page_num}' as page number"
15
+ end
16
+ end
17
+
18
+ # Arrays returned from paginating finds are, in fact, instances of this.
19
+ # You may think of WillPaginate::Collection as an ordinary array with some
20
+ # extra properties. Those properties are used by view helpers to generate
21
+ # correct page links.
22
+ #
23
+ # WillPaginate::Collection also assists in rolling out your own pagination
24
+ # solutions: see +create+.
25
+ #
26
+ class Collection < Array
27
+ attr_reader :current_page, :per_page, :total_entries
28
+
29
+ # Arguments to this constructor are the current page number, per-page limit
30
+ # and the total number of entries. The last argument is optional because it
31
+ # is best to do lazy counting; in other words, count *conditionally* after
32
+ # populating the collection using the +replace+ method.
33
+ #
34
+ def initialize(page, per_page, total = nil)
35
+ @current_page = page.to_i
36
+ raise InvalidPage.new(page, @current_page) if @current_page < 1
37
+ @per_page = per_page.to_i
38
+ raise ArgumentError, "`per_page` setting cannot be less than 1 (#{@per_page} given)" if @per_page < 1
39
+
40
+ self.total_entries = total if total
41
+ end
42
+
43
+ # Just like +new+, but yields the object after instantiation and returns it
44
+ # afterwards. This is very useful for manual pagination:
45
+ #
46
+ # @entries = WillPaginate::Collection.create(1, 10) do |pager|
47
+ # result = Post.find(:all, :limit => pager.per_page, :offset => pager.offset)
48
+ # # inject the result array into the paginated collection:
49
+ # pager.replace(result)
50
+ #
51
+ # unless pager.total_entries
52
+ # # the pager didn't manage to guess the total count, do it manually
53
+ # pager.total_entries = Post.count
54
+ # end
55
+ # end
56
+ #
57
+ # The possibilities with this are endless. For another example, here is how
58
+ # WillPaginate used to define pagination for Array instances:
59
+ #
60
+ # Array.class_eval do
61
+ # def paginate(page = 1, per_page = 15)
62
+ # WillPaginate::Collection.create(page, per_page, size) do |pager|
63
+ # pager.replace self[pager.offset, pager.per_page].to_a
64
+ # end
65
+ # end
66
+ # end
67
+ #
68
+ def self.create(page, per_page, total = nil, &block)
69
+ pager = new(page, per_page, total)
70
+ yield pager
71
+ pager
72
+ end
73
+
74
+ # The total number of pages.
75
+ def page_count
76
+ @total_pages
77
+ end
78
+
79
+ # Helper method that is true when someone tries to fetch a page with a
80
+ # larger number than the last page. Can be used in combination with flashes
81
+ # and redirecting.
82
+ def out_of_bounds?
83
+ current_page > page_count
84
+ end
85
+
86
+ # Current offset of the paginated collection. If we're on the first page,
87
+ # it is always 0. If we're on the 2nd page and there are 30 entries per page,
88
+ # the offset is 30. This property is useful if you want to render ordinals
89
+ # besides your records: simply start with offset + 1.
90
+ #
91
+ def offset
92
+ (current_page - 1) * per_page
93
+ end
94
+
95
+ # current_page - 1 or nil if there is no previous page
96
+ def previous_page
97
+ current_page > 1 ? (current_page - 1) : nil
98
+ end
99
+
100
+ # current_page + 1 or nil if there is no next page
101
+ def next_page
102
+ current_page < page_count ? (current_page + 1) : nil
103
+ end
104
+
105
+ def total_entries=(number)
106
+ @total_entries = number.to_i
107
+ @total_pages = (@total_entries / per_page.to_f).ceil
108
+ end
109
+
110
+ # This is a magic wrapper for the original Array#replace method. It serves
111
+ # for populating the paginated collection after initialization.
112
+ #
113
+ # Why magic? Because it tries to guess the total number of entries judging
114
+ # by the size of given array. If it is shorter than +per_page+ limit, then we
115
+ # know we're on the last page. This trick is very useful for avoiding
116
+ # unnecessary hits to the database to do the counting after we fetched the
117
+ # data for the current page.
118
+ #
119
+ # However, after using +replace+ you should always test the value of
120
+ # +total_entries+ and set it to a proper value if it's +nil+. See the example
121
+ # in +create+.
122
+ def replace(array)
123
+ returning super do
124
+ # The collection is shorter then page limit? Rejoice, because
125
+ # then we know that we are on the last page!
126
+ if total_entries.nil? and length > 0 and length < per_page
127
+ self.total_entries = offset + length
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end