radius 0.0.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (9) hide show
  1. data/CHANGELOG +12 -0
  2. data/QUICKSTART +232 -45
  3. data/README +61 -15
  4. data/ROADMAP +4 -10
  5. data/Rakefile +50 -8
  6. data/lib/radius.rb +415 -75
  7. data/test/radius_test.rb +263 -113
  8. metadata +3 -4
  9. data/DSL-SPEC +0 -151
data/DSL-SPEC DELETED
@@ -1,151 +0,0 @@
1
- =DSL Specification
2
-
3
- I haven't implemented a domain specific languages for Contexts yet, but I am hoping to
4
- do so in a future release. Below are some thoughts (in code) for how I would like it to
5
- work. Note that with a robust DSL you will be able to define that certain tags are
6
- only valid within certain containing tags.
7
-
8
- class StoreContext < Radius::Context
9
- def initialize(options)
10
- @prefix = "r" # all tags must be prefixed with "r"
11
- @user = options[:user]
12
- @cart = options[:cart]
13
- @session = options[:session]
14
- end
15
-
16
- # expose the @user object variable
17
- container(:user, :exposes => :user) do
18
- # Use protect() on an object that has been exposed to prevent access to
19
- # an attribute in a template. Conversely you could use the expose() method
20
- # to expose specific attributes to the template and protect all others.
21
- protect :password
22
-
23
- # add a single tag that returns the session_id
24
- tag :session_id do |attributes|
25
- @session.id
26
- end
27
- end
28
-
29
- # expose the @cart object as the basket tag
30
- container(:basket, :exposes => :cart) do
31
- expand do |attributes|
32
- #
33
- # some initialization code with attributes before handling
34
- # content block
35
- #
36
- yeild
37
- end
38
-
39
- container(:items, :exposes => :item) do
40
- expand do |attributes|
41
- @cart.items.each do |@item|
42
- yield
43
- end
44
- end
45
- end
46
- end
47
-
48
- container :cart do
49
- expand do |attributes|
50
- yield
51
- end
52
- end
53
- end
54
-
55
- class User
56
- attr_accessor :name, :login, :password, :email
57
- def initialize(name, login, password, email)
58
- @name, @login, @password, @email = name, login, password, email
59
- end
60
- end
61
-
62
- class Session
63
- attr_accessor :id
64
- def initialize(id)
65
- @id = id
66
- end
67
- end
68
-
69
- class Cart
70
- attr_accessor :items
71
-
72
- def initialize(*items)
73
- @items = [items].flatten
74
- end
75
-
76
- def total
77
- @items.map { |line_item| line_item.total }
78
- end
79
- end
80
-
81
- class LineItem
82
- attr_accessor :name, :description, :quantity, :item_price
83
- def intialize(name, description, price, quantity)
84
- @name, @description, @price, @quantity = name, description, price, quantity
85
- end
86
- def full_price
87
- @price * @quantity
88
- end
89
- end
90
-
91
- receipt = <<-RECEIPT
92
- <p><r:user:name />, thank you for shopping with us! An order summary
93
- is printed below for your convinience. Please print a copy for your records.</p>
94
- <r:cart>
95
- <table>
96
- <thead>
97
- <tr>
98
- <td>Product</td>
99
- <td>Price</td>
100
- <td>Quantity</td>
101
- <td>Totals</td>
102
- </tr>
103
- </thead>
104
- <tbody>
105
- <r:items>
106
- <tr>
107
- <td>
108
- <strong><r:name /></strong><br >
109
- <r:description />
110
- </td>
111
- <td><r:price /></td>
112
- <td><r:quanity /></td>
113
- <td><r:full_price /></td>
114
- </tr>
115
- </r:items>
116
- </tbody>
117
- <tr>
118
- <td colspan="3">Total</td>
119
- <td><r:total /></td>
120
- </tr>
121
- </table>
122
- </r:cart>
123
- RECEIPT
124
-
125
- user = User.new('John', 'johnboy', 'm@x!mu5', 'johnboy@maximus.com')
126
- cart = Cart.new(
127
- LineItem.new('15in PowerBook', "Apple's premium notebook computer.", 1995.98, 1),
128
- LineItem.new('Mac Notebook Case', "A beautiful black notebook case designed for Apple Powerbooks.", 54.05, 1)
129
- )
130
- session = Session.new('a4bd386e512bacd581')
131
-
132
- context = StoreContext.new(
133
- :user => user,
134
- :cart => cart,
135
- :session => session
136
- )
137
-
138
- template = Radius::Template.new(
139
- :text => receipt,
140
- :context => context
141
- )
142
-
143
- template.compile! # based on context parses text into abstract syntax tree
144
- puts template.expand # outputs expanded template
145
-
146
- # alternate usage
147
- parser = Radius::Parser.new(context)
148
- puts parser.parse(receipt) # compiles and outputs expanded template
149
-
150
- # another alternate
151
- puts Radius.parse(receipt, context)