maiha-active_record_view 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/README +25 -0
  2. data/Rakefile +22 -0
  3. data/arv/properties/boolean +4 -0
  4. data/arv/properties/date +5 -0
  5. data/arv/properties/datetime +5 -0
  6. data/arv/properties/default +3 -0
  7. data/arv/properties/integer +6 -0
  8. data/arv/properties/string +4 -0
  9. data/arv/properties/text +7 -0
  10. data/arv/properties/time +5 -0
  11. data/arv/properties/timestamp +5 -0
  12. data/arv/property.erb +19 -0
  13. data/init.rb +0 -0
  14. data/install.rb +1 -0
  15. data/lib/active_record_view.rb +2 -0
  16. data/lib/active_record_view/controller.rb +9 -0
  17. data/lib/active_record_view/default_actions.rb +29 -0
  18. data/lib/active_record_view/engines.rb +68 -0
  19. data/lib/active_record_view/helper.rb +152 -0
  20. data/lib/active_record_view/record_identifier.rb +42 -0
  21. data/lib/active_record_view/render_arv.rb +51 -0
  22. data/lib/active_record_view/write_exception.rb +11 -0
  23. data/lib/localized/model.rb +103 -0
  24. data/lib/localized/view_property.rb +337 -0
  25. data/spec/fixtures/card.rb +12 -0
  26. data/spec/fixtures/card/equip.rb +13 -0
  27. data/spec/fixtures/card/magic.rb +13 -0
  28. data/spec/fixtures/card/member.rb +13 -0
  29. data/spec/fixtures/card/unit.rb +13 -0
  30. data/spec/fixtures/deck.rb +2 -0
  31. data/spec/localized/decks.yml +39 -0
  32. data/spec/migrate/001_create_cards.rb +16 -0
  33. data/spec/migrate/002_create_decks.rb +5 -0
  34. data/spec/models/active_record_view_helper_spec.rb +393 -0
  35. data/spec/models/render_spec.rb +220 -0
  36. data/spec/schema.rb +30 -0
  37. data/spec/spec.opts +6 -0
  38. data/spec/spec_helper.rb +27 -0
  39. data/tasks/active_record_view_tasks.rake +37 -0
  40. data/test/active_record_view_test.rb +8 -0
  41. data/uninstall.rb +1 -0
  42. metadata +93 -0
@@ -0,0 +1,12 @@
1
+ class Card < ActiveRecord::Base
2
+ def guess_class
3
+ case no.to_i
4
+ when 1...100 then Card::Unit
5
+ when 200...300 then Card::Member
6
+ when 700...800 then Card::Equip
7
+ when 800...900 then Card::Magic
8
+ else
9
+ raise "Cannot guess for no=#{no}"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ class Card::Equip < Card
2
+ def type_name
3
+ "装備カード"
4
+ end
5
+
6
+ def card_cost
7
+ skill_cost
8
+ end
9
+
10
+ def cost_or_kind
11
+ kind
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ class Card::Magic < Card
2
+ def type_name
3
+ "魔法カード"
4
+ end
5
+
6
+ def card_cost
7
+ skill_cost
8
+ end
9
+
10
+ def cost_or_kind
11
+ kind
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ class Card::Member < Card
2
+ def type_name
3
+ "メンバーカード"
4
+ end
5
+
6
+ def card_cost
7
+ skill_cost
8
+ end
9
+
10
+ def cost_or_kind
11
+ kind
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ class Card::Unit < Card
2
+ def type_name
3
+ "ユニットカード"
4
+ end
5
+
6
+ def card_cost
7
+ cost
8
+ end
9
+
10
+ def cost_or_kind
11
+ cost
12
+ end
13
+ end
@@ -0,0 +1,2 @@
1
+ class Deck < ActiveRecord::Base
2
+ end
@@ -0,0 +1,39 @@
1
+ names:
2
+ :class : "Deck"
3
+
4
+ column_names:
5
+ id : "Id"
6
+ name : "Name"
7
+ kind : "Kind"
8
+ word : "Word"
9
+
10
+
11
+ property_id:
12
+ # :format : "%s points"
13
+ :options :
14
+ :size : 10
15
+ :masters :
16
+ # - 1 : "item1"
17
+ # - 2 : "item2"
18
+
19
+
20
+ property_name:
21
+ :options :
22
+ :size : 30
23
+ :masters :
24
+ # :format : "%s"
25
+
26
+ property_kind:
27
+ :options :
28
+ :size : 60
29
+ :masters :
30
+ # :format : "%s"
31
+
32
+ property_word:
33
+ :options :
34
+ :rows : 5
35
+ :cols : 80
36
+ :column_type : :text
37
+ :masters :
38
+ # :format : "%s"
39
+
@@ -0,0 +1,16 @@
1
+ class CreateCards < Special::Migrations::Table
2
+ column :type, :string # [STI]
3
+ column :no, :integer # 0 No
4
+ column :name, :string # 1 名前
5
+ column :cost, :integer # 2 コスト
6
+ column :kind, :string # 3 属性
7
+ column :hp, :integer # 4 HP
8
+ column :power, :integer # 5 POW
9
+ column :block, :integer # 6 ブロック
10
+ column :counter, :integer # 7 カウンター
11
+ column :capacity,:integer # 8 チーム人数(魔法カード 守備時使用可1)
12
+ column :skill_name, :string # 9 スキル名
13
+ column :skill_cost, :integer # 10 スキルコスト
14
+ column :member, :string # 11 構成
15
+ column :help, :string # 12 せつめい
16
+ end
@@ -0,0 +1,5 @@
1
+ class CreateDecks < Special::Migrations::Table
2
+ column :name, :string
3
+ column :kind, :string
4
+ column :word, :string
5
+ end
@@ -0,0 +1,393 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ include ActiveRecordView
4
+
5
+ class ViewContext
6
+ include ActiveRecordView::Helper
7
+
8
+ def define_method(name, code)
9
+ instance_eval("def %s; %s; end" % [name, code])
10
+ end
11
+
12
+ def link_to_show(record = nil)
13
+ "link_to_show(#{record.id})"
14
+ end
15
+
16
+ # Mocks
17
+ def controller
18
+ nil
19
+ end
20
+
21
+ def text_field_tag(object_name, column_name, *args)
22
+ "text_field_tag(%s,%s)" % [object_name, column_name]
23
+ end
24
+ end
25
+
26
+ class CardHelper < ViewContext
27
+ def card_no(record)
28
+ "No.%d" % record.no
29
+ end
30
+
31
+ def card_name(record)
32
+ "%sカード" % record.name
33
+ end
34
+
35
+ def edit_card_name(record)
36
+ "%sカードの編集" % record.name
37
+ end
38
+ end
39
+
40
+ class MagicCardHelper < CardHelper
41
+ def magic_name(record)
42
+ "%s魔法カード" % record.name
43
+ end
44
+
45
+ def edit_magic_name(record)
46
+ "%s魔法カードの編集" % record.name
47
+ end
48
+ end
49
+
50
+ class DeckHelper < ViewContext
51
+ def deck_name(record)
52
+ "%sデッキ" % record.name
53
+ end
54
+
55
+ def edit_deck_name(record)
56
+ "%sデッキの編集" % record.name
57
+ end
58
+
59
+ def kind(record)
60
+ "kind(#{record.id})"
61
+ end
62
+ end
63
+
64
+ class HashHelper < ViewContext
65
+ def hash_name(record)
66
+ "hash_name(%s)" % record[:name]
67
+ end
68
+
69
+ def edit_hash_name(record)
70
+ "edit_hash_name(%s)" % record[:name]
71
+ end
72
+ end
73
+
74
+ module NameAccessor
75
+ def name(record)
76
+ "name(%s)" % record[:name]
77
+ end
78
+
79
+ def edit_name(record)
80
+ "edit_name(%s)" % record[:name]
81
+ end
82
+ end
83
+
84
+
85
+ ######################################################################
86
+ ### カラム参照
87
+
88
+ describe ActiveRecordView::Helper, "カラム参照" do
89
+ before(:each) do
90
+ @card = Card.new(:name=>"nksk", :no=>1, :cost=>2)
91
+ @view = ViewContext.new
92
+ @engine = @view.find_active_record_view_engine(Card, :name)
93
+ end
94
+
95
+ it "Engines::DuckTypeが利用される" do
96
+ @engine.class.should == Engines::DuckType
97
+ end
98
+
99
+ it "showメソッド" do
100
+ @engine.show(@card).should == "nksk"
101
+ end
102
+
103
+ it "editメソッド" do
104
+ @engine.edit(@card).should == "text_field_tag(card[name],nksk)"
105
+ end
106
+ end
107
+
108
+ describe ActiveRecordView::Helper, "存在しないフィールド参照" do
109
+ before(:each) do
110
+ @card = Card.new(:name=>"nksk", :no=>1, :cost=>2)
111
+ @view = ViewContext.new
112
+ @engine = @view.find_active_record_view_engine(Card, :unknown_field)
113
+ end
114
+
115
+ it "Engines::Missingが利用される" do
116
+ @engine.class.should == Engines::Missing
117
+ end
118
+
119
+ it "showメソッドは self[key] (=nil) を返す" do
120
+ @engine.show(@card).should == nil
121
+ end
122
+
123
+ it "editメソッド" do
124
+ @engine.edit(@card).should == "text_field_tag(card[unknown_field],)"
125
+ end
126
+ end
127
+
128
+
129
+ ######################################################################
130
+ ### ヘルパ
131
+
132
+ describe ActiveRecordView::Helper, "ヘルパメソッド定義状態" do
133
+ before(:each) do
134
+ @card = Card.new(:name=>"nksk", :no=>1, :cost=>2)
135
+ @view = CardHelper.new
136
+ @engine = @view.find_active_record_view_engine(Card, :name)
137
+ end
138
+
139
+ it "Engines::Helperが利用される" do
140
+ @engine.class.should == Engines::Helper
141
+ end
142
+
143
+ it "定義されたヘルパメソッドを呼び出す" do
144
+ @engine.show(@card).should == "nkskカード"
145
+ end
146
+
147
+ it "定義されたヘルパメソッドを呼び出す(+prefix)" do
148
+ @engine = @view.find_active_record_view_engine(Card, :name, "edit_")
149
+ @engine.edit(@card).should == "nkskカードの編集"
150
+ end
151
+
152
+ it "ヘルパに定義されていない場合" do
153
+ @engine = @view.find_active_record_view_engine(Card, :cost)
154
+ @engine.show(@card).should == 2
155
+ end
156
+
157
+ it "クラス名なしの名前が直接ヘルパメソッドとして定義されている場合" do
158
+ @engine = @view.find_active_record_view_engine(Card, :link_to_show)
159
+ @engine.class.should == Engines::Helper
160
+
161
+ @card.id = 1
162
+ @engine.show(@card).should == "link_to_show(1)"
163
+ end
164
+ end
165
+
166
+
167
+ describe ActiveRecordView::Helper, "継承したモデル+継承用ヘルパ" do
168
+ before(:each) do
169
+ @card = Card::Magic.new(:name=>"nksk", :no=>1)
170
+ @view = MagicCardHelper.new
171
+ @engine = @view.find_active_record_view_engine(Card::Magic, :name)
172
+ end
173
+
174
+ it "Engines::Helperが利用される" do
175
+ @engine.class.should == Engines::Helper
176
+ end
177
+
178
+ it "継承用クラス用に定義されたヘルパメソッドを呼び出す" do
179
+ @engine.show(@card).should == "nksk魔法カード"
180
+ end
181
+
182
+ it "継承用クラス用に定義されたヘルパメソッドを呼び出す(+prefix)" do
183
+ @engine = @view.find_active_record_view_engine(Card::Magic, :name, "edit_")
184
+ @engine.edit(@card).should == "nksk魔法カードの編集"
185
+ end
186
+
187
+ it "親クラス用に定義されたヘルパメソッドを呼び出す" do
188
+ @engine = @view.find_active_record_view_engine(Card::Magic, :no)
189
+ @engine.show(@card).should == "No.1"
190
+ end
191
+ end
192
+
193
+
194
+ describe ActiveRecordView::Helper, "継承したモデル+親クラス用ヘルパ" do
195
+ before(:each) do
196
+ @card = Card::Magic.new(:name=>"nksk", :no=>1)
197
+ @view = CardHelper.new
198
+ @engine = @view.find_active_record_view_engine(Card::Magic, :name)
199
+ end
200
+
201
+ it "Engines::Helperが利用される" do
202
+ @engine.class.should == Engines::Helper
203
+ end
204
+
205
+ it "親クラス用に定義されたヘルパメソッドを呼び出す(継承用ヘルパにはある内容)" do
206
+ @engine.show(@card).should == "nkskカード"
207
+ end
208
+
209
+ it "親クラス用に定義されたヘルパメソッドを呼び出す(継承用ヘルパにはある内容+prefix)" do
210
+ @engine = @view.find_active_record_view_engine(Card::Magic, :name, "edit_")
211
+ @engine.edit(@card).should == "nkskカードの編集"
212
+ end
213
+
214
+ it "親クラス用に定義されたヘルパメソッドを呼び出す" do
215
+ @engine = @view.find_active_record_view_engine(Card::Magic, :no)
216
+ @engine.show(@card).should == "No.1"
217
+ end
218
+ end
219
+
220
+ ######################################################################
221
+ ### プロパティ
222
+
223
+ describe ActiveRecordView::Helper, "プロパティ定義状態" do
224
+ before(:each) do
225
+ @deck = Deck.new(:name=>"nksk", :word=>"qff")
226
+ @view = ViewContext.new
227
+ @engine = @view.find_active_record_view_engine(Deck, :name)
228
+ end
229
+
230
+ it "Engines::Propertyが利用される" do
231
+ @engine.class.should == Engines::Property
232
+ end
233
+
234
+ it "プロパティの値を参照(show)" do
235
+ @engine.show(@deck).should == "nksk"
236
+ end
237
+
238
+ it "プロパティの値を参照(edit)" do
239
+ @engine.edit(@deck).should == '<input class="name" id="deck_name" name="deck[name]" size="30" type="text" value="nksk" />'
240
+ end
241
+ end
242
+
243
+
244
+ ######################################################################
245
+ ### プロパティ + ヘルパ
246
+
247
+ describe ActiveRecordView::Helper, "プロパティとヘルパが定義された状態" do
248
+ before(:each) do
249
+ @deck = Deck.new(:name=>"nksk", :word=>"qff")
250
+ @view = DeckHelper.new
251
+ end
252
+
253
+ it "nameカラムはヘルパに定義されているのでEngines::Helperが利用される" do
254
+ @engine = @view.find_active_record_view_engine(Deck, :name)
255
+ @engine.class.should == Engines::Helper
256
+ end
257
+
258
+ it "nameカラムの参照はヘルパの実行になる" do
259
+ @engine = @view.find_active_record_view_engine(Deck, :name)
260
+ @engine.show(@deck).should == "nkskデッキ"
261
+ end
262
+
263
+ it "nameカラムの編集はヘルパの実行になる" do
264
+ @engine = @view.find_active_record_view_engine(Deck, :name, "edit_")
265
+ @engine.edit(@deck).should == "nkskデッキの編集"
266
+ end
267
+
268
+ it "wordカラムの参照はヘルパに定義されてないのでEngines::Propertyが利用される" do
269
+ @engine = @view.find_active_record_view_engine(Deck, :word)
270
+ @engine.class.should == Engines::Property
271
+ end
272
+
273
+ it "wordカラムの修整はヘルパに定義されてないのでEngines::Propertyが利用される" do
274
+ @engine = @view.find_active_record_view_engine(Deck, :word, "edit_")
275
+ @engine.class.should == Engines::Property
276
+ @engine.edit(@deck).should == '<textarea class="word" cols="80" id="deck_word" name="deck[word]" rows="5">qff</textarea>'
277
+ end
278
+
279
+ it "カラム名が直接ヘルパメソッドとして定義されている場合でもプロパティが優先される" do
280
+ @engine = @view.find_active_record_view_engine(Deck, :kind)
281
+ @engine.class.should == Engines::Property
282
+ end
283
+
284
+ it "クラス名なしの名前が直接ヘルパメソッドとして定義されており、それがカラム名でなければヘルパが利用される" do
285
+ @engine = @view.find_active_record_view_engine(Deck, :link_to_show)
286
+ @engine.class.should == Engines::Helper
287
+
288
+ @deck.id = 1
289
+ @engine.show(@deck).should == "link_to_show(1)"
290
+ end
291
+ end
292
+
293
+
294
+ ######################################################################
295
+ ### 入力フォームにて指定されたパラメータ名を優先させる
296
+
297
+ describe ActiveRecordView::Helper, "Property時のパラメータ指定" do
298
+ before(:each) do
299
+ @deck = Deck.new(:name=>"nksk", :word=>"qff")
300
+ @view = ViewContext.new
301
+ end
302
+
303
+ it "data というパラメータ名で入力フォームを作る" do
304
+ @engine = @view.find_active_record_view_engine(Deck, :name)
305
+ @engine.class.should == Engines::Property
306
+ @engine.edit(@deck, :name, @view, :data).should ==
307
+ '<input class="name" id="data_name" name="data[name]" size="30" type="text" value="nksk" />'
308
+ end
309
+ end
310
+
311
+
312
+ ######################################################################
313
+ ### 非ActiveRecord
314
+
315
+ describe ActiveRecordView::Helper, "Hashオブジェクトでヘルパあり" do
316
+ before(:each) do
317
+ @record = {:name=>"nksk"}
318
+ @view = HashHelper.new
319
+ @engine = @view.find_active_record_view_engine(Hash, :name)
320
+ end
321
+
322
+ it "Engines::Helperが利用される" do
323
+ @engine.class.should == Engines::Helper
324
+ end
325
+
326
+ it "定義されたヘルパメソッドを呼び出す" do
327
+ @engine.show(@record).should == "hash_name(nksk)"
328
+ end
329
+ end
330
+
331
+ describe ActiveRecordView::Helper, "Hashオブジェクトでメソッド名ヘルパあり" do
332
+ before(:each) do
333
+ @record = {:name=>"nksk"}
334
+ @view = ViewContext.new
335
+ @view.extend NameAccessor
336
+ @engine = @view.find_active_record_view_engine(Hash, :name)
337
+ end
338
+
339
+ it "Engines::Helperが利用される" do
340
+ @engine.class.should == Engines::Helper
341
+ end
342
+
343
+ it "定義されたヘルパメソッドを呼び出す" do
344
+ @engine.show(@record).should == "name(nksk)"
345
+ end
346
+ end
347
+
348
+ describe ActiveRecordView::Helper, "Hashオブジェクトでクラス名とメソッド名の両ヘルパあり" do
349
+ before(:each) do
350
+ @record = {:name=>"nksk"}
351
+ @view = HashHelper.new
352
+ @view.extend NameAccessor
353
+ @engine = @view.find_active_record_view_engine(Hash, :name)
354
+ end
355
+
356
+ it "Engines::Helperが利用される" do
357
+ @engine.class.should == Engines::Helper
358
+ end
359
+
360
+ it "定義されたヘルパメソッドを呼び出す" do
361
+ # クラス名のヘルパが優先される
362
+ @engine.show(@record).should == "hash_name(nksk)"
363
+ end
364
+ end
365
+
366
+ describe ActiveRecordView::Helper, "Hashオブジェクトでヘルパなし" do
367
+ before(:each) do
368
+ @record = {:name=>"nksk"}
369
+ @view = ViewContext.new
370
+ @engine = @view.find_active_record_view_engine(Hash, :name)
371
+ end
372
+
373
+ it "Engines::Missingが利用される" do
374
+ @engine.class.should == Engines::Missing
375
+ end
376
+
377
+ it "showメソッド" do
378
+ @engine.show(@record).should == "nksk"
379
+ end
380
+
381
+ it "editメソッド" do
382
+ @engine.edit(@record).should == "text_field_tag(hash[name],nksk)"
383
+ end
384
+ end
385
+
386
+
387
+ # describe ActiveRecordView::Helper, "[] メソッドを持たないオブジェクト" do
388
+ # it "TypeError が起きる" do
389
+ # @engine = @view.find_active_record_view_engine(Integer, :name)
390
+ # # raise TypeError, "expect '[]' accessor for #{klass}"
391
+ # end
392
+ # end
393
+