amrita2 1.9.6 → 2.0.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.
Files changed (112) hide show
  1. data/README +112 -0
  2. data/init.rb +6 -0
  3. data/lib/amrita2/gettext.rb +116 -0
  4. data/lib/amrita2/macro.rb +153 -0
  5. data/lib/amrita2/rails_bridge.rb +172 -26
  6. data/lib/amrita2/template.rb +2634 -234
  7. data/lib/amrita2/testsupport.rb +171 -0
  8. data/lib/amrita2/version.rb +3 -3
  9. data/lib/amrita2.rb +1 -0
  10. data/sample/depot/app/controllers/admin_controller.rb +59 -0
  11. data/sample/depot/app/controllers/application.rb +20 -0
  12. data/sample/depot/app/controllers/info_controller.rb +19 -0
  13. data/sample/depot/app/controllers/login_controller.rb +85 -0
  14. data/sample/depot/app/controllers/store_controller.rb +68 -0
  15. data/sample/depot/app/helpers/admin_helper.rb +7 -0
  16. data/sample/depot/app/helpers/application_helper.rb +10 -0
  17. data/sample/depot/app/helpers/ar_form.rb +169 -0
  18. data/sample/depot/app/helpers/form_tag.rb +24 -0
  19. data/sample/depot/app/helpers/info_helper.rb +7 -0
  20. data/sample/depot/app/helpers/standard_form.rb +73 -0
  21. data/sample/depot/app/helpers/store_helper.rb +14 -0
  22. data/sample/depot/app/models/cart.rb +36 -0
  23. data/sample/depot/app/models/cart_item.rb +26 -0
  24. data/sample/depot/app/models/line_item.rb +34 -0
  25. data/sample/depot/app/models/order.rb +57 -0
  26. data/sample/depot/app/models/product.rb +41 -0
  27. data/sample/depot/app/models/user.rb +83 -0
  28. data/sample/depot/config/boot.rb +49 -0
  29. data/sample/depot/config/environment.rb +83 -0
  30. data/sample/depot/config/environments/development.rb +24 -0
  31. data/sample/depot/config/environments/production.rb +24 -0
  32. data/sample/depot/config/environments/test.rb +24 -0
  33. data/sample/depot/config/routes.rb +10 -0
  34. data/sample/depot/db/migrate/001_create_products.rb +18 -0
  35. data/sample/depot/db/migrate/002_add_price.rb +14 -0
  36. data/sample/depot/db/migrate/003_add_test_data.rb +68 -0
  37. data/sample/depot/db/migrate/004_add_sessions.rb +20 -0
  38. data/sample/depot/db/migrate/005_create_orders.rb +21 -0
  39. data/sample/depot/db/migrate/006_create_line_items.rb +27 -0
  40. data/sample/depot/db/migrate/007_create_users.rb +18 -0
  41. data/sample/depot/db/schema.rb +45 -0
  42. data/sample/depot/public/dispatch.rb +15 -0
  43. data/sample/depot/test/functional/admin_controller_test.rb +54 -0
  44. data/sample/depot/test/functional/info_controller_test.rb +23 -0
  45. data/sample/depot/test/functional/login_controller_test.rb +74 -0
  46. data/sample/depot/test/functional/store_controller_test.rb +57 -0
  47. data/sample/depot/test/integration/dsl_user_stories_test.rb +126 -0
  48. data/sample/depot/test/integration/user_stories_test.rb +70 -0
  49. data/sample/depot/test/performance/order_speed_test.rb +58 -0
  50. data/sample/depot/test/test_helper.rb +16 -0
  51. data/sample/depot/test/unit/cart_test.rb +39 -0
  52. data/sample/depot/test/unit/cart_test1.rb +31 -0
  53. data/sample/depot/test/unit/line_item_test.rb +15 -0
  54. data/sample/depot/test/unit/order_test.rb +15 -0
  55. data/sample/depot/test/unit/product_test.rb +98 -0
  56. data/sample/depot/vendor/plugins/amrita2/init.rb +6 -0
  57. data/sample/hello/hello.rb +22 -0
  58. data/sample/login_engine/app/controllers/application.rb +16 -0
  59. data/sample/login_engine/app/controllers/user_controller.rb +265 -0
  60. data/sample/login_engine/app/helpers/application_helper.rb +3 -0
  61. data/sample/login_engine/app/helpers/form_tag.rb +16 -0
  62. data/sample/login_engine/app/helpers/two_columns.rb +24 -0
  63. data/sample/login_engine/app/helpers/two_columns_form.rb +47 -0
  64. data/sample/login_engine/app/helpers/user_helper.rb +88 -0
  65. data/sample/login_engine/app/models/user.rb +7 -0
  66. data/sample/login_engine/app/models/user_notify.rb +75 -0
  67. data/sample/login_engine/config/boot.rb +45 -0
  68. data/sample/login_engine/config/environment.rb +140 -0
  69. data/sample/login_engine/config/environments/development.rb +21 -0
  70. data/sample/login_engine/config/environments/production.rb +18 -0
  71. data/sample/login_engine/config/environments/test.rb +19 -0
  72. data/sample/login_engine/config/routes.rb +23 -0
  73. data/sample/login_engine/db/migrate/001_create_users.rb +25 -0
  74. data/sample/login_engine/db/schema.rb +25 -0
  75. data/sample/login_engine/lib/config.rb +113 -0
  76. data/sample/login_engine/lib/hpricot_test_extension.rb +80 -0
  77. data/sample/login_engine/lib/login_engine/authenticated_system.rb +113 -0
  78. data/sample/login_engine/lib/login_engine/authenticated_user.rb +155 -0
  79. data/sample/login_engine/lib/login_engine.rb +62 -0
  80. data/sample/login_engine/public/dispatch.rb +10 -0
  81. data/sample/login_engine/test/functional/amrita2_test.rb +267 -0
  82. data/sample/login_engine/test/functional/user_controller_test.rb +544 -0
  83. data/sample/login_engine/test/mocks/mail.rb +14 -0
  84. data/sample/login_engine/test/mocks/time.rb +19 -0
  85. data/sample/login_engine/test/test_helper.rb +31 -0
  86. data/sample/login_engine/test/unit/user_test.rb +116 -0
  87. data/sample/login_engine/vendor/plugins/amrita2/init.rb +6 -0
  88. data/specs/attribute.rb +201 -0
  89. data/specs/datatypes.rb +231 -0
  90. data/specs/dictionary.rb +68 -0
  91. data/specs/erb_cdata.rb +187 -0
  92. data/specs/filters.rb +513 -0
  93. data/specs/gettext/erb_gettext.rb +42 -0
  94. data/specs/gettext/gettext_util.rb +65 -0
  95. data/specs/gettext/static_text.rb +103 -0
  96. data/specs/impl/code_generator.rb +87 -0
  97. data/specs/impl/dynamic_element.rb +92 -0
  98. data/specs/impl/hash_delegator.rb +57 -0
  99. data/specs/impl/parse_opt.rb +34 -0
  100. data/specs/impl/preprocess.rb +823 -0
  101. data/specs/impl/testsupport.rb +89 -0
  102. data/specs/inlineruby.rb +429 -0
  103. data/specs/intro.rb +654 -0
  104. data/specs/loop.rb +203 -0
  105. data/specs/macro.rb +532 -0
  106. data/specs/sample.rb +34 -0
  107. data/specs/sanitize.rb +110 -0
  108. data/specs/template.rb +189 -0
  109. data/specs/trace.rb +97 -0
  110. metadata +138 -19
  111. data/lib/amrita2/core.rb +0 -1897
  112. data/lib/amrita2/rd.rb +0 -314
@@ -0,0 +1,73 @@
1
+
2
+ class StandardForm < Amrita2::Macro::Base
3
+ TemplateText = <<-END_OF_TEMPLATE
4
+ <<fieldset<
5
+ <<legend:title>>
6
+ <%%= form_tag(<%= $_[:url].inspect %>) %%>
7
+ <<:header>>
8
+ <<p:items<
9
+ <<label:label|Attr[:for]<
10
+ <<:text>>:
11
+ <<:input>>
12
+ <<:fotter>>
13
+ <%%= '</form>' %%>
14
+
15
+ END_OF_TEMPLATE
16
+
17
+ def macro_data(element)
18
+ root = element.as_amrita_dictionary
19
+ record = root[:record].intern
20
+ title = element.search("form_title").first
21
+ url = element.search("url").first
22
+ header = element.search("header").first
23
+ items = element.search("tr").collect do |tr|
24
+ tr_to_data(record, tr)
25
+ end
26
+ fotter = element.search("fotter").first
27
+
28
+ ret = {
29
+ :title => title.contents,
30
+ :record => record,
31
+ :url => url ? url.as_amrita_dictionary : {},
32
+ :header => header.contents,
33
+ :items => items,
34
+ :fotter => fotter.contents
35
+ }
36
+ ret
37
+ end
38
+
39
+ def tr_to_data(record, tr)
40
+ label = tr.search("th").first
41
+ td = tr.search("td").first
42
+ input = td_to_input(record, td) || { }
43
+ {
44
+ :label => {
45
+ :for => "#{record}_#{input[:field_id]}",
46
+ :text => label.contents.strip,
47
+ },
48
+ :input => input[:input]
49
+ }
50
+ end
51
+
52
+ def td_to_input(record, td)
53
+ x = td.children.find { |c| c.kind_of?(Hpricot::Elem) }
54
+ raise "input was not found in <td>" unless x
55
+ attr = x.as_amrita_dictionary
56
+ field_id = attr.delete(:id)
57
+ input = case x.name
58
+ when "text"
59
+ "<%= text_field #{record.to_s.inspect}, #{field_id.to_s.inspect}, #{attr.inspect} %>"
60
+ when "text_area"
61
+ "<%= text_area #{record.to_s.inspect}, #{field_id.to_s.inspect}, #{attr.inspect} %>"
62
+ when "field"
63
+ x.contents
64
+ else
65
+ raise "unknown input field #{x.name} "
66
+ end
67
+ {
68
+ :input => Amrita2::SanitizedString[input],
69
+ :field_id => field_id
70
+ }
71
+ end
72
+ end
73
+
@@ -0,0 +1,14 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ module StoreHelper
7
+
8
+ def hidden_div_if(condition, attributes = {}, &block)
9
+ if condition
10
+ attributes["style"] = "display: none"
11
+ end
12
+ content_tag("div", attributes, &block)
13
+ end
14
+ end
@@ -0,0 +1,36 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ class Cart
7
+ include Amrita2::DictionaryData
8
+
9
+ attr_reader :items
10
+
11
+ def initialize
12
+ @items = []
13
+ end
14
+
15
+
16
+ def add_product(product)
17
+ current_item = @items.find {|item| item.product == product}
18
+ if current_item
19
+ current_item.increment_quantity
20
+ else
21
+ current_item = CartItem.new(product)
22
+ @items << current_item
23
+ end
24
+ current_item
25
+ end
26
+
27
+
28
+ def total_items
29
+ @items.sum { |item| item.quantity }
30
+ end
31
+
32
+
33
+ def total_price
34
+ @items.sum { |item| item.price }
35
+ end
36
+ end
@@ -0,0 +1,26 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ class CartItem
7
+
8
+ attr_reader :product, :quantity
9
+
10
+ def initialize(product)
11
+ @product = product
12
+ @quantity = 1
13
+ end
14
+
15
+ def increment_quantity
16
+ @quantity += 1
17
+ end
18
+
19
+ def title
20
+ @product.title
21
+ end
22
+
23
+ def price
24
+ @product.price * @quantity
25
+ end
26
+ end
@@ -0,0 +1,34 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ # Schema as of June 12, 2006 15:45 (schema version 7)
7
+ #
8
+ # Table name: line_items
9
+ #
10
+ # id :integer(11) not null, primary key
11
+ # product_id :integer(11) default(0), not null
12
+ # order_id :integer(11) default(0), not null
13
+ # quantity :integer(11) default(0), not null
14
+ # total_price :integer(11) default(0), not null
15
+ #
16
+
17
+
18
+ class LineItem < ActiveRecord::Base
19
+
20
+ belongs_to :order
21
+ belongs_to :product
22
+
23
+
24
+ def self.from_cart_item(cart_item)
25
+ li = self.new
26
+ li.product = cart_item.product
27
+ li.quantity = cart_item.quantity
28
+ li.total_price = cart_item.price
29
+ li
30
+ end
31
+
32
+
33
+ end
34
+
@@ -0,0 +1,57 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ # Schema as of June 12, 2006 15:45 (schema version 7)
7
+ #
8
+ # Table name: orders
9
+ #
10
+ # id :integer(11) not null, primary key
11
+ # name :string(255)
12
+ # address :text
13
+ # email :string(255)
14
+ # pay_type :string(10)
15
+ #
16
+
17
+
18
+
19
+
20
+ class Order < ActiveRecord::Base
21
+
22
+
23
+
24
+ has_many :line_items
25
+
26
+
27
+
28
+ PAYMENT_TYPES = [
29
+ # Displayed stored in db
30
+ [ "Check", "check" ],
31
+ [ "Credit card", "cc" ],
32
+ [ "Purchase order", "po" ]
33
+ ]
34
+
35
+ # ...
36
+
37
+
38
+
39
+ validates_presence_of :name, :address, :email, :pay_type
40
+ validates_inclusion_of :pay_type, :in => PAYMENT_TYPES.map {|disp, value| value}
41
+
42
+ # ...
43
+
44
+
45
+
46
+ def add_line_items_from_cart(cart)
47
+ cart.items.each do |item|
48
+ li = LineItem.from_cart_item(item)
49
+ line_items << li
50
+ end
51
+ end
52
+
53
+
54
+
55
+
56
+ end
57
+
@@ -0,0 +1,41 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ # Schema as of June 12, 2006 15:45 (schema version 7)
7
+ #
8
+ # Table name: products
9
+ #
10
+ # id :integer(11) not null, primary key
11
+ # title :string(255)
12
+ # description :text
13
+ # image_url :string(255)
14
+ # price :integer(11) default(0)
15
+ #
16
+
17
+
18
+ class Product < ActiveRecord::Base
19
+
20
+ has_many :orders, :through => :line_items
21
+
22
+ has_many :line_items
23
+
24
+ def self.find_products_for_sale
25
+ find(:all, :order => "title")
26
+ end
27
+
28
+ validates_presence_of :title, :description, :image_url
29
+ validates_numericality_of :price
30
+ validates_uniqueness_of :title
31
+ validates_format_of :image_url,
32
+ :with => %r{\.(gif|jpg|png)$}i,
33
+ :message => "must be a URL for a GIF, JPG, or PNG image"
34
+ protected
35
+
36
+ def validate
37
+ errors.add(:price, "should be at least 0.01") if price.nil? || price < 0.01
38
+ end
39
+ end
40
+
41
+
@@ -0,0 +1,83 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ # Schema as of June 12, 2006 15:45 (schema version 7)
7
+ #
8
+ # Table name: users
9
+ #
10
+ # id :integer(11) not null, primary key
11
+ # name :string(255)
12
+ # hashed_password :string(255)
13
+ # salt :string(255)
14
+ #
15
+
16
+ require 'digest/sha1'
17
+
18
+
19
+ class User < ActiveRecord::Base
20
+
21
+ validates_presence_of :name
22
+ validates_uniqueness_of :name
23
+
24
+ attr_accessor :password_confirmation
25
+ validates_confirmation_of :password
26
+
27
+ def validate
28
+ errors.add_to_base("Missing password") if hashed_password.blank?
29
+ end
30
+
31
+
32
+
33
+ def self.authenticate(name, password)
34
+ user = self.find_by_name(name)
35
+ if user
36
+ expected_password = encrypted_password(password, user.salt)
37
+ if user.hashed_password != expected_password
38
+ user = nil
39
+ end
40
+ end
41
+ user
42
+ end
43
+
44
+
45
+ # 'password' is a virtual attribute
46
+
47
+ def password
48
+ @password
49
+ end
50
+
51
+ def password=(pwd)
52
+ @password = pwd
53
+ return if pwd.blank?
54
+ create_new_salt
55
+ self.hashed_password = User.encrypted_password(self.password, self.salt)
56
+ end
57
+
58
+
59
+
60
+ def after_destroy
61
+ if User.count.zero?
62
+ raise "Can't delete last user"
63
+ end
64
+ end
65
+
66
+
67
+ private
68
+
69
+
70
+ def create_new_salt
71
+ self.salt = self.object_id.to_s + rand.to_s
72
+ end
73
+
74
+
75
+
76
+ def self.encrypted_password(password, salt)
77
+ string_to_hash = password + "wibble" + salt
78
+ Digest::SHA1.hexdigest(string_to_hash)
79
+ end
80
+
81
+
82
+ end
83
+
@@ -0,0 +1,49 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ # Don't change this file. Configuration is done in config/environment.rb and config/environments/*.rb
7
+
8
+ unless defined?(RAILS_ROOT)
9
+ root_path = File.join(File.dirname(__FILE__), '..')
10
+
11
+ unless RUBY_PLATFORM =~ /mswin32/
12
+ require 'pathname'
13
+ root_path = Pathname.new(root_path).cleanpath(true).to_s
14
+ end
15
+
16
+ RAILS_ROOT = root_path
17
+ end
18
+
19
+ unless defined?(Rails::Initializer)
20
+ if File.directory?("#{RAILS_ROOT}/vendor/rails")
21
+ require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
22
+ else
23
+ require 'rubygems'
24
+
25
+ environment_without_comments = IO.readlines(File.dirname(__FILE__) + '/environment.rb').reject { |l| l =~ /^#/ }.join
26
+ environment_without_comments =~ /[^#]RAILS_GEM_VERSION = '([\d.]+)'/
27
+ rails_gem_version = $1
28
+
29
+ if version = defined?(RAILS_GEM_VERSION) ? RAILS_GEM_VERSION : rails_gem_version
30
+ rails_gem = Gem.cache.search('rails', "=#{version}").first
31
+
32
+ if rails_gem
33
+ require_gem "rails", "=#{version}"
34
+ require rails_gem.full_gem_path + '/lib/initializer'
35
+ else
36
+ STDERR.puts %(Cannot find gem for Rails =#{version}:
37
+ Install the missing gem with 'gem install -v=#{version} rails', or
38
+ change environment.rb to define RAILS_GEM_VERSION with your desired version.
39
+ )
40
+ exit 1
41
+ end
42
+ else
43
+ gem "rails"
44
+ require 'initializer'
45
+ end
46
+ end
47
+
48
+ Rails::Initializer.run(:set_load_path)
49
+ end
@@ -0,0 +1,83 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ # Be sure to restart your web server when you modify this file.
7
+
8
+ # Uncomment below to force Rails into production mode when
9
+ # you don't control web/app server and can't set it the proper way
10
+ # ENV['RAILS_ENV'] ||= 'production'
11
+
12
+ # Bootstrap the Rails environment, frameworks, and default configuration
13
+ require File.join(File.dirname(__FILE__), 'boot')
14
+
15
+ Rails::Initializer.run do |config|
16
+ # Settings in config/environments/* take precedence those specified here
17
+
18
+ # Skip frameworks you're not going to use
19
+ # config.frameworks -= [ :action_web_service, :action_mailer ]
20
+
21
+ # Add additional load paths for your own custom dirs
22
+ # config.load_paths += %W( #{RAILS_ROOT}/extras )
23
+
24
+ # Force all environments to use the same logger level
25
+ # (by default production uses :info, the others :debug)
26
+ # config.log_level = :debug
27
+
28
+ # Use the database for sessions instead of the file system
29
+ # (create the session table with 'rake create_sessions_table')
30
+ config.action_controller.session_store = :active_record_store
31
+
32
+ # Use SQL instead of Active Record's schema dumper when creating the test database.
33
+ # This is necessary if your schema can't be completely dumped by the schema dumper,
34
+ # like if you have constraints or database-specific column types
35
+ # config.active_record.schema_format = :sql
36
+
37
+ # Activate observers that should always be running
38
+ # config.active_record.observers = :cacher, :garbage_collector
39
+
40
+ # Make Active Record use UTC-base instead of local time
41
+ # config.active_record.default_timezone = :utc
42
+
43
+ # See Rails::Configuration for more options
44
+ end
45
+
46
+ # Add new inflection rules using the following format
47
+ # (all these examples are active by default):
48
+ # Inflector.inflections do |inflect|
49
+ # inflect.plural /^(ox)$/i, '\1en'
50
+ # inflect.singular /^(ox)en/i, '\1'
51
+ # inflect.irregular 'person', 'people'
52
+ # inflect.uncountable %w( fish sheep )
53
+ # end
54
+
55
+ # Include your application configuration below
56
+
57
+ module PriceHelper
58
+ include ActionView::Helpers::NumberHelper
59
+ def to_currency
60
+ number_to_currency(self)
61
+ end
62
+ end
63
+
64
+ class BigDecimal
65
+ include PriceHelper
66
+ end
67
+
68
+ class Integer
69
+ include PriceHelper
70
+ end
71
+
72
+ module StringHelper
73
+ include ActionView::Helpers::TextHelper
74
+ def truncate
75
+ super(self, 80).to_s
76
+ end
77
+ end
78
+
79
+ class String
80
+ include StringHelper
81
+ end
82
+
83
+ require 'amrita2/macro'
@@ -0,0 +1,24 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ # Settings specified here will take precedence over those in config/environment.rb
7
+
8
+ # In the development environment your application's code is reloaded on
9
+ # every request. This slows down response time but is perfect for development
10
+ # since you don't have to restart the webserver when you make code changes.
11
+ config.cache_classes = false
12
+
13
+ # Log error messages when you accidentally call methods on nil.
14
+ config.whiny_nils = true
15
+
16
+ # Enable the breakpoint server that script/breakpointer connects to
17
+ config.breakpoint_server = true
18
+
19
+ # Show full error reports and disable caching
20
+ config.action_controller.consider_all_requests_local = true
21
+ config.action_controller.perform_caching = false
22
+
23
+ # Don't care if the mailer can't send
24
+ config.action_mailer.raise_delivery_errors = false
@@ -0,0 +1,24 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ # Settings specified here will take precedence over those in config/environment.rb
7
+
8
+ # The production environment is meant for finished, "live" apps.
9
+ # Code is not reloaded between requests
10
+ config.cache_classes = true
11
+
12
+ # Use a different logger for distributed setups
13
+ # config.logger = SyslogLogger.new
14
+
15
+
16
+ # Full error reports are disabled and caching is turned on
17
+ config.action_controller.consider_all_requests_local = false
18
+ config.action_controller.perform_caching = true
19
+
20
+ # Enable serving of images, stylesheets, and javascripts from an asset server
21
+ # config.action_controller.asset_host = "http://assets.example.com"
22
+
23
+ # Disable delivery errors if you bad email addresses should just be ignored
24
+ # config.action_mailer.raise_delivery_errors = false
@@ -0,0 +1,24 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ # Settings specified here will take precedence over those in config/environment.rb
7
+
8
+ # The test environment is used exclusively to run your application's
9
+ # test suite. You never need to work with it otherwise. Remember that
10
+ # your test database is "scratch space" for the test suite and is wiped
11
+ # and recreated between test runs. Don't rely on the data there!
12
+ config.cache_classes = true
13
+
14
+ # Log error messages when you accidentally call methods on nil.
15
+ config.whiny_nils = true
16
+
17
+ # Show full error reports and disable caching
18
+ config.action_controller.consider_all_requests_local = true
19
+ config.action_controller.perform_caching = false
20
+
21
+ # Tell ActionMailer not to deliver emails to the real world.
22
+ # The :test delivery method accumulates sent emails in the
23
+ # ActionMailer::Base.deliveries array.
24
+ config.action_mailer.delivery_method = :test
@@ -0,0 +1,10 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ ActionController::Routing::Routes.draw do |map|
7
+ map.connect ':controller/service.wsdl', :action => 'wsdl'
8
+ map.connect ':controller/:action/:id'
9
+ map.connect ':controller/:action/:id.:format'
10
+ end
@@ -0,0 +1,18 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ class CreateProducts < ActiveRecord::Migration
7
+ def self.up
8
+ create_table :products do |t|
9
+ t.column :title, :string
10
+ t.column :description, :text
11
+ t.column :image_url, :string
12
+ end
13
+ end
14
+
15
+ def self.down
16
+ drop_table :products
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+ class AddPrice < ActiveRecord::Migration
7
+ def self.up
8
+ add_column :products, :price, :decimal, :precision => 8, :scale => 2, :default => 0
9
+ end
10
+
11
+ def self.down
12
+ remove_column :products, :price
13
+ end
14
+ end
@@ -0,0 +1,68 @@
1
+ #---
2
+ # Excerpted from "Agile Web Development with Rails, 2nd Ed."
3
+ # We make no guarantees that this code is fit for any purpose.
4
+ # Visit http://www.pragmaticprogrammer.com/titles/rails2 for more book information.
5
+ #---
6
+
7
+ class AddTestData < ActiveRecord::Migration
8
+ def self.up
9
+ Product.delete_all
10
+
11
+ Product.create(:title => 'Pragmatic Project Automation',
12
+ :description =>
13
+ %{<p>
14
+ <em>Pragmatic Project Automation</em> shows you how to improve the
15
+ consistency and repeatability of your project's procedures using
16
+ automation to reduce risk and errors.
17
+ </p>
18
+ <p>
19
+ Simply put, we're going to put this thing called a computer to work
20
+ for you doing the mundane (but important) project stuff. That means
21
+ you'll have more time and energy to do the really
22
+ exciting---and difficult---stuff, like writing quality code.
23
+ </p>},
24
+ :image_url => '/images/auto.jpg',
25
+ :price => 29.95)
26
+
27
+
28
+ Product.create(:title => 'Pragmatic Version Control',
29
+ :description =>
30
+ %{<p>
31
+ This book is a recipe-based approach to using Subversion that will
32
+ get you up and
33
+ running quickly---and correctly. All projects need version control:
34
+ it's a foundational piece of any project's infrastructure. Yet half
35
+ of all project teams in the U.S. don't use any version control at all.
36
+ Many others don't use it well, and end up experiencing time-consuming problems.
37
+ </p>},
38
+ :image_url => '/images/svn.jpg',
39
+ :price => 28.50)
40
+ # . . .
41
+
42
+
43
+ Product.create(:title => 'Pragmatic Unit Testing (C#)',
44
+ :description =>
45
+ %{<p>
46
+ Pragmatic programmers use feedback to drive their development and
47
+ personal processes. The most valuable feedback you can get while
48
+ coding comes from unit testing.
49
+ </p>
50
+ <p>
51
+ Without good tests in place, coding can become a frustrating game of
52
+ "whack-a-mole." That's the carnival game where the player strikes at a
53
+ mechanical mole; it retreats and another mole pops up on the opposite side
54
+ of the field. The moles pop up and down so fast that you end up flailing
55
+ your mallet helplessly as the moles continue to pop up where you least
56
+ expect them.
57
+ </p>},
58
+ :image_url => '/images/utc.jpg',
59
+ :price => 27.75)
60
+
61
+ end
62
+
63
+
64
+ def self.down
65
+ Product.delete_all
66
+ end
67
+ end
68
+