marley 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. data/README.rdoc +3 -8
  2. data/lib/marley.rb +27 -131
  3. data/lib/marley/controllers.rb +12 -7
  4. data/lib/marley/core_ext.rb +8 -0
  5. data/lib/marley/errors.rb +51 -0
  6. data/lib/marley/joint.rb +14 -19
  7. data/lib/marley/joints/forum.rb +88 -0
  8. data/lib/marley/joints/messages.rb +86 -0
  9. data/lib/marley/joints/section.rb +63 -0
  10. data/lib/marley/joints/tags.rb +99 -0
  11. data/lib/marley/joints/user.rb +120 -0
  12. data/lib/marley/plugin.rb +39 -0
  13. data/lib/marley/plugins/orm_rest_convenience.rb +92 -0
  14. data/lib/marley/plugins/rest_convenience.rb +28 -0
  15. data/lib/marley/reggae.rb +5 -2
  16. data/lib/marley/resources.rb +10 -0
  17. data/lib/marley/router.rb +61 -0
  18. data/lib/marley/test_helpers.rb +12 -1
  19. data/lib/marley/utils.rb +57 -25
  20. data/rdoc/example_joint.rb +33 -0
  21. data/rdoc/example_plugin.rb +20 -0
  22. data/rdoc/forum_joint.rb +50 -0
  23. data/rdoc/forum_joint.rdoc +19 -0
  24. data/rdoc/hello.rb +14 -0
  25. data/rdoc/hello.rdoc +14 -0
  26. data/rdoc/joints.rdoc +69 -0
  27. data/rdoc/messages_joint.rb +34 -0
  28. data/rdoc/messages_joint.rdoc +18 -0
  29. data/rdoc/messages_joint/private_messages.rdoc +59 -0
  30. data/rdoc/messages_joint/public_messages.rdoc +65 -0
  31. data/rdoc/orm_rest_convenience_plugin.rb +28 -0
  32. data/rdoc/orm_rest_convenience_plugin.rdoc +99 -0
  33. data/rdoc/plugins.rdoc +35 -0
  34. data/rdoc/reggae.rb +3 -0
  35. data/rdoc/reggae.rdoc +11 -0
  36. data/rdoc/reggae/generate.rdoc +13 -0
  37. data/rdoc/reggae/parse.rdoc +44 -0
  38. data/rdoc/section_joint.rb +13 -0
  39. data/rdoc/section_joint.rdoc +19 -0
  40. data/rdoc/tags_joint.rb +16 -0
  41. data/rdoc/tags_joint.rdoc +22 -0
  42. data/rdoc/tags_joint/announcements.rdoc +64 -0
  43. data/rdoc/tags_joint/secrets.rdoc +65 -0
  44. data/rdoc/user_joint.rb +62 -0
  45. data/rdoc/user_joint.rdoc +13 -0
  46. data/rdoc/user_joint/exiting_users.rdoc +120 -0
  47. data/rdoc/user_joint/no_auth_provided.rdoc +34 -0
  48. data/reggae.ebnf +1 -1
  49. metadata +45 -37
  50. data/Favicon.ico +0 -0
  51. data/Rakefile +0 -14
  52. data/TODO +0 -19
  53. data/examples/blog.rb +0 -26
  54. data/examples/empty.sqlite3 +0 -0
  55. data/examples/forum.css +0 -3
  56. data/examples/forum.js +0 -23
  57. data/examples/forum.rb +0 -20
  58. data/examples/forum.sql +0 -42
  59. data/examples/forum.sqlite3 +0 -0
  60. data/examples/forum_test.sqlite3 +0 -0
  61. data/examples/run.sh +0 -14
  62. data/lib/client/jamaica.css +0 -270
  63. data/lib/client/jamaica.js +0 -353
  64. data/lib/client/jamaica.rb +0 -38
  65. data/lib/client/jquery-1.6.2.js +0 -8981
  66. data/lib/client/jquery.form.js +0 -814
  67. data/lib/joints/basic_menu_system.rb +0 -41
  68. data/lib/joints/basic_messaging.rb +0 -88
  69. data/lib/joints/basic_user.rb +0 -51
  70. data/lib/joints/tagged_messaging.rb +0 -122
  71. data/lib/joints/tagging.rb +0 -56
  72. data/lib/sequel/plugins/rest_auth.rb +0 -53
  73. data/lib/sequel/plugins/rest_convenience.rb +0 -87
  74. data/marley-0.4.0.gem +0 -0
  75. data/marley.gemspec +0 -17
  76. data/test/empty.sqlite3 +0 -0
  77. data/test/menu_tests.rb +0 -9
  78. data/test/tagged_messaging_tests.rb +0 -289
  79. data/test/test.sqlite3 +0 -0
  80. data/test/test_include.rb +0 -16
  81. data/test/user_tests.rb +0 -72
@@ -0,0 +1,16 @@
1
+ require 'user_joint.rb'
2
+
3
+ DB.create_table :tags do
4
+ primary_key :id
5
+ integer :user_id
6
+ text :tag
7
+ end
8
+ DB.create_table :messages_tags do
9
+ primary_key :id
10
+ integer :tag_id
11
+ integer :message_id
12
+ end
13
+ Marley.joint('tags')
14
+ Marley.plugin(:tagging,{:tag_type => 'private'}).apply('Secret')
15
+ Marley.plugin(:tagging,{:tag_type => 'private'}).apply('Announcement')
16
+ Marley.plugin(:tagging,{:tag_type => 'public'}).apply('Announcement')
@@ -0,0 +1,22 @@
1
+
2
+ == The Tags Joint
3
+
4
+ setup
5
+ DB[:users].delete
6
+ DB[:messages].delete
7
+ DB[:messages_tags].delete
8
+ DB[:tags].delete
9
+ DB[:SQLITE_SEQUENCE].update(:seq => 0)
10
+ user_client=Marley::TestClient.new(:resource_name => 'user')
11
+ user=user_client.read({},:method => 'new').set_values(:password => 'asdfasdf', :confirm_password => 'asdfasdf')
12
+ [1,2,3].each { |i|
13
+ user_client.create(user.set_values(:name => "user#{i}"))
14
+ }
15
+ @user1_auth=['user1', 'asdfasdf']
16
+ @user2_auth=['user2', 'asdfasdf']
17
+ @user3_auth=['user3', 'asdfasdf']
18
+ end
19
+
20
+ example:
21
+
22
+
@@ -0,0 +1,64 @@
1
+
2
+
3
+ === Announcements
4
+
5
+ setup
6
+ @client1=Marley::TestClient.new(:resource_name => 'announcement', :auth => @user1_auth)
7
+ @client2=Marley::TestClient.new(:resource_name => 'announcement', :auth => @user2_auth)
8
+ end
9
+
10
+
11
+ examples: announcements with private and public tags
12
+
13
+ >> @announcement1=@client1.read({},{:method => 'new'})
14
+ => [:instance, {:schema=>[["integer", :user_id, 3, 1], ["text", :name, 4, nil], ["text", :message, 0, nil], ["text", :_private_tags, 0, nil], ["text", :_public_tags, 0, nil]], :url=>"/announcement/", :new_rec=>true, :actions=>nil, :name=>"announcement"}, []]
15
+
16
+ >> @client1.create(@announcement1.set_values({:name => 'user1 ann1', :message => 'user1ann1 msg', :_private_tags => 'aaa,bbb',:_public_tags => 'ppp'}), :url => @announcement1.url)
17
+ => [:instance, {:schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 ann1"], ["text", :message, 0, "user1ann1 msg"], ["text", :_private_tags, 0, "aaa, bbb"], ["text", :_public_tags, 0, "ppp"]], :url=>"/announcement/1", :new_rec=>false, :actions=>{:delete=>"/announcement/1"}, :name=>"announcement"}, []]
18
+ >> @client1.read
19
+ => [[:instance, {:schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 ann1"], ["text", :message, 0, "user1ann1 msg"], ["text", :_private_tags, 0, "aaa, bbb"], ["text", :_public_tags, 0, "ppp"]], :url=>"/announcement/1", :new_rec=>false, :actions=>{:delete=>"/announcement/1"}, :name=>"announcement"}, []]]
20
+
21
+ >> @client2.read
22
+ => [[:instance, {:url=>"/announcement/1", :new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 6, "user1 ann1"], ["text", :message, 2, "user1ann1 msg"], ["text", :_private_tags, 0, ""], ["text", :_public_tags, 0, "ppp"]], :name=>"announcement"}, []]]
23
+
24
+ >> @announcement2=@client2.read({},{:method => 'new'})
25
+ => [:instance, {:url=>"/announcement/", :new_rec=>true, :actions=>nil, :schema=>[["integer", :user_id, 3, 2], ["text", :name, 4, nil], ["text", :message, 0, nil], ["text", :_private_tags, 0, nil], ["text", :_public_tags, 0, nil]], :name=>"announcement"}, []]
26
+ >> @client1.create(@announcement.set_values({:name => 'user1 ann1', :message => 'user1ann1 msg', :_private_tags => 'aaa,bbb',:_public_tags => 'ppp'}), :url => @announcement.url)
27
+ >> @client2.create(@announcement2.set_values({:name => 'user2 ann1', :message => 'user2ann1 msg', :_private_tags => 'xxx',:_public_tags => 'yyy,zzz'}), :url => @announcement2.url)
28
+ => [:instance, {:url=>"/announcement/2", :new_rec=>false, :actions=>{:delete=>"/announcement/2"}, :schema=>[["integer", :id, 2, 2], ["integer", :user_id, 3, 2], ["text", :name, 4, "user2 ann1"], ["text", :message, 0, "user2ann1 msg"], ["text", :_private_tags, 0, "xxx"], ["text", :_public_tags, 0, "yyy, zzz"]], :name=>"announcement"}, []]
29
+
30
+ >> @client1.read
31
+ => [[:instance, {:url=>"/announcement/1", :new_rec=>false, :actions=>{:delete=>"/announcement/1"}, :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 ann1"], ["text", :message, 0, "user1ann1 msg"], ["text", :_private_tags, 0, "aaa, bbb"], ["text", :_public_tags, 0, "ppp"]], :name=>"announcement"}, []], [:instance, {:url=>"/announcement/2", :new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 2], ["integer", :user_id, 3, 2], ["text", :name, 6, "user2 ann1"], ["text", :message, 2, "user2ann1 msg"], ["text", :_private_tags, 0, ""], ["text", :_public_tags, 0, "yyy, zzz"]], :name=>"announcement"}, []]]
32
+ >> @client2.read
33
+ => [[:instance, {:url=>"/announcement/1", :new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 6, "user1 ann1"], ["text", :message, 2, "user1ann1 msg"], ["text", :_private_tags, 0, ""], ["text", :_public_tags, 0, "ppp"]], :name=>"announcement"}, []], [:instance, {:url=>"/announcement/2", :new_rec=>false, :actions=>{:delete=>"/announcement/2"}, :schema=>[["integer", :id, 2, 2], ["integer", :user_id, 3, 2], ["text", :name, 4, "user2 ann1"], ["text", :message, 0, "user2ann1 msg"], ["text", :_private_tags, 0, "xxx"], ["text", :_public_tags, 0, "yyy, zzz"]], :name=>"announcement"}, []]]
34
+
35
+ >> @ann1client1=@client1.read({},:instance_id => 1)
36
+ => [:instance, {:url=>"/announcement/1", :new_rec=>false, :actions=>{:delete=>"/announcement/1"}, :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 ann1"], ["text", :message, 0, "user1ann1 msg"], ["text", :_private_tags, 0, "aaa, bbb"], ["text", :_public_tags, 0, "ppp"]], :name=>"announcement"}, []]
37
+ :_public_tags, 0, "ppp"]], :name=>"announcement"}, []]
38
+
39
+ >> @ann1client2=@client2.read({},:instance_id => 1)
40
+ => [:instance, {:url=>"/announcement/1", :new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 6, "user1 ann1"], ["text", :message, 2, "user1ann1 msg"], ["text", :_private_tags, 0, ""], ["text", :_public_tags, 0, "ppp"]], :name=>"announcement"}, []]
41
+
42
+ >> @ann2client1=@client1.read({},:instance_id => 2)
43
+ => [:instance, {:url=>"/announcement/2", :new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 2], ["integer", :user_id, 3, 2], ["text", :name, 6, "user2 ann1"], ["text", :message, 2, "user2ann1 msg"], ["text", :_private_tags, 0, ""], ["text", :_public_tags, 0, "yyy, zzz"]], :name=>"announcement"}, []]
44
+
45
+ >> @ann2client2=@client2.read({},:instance_id => 2)
46
+ => [:instance, {:url=>"/announcement/2", :new_rec=>false, :actions=>{:delete=>"/announcement/2"}, :schema=>[["integer", :id, 2, 2], ["integer", :user_id, 3, 2], ["text", :name, 4, "user2 ann1"], ["text", :message, 0, "user2ann1 msg"], ["text", :_private_tags, 0, "xxx"], ["text", :_public_tags, 0, "yyy, zzz"]], :name=>"announcement"}, []]
47
+
48
+
49
+ >> @client1.update(@ann1client1.set_values(:_public_tags => 'uuu'), :url => @ann1client1.url)
50
+ => [:instance, {:url=>"/announcement/1", :new_rec=>false, :actions=>{:delete=>"/announcement/1"}, :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 ann1"], ["text", :message, 0, "user1ann1 msg"], ["text", :_private_tags, 0, "aaa, bbb"], ["text", :_public_tags, 0, "uuu"]], :name=>"announcement"}, []]
51
+
52
+ >> @client2.read({},:instance_id => 1)
53
+ => [:instance, {:url=>"/announcement/1", :new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 6, "user1 ann1"], ["text", :message, 2, "user1ann1 msg"], ["text", :_private_tags, 0, ""], ["text", :_public_tags, 0, "uuu"]], :name=>"announcement"}, []]
54
+ >> @client1.update(@ann1client1.set_values(:_private_tags => 'u,v,w'), :url => @ann1client1.url)
55
+ => [:instance, {:url=>"/announcement/1", :new_rec=>false, :actions=>{:delete=>"/announcement/1"}, :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 ann1"], ["text", :message, 0, "user1ann1 msg"], ["text", :_private_tags, 0, "u, v, w"], ["text", :_public_tags, 0, "uuu"]], :name=>"announcement"}, []]
56
+ >> @client2.read({},:instance_id => 1)
57
+ => [:instance, {:url=>"/announcement/1", :new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 6, "user1 ann1"], ["text", :message, 2, "user1ann1 msg"], ["text", :_private_tags, 0, ""], ["text", :_public_tags, 0, "uuu"]], :name=>"announcement"}, []]
58
+ >> @client2.update(@ann1client2.set_values(:_public_tags => 'ddd',:_private_tags => 'ee,www,rr'),:url => @ann1client2.url)
59
+ => [:instance, {:url=>"/announcement/1", :new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 6, "user1 ann1"], ["text", :message, 2, "user1ann1 msg"], ["text", :_private_tags, 0, "ee, www, rr"], ["text", :_public_tags, 0, "ddd"]], :name=>"announcement"}, []]
60
+
61
+ >> @client1.read
62
+ => [[:instance, {:url=>"/announcement/1", :new_rec=>false, :actions=>{:delete=>"/announcement/1"}, :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 ann1"], ["text", :message, 0, "user1ann1 msg"], ["text", :_private_tags, 0, "u, v, w"], ["text", :_public_tags, 0, "ddd"]], :name=>"announcement"}, []], [:instance, {:url=>"/announcement/2", :new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 2], ["integer", :user_id, 3, 2], ["text", :name, 6, "user2 ann1"], ["text", :message, 2, "user2ann1 msg"], ["text", :_private_tags, 0, ""], ["text", :_public_tags, 0, "yyy, zzz"]], :name=>"announcement"}, []]]
63
+
64
+
@@ -0,0 +1,65 @@
1
+
2
+ === Secrets
3
+
4
+ setup
5
+ @client=Marley::TestClient.new(:resource_name => 'secret')
6
+ end
7
+
8
+
9
+ examples:
10
+
11
+ >> @client.auth=@user1_auth
12
+ => ["user1", "asdfasdf"]
13
+ >> @secret=@client.read({}, :method => 'new')
14
+ => [:instance, {:schema=>[["integer", :user_id, 3, 1], ["text", :name, 4, nil], ["text", :message, 0, nil], ["text", :_private_tags, 0, nil]], :url=>"/secret/", :new_rec=>true, :actions=>nil, :name=>"secret"}, []]
15
+
16
+ >> @client.create(@secret.set_values(:name => 'user1 secret1', :_private_tags => 'xxxxxx,sss'))
17
+ => [:instance, {:schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 secret1"], ["text", :message, 0, nil], ["text", :_private_tags, 0, "xxxxxx, sss"]], :url=>"/secret/1", :new_rec=>false, :actions=>nil, :name=>"secret"}, []]
18
+
19
+ >> @secret=@client.read[0]
20
+ => [:instance, {:schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 secret1"], ["text", :message, 0, nil], ["text", :_private_tags, 0, "xxxxxx, sss"]], :url=>"/secret/1", :new_rec=>false, :actions=>nil, :name=>"secret"}, []]
21
+
22
+ >> @client.update(@secret.set_values(:_private_tags => "#{@secret.col_value(:_private_tags)},zzz,aaa"), :url => @secret.url)
23
+ => [:instance, {:schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 secret1"], ["text", :message, 0, nil], ["text", :_private_tags, 0, "xxxxxx, sss, zzz, aaa"]], :url=>"/secret/1", :new_rec=>false, :actions=>nil, :name=>"secret"}, []]
24
+ >> @secret=@client.read[0]
25
+ => [:instance, {:schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 secret1"], ["text", :message, 0, nil], ["text", :_private_tags, 0, "xxxxxx, sss, zzz, aaa"]], :url=>"/secret/1", :new_rec=>false, :actions=>nil, :name=>"secret"}, []]
26
+
27
+ >> @client.update(@secret.set_values(:_private_tags => "foo"), :url => @secret.url)
28
+ => [:instance, {:schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 secret1"], ["text", :message, 0, nil], ["text", :_private_tags, 0, "foo"]], :url=>"/secret/1", :new_rec=>false, :actions=>nil, :name=>"secret"}, []]
29
+ >> @secret=@client.read[0]
30
+ => [:instance, {:schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 secret1"], ["text", :message, 0, nil], ["text", :_private_tags, 0, "foo"]], :url=>"/secret/1", :new_rec=>false, :actions=>nil, :name=>"secret"}, []]
31
+
32
+ >> DB[:tags].all
33
+ => [{:tag=>"xxxxxx", :id=>1, :user_id=>1}, {:tag=>"sss", :id=>2, :user_id=>1}, {:tag=>"sss", :id=>3, :user_id=>1}, {:tag=>"zzz", :id=>4, :user_id=>1}, {:tag=>"aaa", :id=>5, :user_id=>1}, {:tag=>"foo", :id=>6, :user_id=>1}]
34
+ >> DB[:messages_tags].all
35
+ => [{:tag_id=>6, :message_id=>1, :id=>7}]
36
+
37
+
38
+
39
+ >> @client.auth=@user2_auth
40
+ => ["user2", "asdfasdf"]
41
+ >> @client.read
42
+ => []
43
+
44
+ >> @secret=@client.read({}, :method => 'new')
45
+ => [:instance, {:schema=>[["integer", :user_id, 3, 2], ["text", :name, 4, nil], ["text", :message, 0, nil], ["text", :_private_tags, 0, nil]], :url=>"/secret/", :new_rec=>true, :actions=>nil, :name=>"secret"}, []]
46
+
47
+ >> @client.create(@secret.set_values(:name => 'user2 secret', :_private_tags => 'foo,bar'))
48
+ => [:instance, {:schema=>[["integer", :id, 2, 2], ["integer", :user_id, 3, 2], ["text", :name, 4, "user2 secret"], ["text", :message, 0, nil], ["text", :_private_tags, 0, "foo, bar"]], :url=>"/secret/2", :new_rec=>false, :actions=>nil, :name=>"secret"}, []]
49
+
50
+ >> @secret=@client.read[0]
51
+ => [:instance, {:schema=>[["integer", :id, 2, 2], ["integer", :user_id, 3, 2], ["text", :name, 4, "user2 secret"], ["text", :message, 0, nil], ["text", :_private_tags, 0, "foo, bar"]], :url=>"/secret/2", :new_rec=>false, :actions=>nil, :name=>"secret"}, []]
52
+ >> @client.update(@secret.set_values(:_private_tags => "#{@secret.col_value(:_private_tags)},baz,bat"), :url => @secret.url)
53
+ => [:instance, {:schema=>[["integer", :id, 2, 2], ["integer", :user_id, 3, 2], ["text", :name, 4, "user2 secret"], ["text", :message, 0, nil], ["text", :_private_tags, 0, "foo, bar, baz, bat"]], :url=>"/secret/2", :new_rec=>false, :actions=>nil, :name=>"secret"}, []]
54
+
55
+ >> @secret=@client.read[0]
56
+ => [:instance, {:schema=>[["integer", :id, 2, 2], ["integer", :user_id, 3, 2], ["text", :name, 4, "user2 secret"], ["text", :message, 0, nil], ["text", :_private_tags, 0, "foo, bar, baz, bat"]], :url=>"/secret/2", :new_rec=>false, :actions=>nil, :name=>"secret"}, []]
57
+ >> @client.update(@secret.set_values(:_private_tags => "boo"), :url => @secret.url)
58
+ => [:instance, {:schema=>[["integer", :id, 2, 2], ["integer", :user_id, 3, 2], ["text", :name, 4, "user2 secret"], ["text", :message, 0, nil], ["text", :_private_tags, 0, "boo"]], :url=>"/secret/2", :new_rec=>false, :actions=>nil, :name=>"secret"}, []]
59
+
60
+ >> DB[:tags].all
61
+ => [{:tag=>"xxxxxx", :id=>1, :user_id=>1}, {:tag=>"sss", :id=>2, :user_id=>1}, {:tag=>"sss", :id=>3, :user_id=>1}, {:tag=>"zzz", :id=>4, :user_id=>1}, {:tag=>"aaa", :id=>5, :user_id=>1}, {:tag=>"foo", :id=>6, :user_id=>1}, {:tag=>"foo", :id=>7, :user_id=>2}, {:tag=>"bar", :id=>8, :user_id=>2}, {:tag=>"bar", :id=>9, :user_id=>2}, {:tag=>"baz", :id=>10, :user_id=>2}, {:tag=>"bat", :id=>11, :user_id=>2}, {:tag=>"boo", :id=>12, :user_id=>2}]
62
+ >> DB[:messages_tags].all
63
+ => [{:tag_id=>6, :message_id=>1, :id=>7}, {:tag_id=>12, :message_id=>2, :id=>14}]
64
+
65
+
@@ -0,0 +1,62 @@
1
+
2
+ require 'rubygems'
3
+ require 'sequel'
4
+ require 'marley'
5
+ require 'marley/test_helpers'
6
+
7
+ DB=Sequel.sqlite('')
8
+ DB.create_table :users do
9
+ primary_key :id
10
+ text :name, :unique => true
11
+ text :user_type, :index => true
12
+ text :pw_hash
13
+ text :email
14
+ date :birthday
15
+ datetime :date_created
16
+ text :description
17
+ end
18
+ DB.create_table :messages do
19
+ primary_key :id
20
+ integer :user_id, :index => true
21
+ text :message_type, :index => true
22
+ text :name, :index => true,:null => false
23
+ text :message
24
+ end
25
+
26
+ Marley.plugin('orm_rest_convenience').apply(Sequel::Model)
27
+ Marley.joint 'user'
28
+ Marley.plugin('current_user_methods').apply(Sequel::Model)
29
+
30
+ module Marley
31
+ module Resources
32
+ class Admin < User
33
+ def self.requires_user?; true;end
34
+ end
35
+ class Message < Sequel::Model
36
+ def validate
37
+ super
38
+ validates_presence [:name]
39
+ end
40
+ end
41
+ class Secret < Message
42
+ User.join_to(self)
43
+ def self.list_dataset
44
+ current_user_ds
45
+ end
46
+ end
47
+ class Announcement < Message
48
+ ro_cols![:current_user_role]={'reader' => [/.*/]}
49
+ def current_user_role
50
+ super || 'reader' unless User.current_user.new?
51
+ end
52
+ def actions(parent_instance=nil)
53
+ if current_user_role=='owner' && ! self.new?
54
+ {:delete => self.url}.update(super ? super : {})
55
+ else
56
+ super
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+
@@ -0,0 +1,13 @@
1
+
2
+ == The User Joint
3
+
4
+ setup
5
+ MR::User.delete
6
+ MR::Message.delete
7
+ DB[:SQLITE_SEQUENCE].delete #kinda hate this but it seems necessary for the moment
8
+ @client=Marley::TestClient.new(:resource_name => 'user')
9
+ @user=@client.read({},:method => 'new')
10
+ end
11
+
12
+ examples:
13
+
@@ -0,0 +1,120 @@
1
+
2
+ setup
3
+ @client.create(@user.set_values(:name => 'user1', :password => 'asdfasdf',:confirm_password => 'asdfasdf'))
4
+ @client.create(@user.set_values(:name => 'user2', :password => 'asdfasdf',:confirm_password => 'asdfasdf'))
5
+ @user1_auth=['user1', 'asdfasdf']
6
+ @user2_auth=['user2', 'asdfasdf']
7
+ end
8
+
9
+ examples: 2 users exist
10
+ >> MR::User.count
11
+ => 2
12
+
13
+ example: user1 logged in
14
+ >> @client.auth=@user1_auth
15
+ => ["user1", "asdfasdf"]
16
+
17
+ # Note: Date hack, defined in test_helper.rb is causing the strings to appear in the date_created/updated fields
18
+
19
+ >> @client.read
20
+ => [[:instance, {:new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 1], ["text", :name, 0, "user1"], ["text", :email, 0, nil], ["date", :birthday, 0, nil], ["datetime", :date_created, 2, "date_created"], ["text", :description, 0, nil], [:password, :old_password, 0, nil], [:password, :password, 0, nil], [:password, :confirm_password, 0, nil]], :name=>"user", :url=>"/user/1"}, []], [:instance, {:new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 2], ["text", :name, 2, "user2"], ["text", :email, 2, nil], ["date", :birthday, 2, nil], ["datetime", :date_created, 2, "date_created"], ["text", :description, 2, nil]], :name=>"user", :url=>"/user/2"}, []]]
21
+
22
+ >> @client.instance_id=1
23
+ => 1
24
+ >> @user1=@client.read
25
+ => [:instance, {:new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 1], ["text", :name, 0, "user1"], ["text", :email, 0, nil], ["date", :birthday, 0, nil], ["datetime", :date_created, 2, "date_created"], ["text", :description, 0, nil], [:password, :old_password, 0, nil], [:password, :password, 0, nil], [:password, :confirm_password, 0, nil]], :name=>"user", :url=>"/user/1"}, []]
26
+ >> @client.update(@user1)
27
+ => [:instance, {:new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 1], ["text", :name, 0, "user1"], ["text", :email, 0, nil], ["date", :birthday, 0, nil], ["datetime", :date_created, 2, "date_created"], ["text", :description, 0, nil], [:password, :old_password, 0, nil], [:password, :password, 0, nil], [:password, :confirm_password, 0, nil]], :name=>"user", :url=>"/user/1"}, []]
28
+
29
+ >> @user1=@client.read
30
+ => [:instance, {:new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 1], ["text", :name, 0, "user1"], ["text", :email, 0, nil], ["date", :birthday, 0, nil], ["datetime", :date_created, 2, "date_created"], ["text", :description, 0, nil], [:password, :old_password, 0, nil], [:password, :password, 0, nil], [:password, :confirm_password, 0, nil]], :name=>"user", :url=>"/user/1"}, []]
31
+ >> @client.update(@user1)
32
+ => [:instance, {:new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 1], ["text", :name, 0, "user1"], ["text", :email, 0, nil], ["date", :birthday, 0, nil], ["datetime", :date_created, 2, "date_created"], ["text", :description, 0, nil], [:password, :old_password, 0, nil], [:password, :password, 0, nil], [:password, :confirm_password, 0, nil]], :name=>"user", :url=>"/user/1"}, []]
33
+ >> @user1.col_value(:password, 'zxcvzxcv')
34
+ => "zxcvzxcv"
35
+ >> @client.update(@user1,{:code => 400})
36
+ => [:error, {:error_type=>"validation", :error_details=>{:old_password=>["Old Password Incorrect"], :confirm_password=>["Passwords do not match"]}, :description=>nil}]
37
+ >> @user1.set_values(:confirm_password => 'zxcvzxcv',:old_password => 'asdfasdf')
38
+ => [:instance, {:new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 1], ["text", :name, 0, "user1"], ["text", :email, 0, nil], ["date", :birthday, 0, nil], ["datetime", :date_created, 2, "date_created"], ["text", :description, 0, nil], [:password, :old_password, 0, "asdfasdf"], [:password, :password, 0, "zxcvzxcv"], [:password, :confirm_password, 0, "zxcvzxcv"]], :name=>"user", :url=>"/user/1"}, []]
39
+ >> @client.update(@user1)
40
+ => [:instance, {:new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 1], ["text", :name, 2, "user1"], ["text", :email, 2, nil], ["date", :birthday, 2, nil], ["datetime", :date_created, 2, "date_created"], ["text", :description, 2, nil]], :name=>"user", :url=>"/user/1"}, []]
41
+ >> @client.read({},:code => 401)
42
+ => [:error, {:error_type=>"authentication", :error_details=>nil, :description=>nil}]
43
+ >> @client.read({},:auth => ['user1', 'zxcvzxcv'])
44
+ => [:instance, {:new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 1], ["text", :name, 0, "user1"], ["text", :email, 0, nil], ["date", :birthday, 0, nil], ["datetime", :date_created, 2, "date_created"], ["text", :description, 0, nil], [:password, :old_password, 0, nil], [:password, :password, 0, nil], [:password, :confirm_password, 0, nil]], :name=>"user", :url=>"/user/1"}, []]
45
+
46
+ example: user1 reading/writing secrets
47
+
48
+ >> @client.auth=@user1_auth
49
+ => ["user1", "asdfasdf"]
50
+ >> @client.resource_name='secret'
51
+ => "secret"
52
+
53
+ >> @client.read
54
+ => []
55
+ >> @secret=@client.read({}, {:method => 'new'})
56
+ => [:instance, {:new_rec=>true, :actions=>nil, :schema=>[["integer", :user_id, 3, 1], ["text", :name, 4, nil], ["text", :message, 0, nil]], :name=>"secret", :url=>"/secret/"}, []]
57
+
58
+ >> @client.create(@secret, {:code => 400})
59
+ => [:error, {:error_type=>"validation", :error_details=>{:name=>["is required"]}, :description=>nil}]
60
+ >> @client.create(@secret.set_values(:name => 'this is my secret'))
61
+ => [:instance, {:new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "this is my secret"], ["text", :message, 0, nil]], :name=>"secret", :url=>"/secret/1"}, []]
62
+ >> @client.read
63
+ => [[:instance, {:new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "this is my secret"], ["text", :message, 0, nil]], :name=>"secret", :url=>"/secret/1"}, []]]
64
+ >> @client.read({},:auth => @user2_auth)
65
+ => []
66
+ >> @client.read({},:auth => @user2_auth,:instance_id => 1, :code => 403)
67
+ => [:error, {:error_type=>"authorization", :error_details=>nil, :description=>"You are not authorized for this operation"}]
68
+
69
+ example: user2 reading/writing secrets
70
+ >> @client.auth=@user2_auth
71
+ => ["user2", "asdfasdf"]
72
+ >> @client.resource_name='secret'
73
+ => "secret"
74
+ >> @client.read
75
+ => []
76
+ >> @secret=@client.read({}, {:method => 'new'})
77
+ => [:instance, {:new_rec=>true, :actions=>nil, :schema=>[["integer", :user_id, 3, 2], ["text", :name, 4, nil], ["text", :message, 0, nil]], :name=>"secret", :url=>"/secret/"}, []]
78
+ >> @client.create(@secret.set_values(:name => 'user2 my secret'))
79
+ => [:instance, {:new_rec=>false, :actions=>nil, :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 2], ["text", :name, 4, "user2 my secret"], ["text", :message, 0, nil]], :name=>"secret", :url=>"/secret/1"}, []]
80
+
81
+ >> @client.read({}, :auth => @user1_auth)
82
+ => []
83
+ >> @client.read({}, :auth => @user1_auth, :instance_id => 1,:code => 403)
84
+ => [:error, {:error_type=>"authorization", :error_details=>nil, :description=>"You are not authorized for this operation"}]
85
+
86
+ examples: announcements
87
+ >> @client.auth=@user1_auth
88
+ => ["user1", "asdfasdf"]
89
+ >> @client.resource_name='announcement'
90
+ => "announcement"
91
+ >> @client.read
92
+ => []
93
+
94
+ >> @announcement=@client.read({},{:method => 'new'})
95
+ => [:instance, {:new_rec=>true, :actions=>nil, :schema=>[["integer", :user_id, 3, 1], ["text", :name, 4, nil], ["text", :message, 0, nil]], :name=>"announcement", :url=>"/announcement/"}, []]
96
+ >> @client.create(@announcement.set_values({:name => 'user1 announcement'}))
97
+ => [:instance, {:new_rec=>false, :actions=>{:delete=>"/announcement/1"}, :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 announcement"], ["text", :message, 0, nil]], :name=>"announcement", :url=>"/announcement/1"}, []]
98
+ >> @client.read
99
+ => [[:instance, {:new_rec=>false, :actions=>{:delete=>"/announcement/1"}, :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 announcement"], ["text", :message, 0, nil]], :name=>"announcement", :url=>"/announcement/1"}, []]]
100
+ >> @client.create(@announcement.set_values({:name => 'user1 announcement2'}))
101
+ => [:instance, {:new_rec=>false, :actions=>{:delete=>"/announcement/2"}, :schema=>[["integer", :id, 2, 2], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 announcement2"], ["text", :message, 0, nil]], :name=>"announcement", :url=>"/announcement/2"}, []]
102
+ >> @client.read
103
+ => [[:instance, {:new_rec=>false, :actions=>{:delete=>"/announcement/1"}, :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 announcement"], ["text", :message, 0, nil]], :name=>"announcement", :url=>"/announcement/1"}, []], [:instance, {:new_rec=>false, :actions=>{:delete=>"/announcement/2"}, :schema=>[["integer", :id, 2, 2], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 announcement2"], ["text", :message, 0, nil]], :name=>"announcement", :url=>"/announcement/2"}, []]]
104
+
105
+ >> @client.auth=@user2_auth
106
+ => ["user2", "asdfasdf"]
107
+ >> @client.read
108
+ => [[:instance, {:url=>"/announcement/1", :new_rec=>false, :actions=>nil, :name=>"announcement", :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 6, "user1 announcement"], ["text", :message, 2, nil]]}, []], [:instance, {:url=>"/announcement/2", :new_rec=>false, :actions=>nil, :name=>"announcement", :schema=>[["integer", :id, 2, 2], ["integer", :user_id, 3, 1], ["text", :name, 6, "user1 announcement2"], ["text", :message, 2, nil]]}, []]]
109
+
110
+ >> @client.read
111
+ => [[:instance, {:url=>"/announcement/1", :new_rec=>false, :actions=>nil, :name=>"announcement", :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 6, "user1 announcement"], ["text", :message, 2, nil]]}, []], [:instance, {:url=>"/announcement/2", :new_rec=>false, :actions=>nil, :name=>"announcement", :schema=>[["integer", :id, 2, 2], ["integer", :user_id, 3, 1], ["text", :name, 6, "user1 announcement2"], ["text", :message, 2, nil]]}, []]]
112
+ >> @announcement=@client.read({},{:method => 'new'})
113
+ => [:instance, {:url=>"/announcement/", :new_rec=>true, :actions=>nil, :name=>"announcement", :schema=>[["integer", :user_id, 3, 2], ["text", :name, 4, nil], ["text", :message, 0, nil]]}, []]
114
+ >> @client.create(@announcement.set_values({:name => 'user2 announcement'}))
115
+ => [:instance, {:url=>"/announcement/3", :new_rec=>false, :actions=>{:delete=>"/announcement/3"}, :name=>"announcement", :schema=>[["integer", :id, 2, 3], ["integer", :user_id, 3, 2], ["text", :name, 4, "user2 announcement"], ["text", :message, 0, nil]]}, []]
116
+ >> @client.read
117
+ => [[:instance, {:url=>"/announcement/1", :new_rec=>false, :actions=>nil, :name=>"announcement", :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 6, "user1 announcement"], ["text", :message, 2, nil]]}, []], [:instance, {:url=>"/announcement/2", :new_rec=>false, :actions=>nil, :name=>"announcement", :schema=>[["integer", :id, 2, 2], ["integer", :user_id, 3, 1], ["text", :name, 6, "user1 announcement2"], ["text", :message, 2, nil]]}, []], [:instance, {:url=>"/announcement/3", :new_rec=>false, :actions=>{:delete=>"/announcement/3"}, :name=>"announcement", :schema=>[["integer", :id, 2, 3], ["integer", :user_id, 3, 2], ["text", :name, 4, "user2 announcement"], ["text", :message, 0, nil]]}, []]]
118
+ >> @client.read({}, :auth => @user1_auth)
119
+ => [[:instance, {:url=>"/announcement/1", :new_rec=>false, :actions=>{:delete=>"/announcement/1"}, :name=>"announcement", :schema=>[["integer", :id, 2, 1], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 announcement"], ["text", :message, 0, nil]]}, []], [:instance, {:url=>"/announcement/2", :new_rec=>false, :actions=>{:delete=>"/announcement/2"}, :name=>"announcement", :schema=>[["integer", :id, 2, 2], ["integer", :user_id, 3, 1], ["text", :name, 4, "user1 announcement2"], ["text", :message, 0, nil]]}, []], [:instance, {:url=>"/announcement/3", :new_rec=>false, :actions=>nil, :name=>"announcement", :schema=>[["integer", :id, 2, 3], ["integer", :user_id, 3, 2], ["text", :name, 6, "user2 announcement"], ["text", :message, 2, nil]]}, []]]
120
+
@@ -0,0 +1,34 @@
1
+
2
+ example: read new user form but not user list
3
+ >> @client.read({},:code => 401)
4
+ => [:error, {:error_type=>"authentication", :error_details=>nil, :description=>nil}]
5
+ >> @client.read({},:method => 'new')
6
+ => [:instance, {:new_rec=>true, :actions=>nil, :schema=>[["text", :name, 0, nil], ["text", :email, 0, nil], ["date", :birthday, 0, nil], ["text", :description, 0, nil], [:password, :password, 4, nil], [:password, :confirm_password, 4, nil]], :name=>"user", :url=>"/user/"}, []]
7
+
8
+
9
+ example: user validation
10
+ >> @client.create({}, :code => 400)
11
+ => [:error, {:error_type=>"validation", :error_details=>{:name=>["is required"], :password=>["Password must contain at least 8 characters"]}, :description=>nil}]
12
+ >> @client.create(@user.set_values(:name => 'asdf', :password => 'asdfasdf',:confirm_password => 'asdfasdf'))
13
+ => [:msg, {:title=>"Success!"}, "Your login, 'asdf', has been sucessfully created. You can now log in."]
14
+
15
+
16
+ example: cannot list any other resources
17
+ >> @client.read({},{:resource_name => 'secrets',:code => 401})
18
+ => [:error, {:error_type=>"authentication", :error_details=>nil, :description=>nil}]
19
+ >> @client.read({},{:resource_name => 'announcements',:code => 401})
20
+ => [:error, {:error_type=>"authentication", :error_details=>nil, :description=>nil}]
21
+
22
+ example: non-existent resource yields 401, not 404
23
+ >> @client.read({},{:resource_name => 'xxx',:code => 401})
24
+ => [:error, {:error_type=>"authentication", :error_details=>nil, :description=>nil}]
25
+
26
+ example: unable to create admin user
27
+ >> @client.create(@user.set_values(:name => 'admin',:password => 'asdfasdf',:confirm_password => 'asdfasdf'),:resource_name => 'admin', :code=> 401)
28
+ => [:error, {:error_type=>"authentication", :error_details=>nil, :description=>nil}]
29
+
30
+ >> @client.create(@user.set_values(:name => 'admin',:password => 'asdfasdf',:confirm_password => 'asdfasdf').to_params.update("user[user_type]" => 'Admin'),:code => 403)
31
+ => [:error, {:error_type=>"authorization", :error_details=>nil, :description=>"You are not authorized for this operation"}]
32
+
33
+
34
+
data/reggae.ebnf CHANGED
@@ -11,7 +11,7 @@ property ::= section_property | link_property | instance_property |instance_lis
11
11
 
12
12
  value ::= title_value | description_value | navigation_value | name_value | new_rec_value | search_value | schema_value | get_actions_value | delete_action_value | items_value | col_value | error_type_value | error_details_value |
13
13
 
14
- section_property ::= 'title' | 'description' | 'navigation'
14
+ section_property ::= 'name' | 'title' | 'description' | 'navigation'
15
15
 
16
16
  link_property ::= 'title' | 'description' | 'url'
17
17
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marley
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Herb Daily
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2011-12-01 00:00:00 -03:00
12
+ date: 2012-02-22 00:00:00 -03:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -50,9 +50,9 @@ dependencies:
50
50
  requirements:
51
51
  - - ~>
52
52
  - !ruby/object:Gem::Version
53
- version: 0.12.1
53
+ version: 0.13.4
54
54
  version:
55
- description: "Marley implements a web services framework on top of Rack and Sequel on the server side and Jquery on the client side. "
55
+ description: "Marley is a framework for quickly building RESTful web services and applications. Development is fast because Marley implements lots of sensible defaults, all of which can be overridden and most of which can be overridden easily. "
56
56
  email: herb.daily@safe-mail.net
57
57
  executables: []
58
58
 
@@ -61,46 +61,54 @@ extensions: []
61
61
  extra_rdoc_files: []
62
62
 
63
63
  files:
64
- - marley.gemspec
65
- - Rakefile
66
- - Favicon.ico
67
64
  - README.rdoc
68
- - TODO
69
65
  - reggae.ebnf
70
- - marley-0.4.0.gem
71
66
  - lib/marley.rb
67
+ - lib/marley/core_ext.rb
72
68
  - lib/marley/test_helpers.rb
69
+ - lib/marley/plugin.rb
70
+ - lib/marley/resources.rb
71
+ - lib/marley/router.rb
72
+ - lib/marley/joints/forum.rb
73
+ - lib/marley/joints/messages.rb
74
+ - lib/marley/joints/section.rb
75
+ - lib/marley/joints/user.rb
76
+ - lib/marley/joints/tags.rb
73
77
  - lib/marley/utils.rb
74
78
  - lib/marley/joint.rb
79
+ - lib/marley/plugins/orm_rest_convenience.rb
80
+ - lib/marley/plugins/rest_convenience.rb
75
81
  - lib/marley/controllers.rb
82
+ - lib/marley/errors.rb
76
83
  - lib/marley/reggae.rb
77
- - lib/sequel/plugins/rest_convenience.rb
78
- - lib/sequel/plugins/rest_auth.rb
79
- - lib/client/jamaica.css
80
- - lib/client/jquery-1.6.2.js
81
- - lib/client/jamaica.rb
82
- - lib/client/jamaica.js
83
- - lib/client/jquery.form.js
84
- - lib/joints/basic_messaging.rb
85
- - lib/joints/basic_user.rb
86
- - lib/joints/tagging.rb
87
- - lib/joints/basic_menu_system.rb
88
- - lib/joints/tagged_messaging.rb
89
- - examples/forum.js
90
- - examples/forum.sql
91
- - examples/blog.rb
92
- - examples/forum.rb
93
- - examples/forum.sqlite3
94
- - examples/forum_test.sqlite3
95
- - examples/empty.sqlite3
96
- - examples/forum.css
97
- - examples/run.sh
98
- - test/menu_tests.rb
99
- - test/test_include.rb
100
- - test/empty.sqlite3
101
- - test/user_tests.rb
102
- - test/test.sqlite3
103
- - test/tagged_messaging_tests.rb
84
+ - rdoc/orm_rest_convenience_plugin.rb
85
+ - rdoc/section_joint.rb
86
+ - rdoc/forum_joint.rb
87
+ - rdoc/tags_joint.rdoc
88
+ - rdoc/user_joint/no_auth_provided.rdoc
89
+ - rdoc/user_joint/exiting_users.rdoc
90
+ - rdoc/messages_joint.rb
91
+ - rdoc/messages_joint.rdoc
92
+ - rdoc/hello.rb
93
+ - rdoc/section_joint.rdoc
94
+ - rdoc/user_joint.rdoc
95
+ - rdoc/example_plugin.rb
96
+ - rdoc/plugins.rdoc
97
+ - rdoc/example_joint.rb
98
+ - rdoc/messages_joint/private_messages.rdoc
99
+ - rdoc/messages_joint/public_messages.rdoc
100
+ - rdoc/forum_joint.rdoc
101
+ - rdoc/orm_rest_convenience_plugin.rdoc
102
+ - rdoc/reggae/generate.rdoc
103
+ - rdoc/reggae/parse.rdoc
104
+ - rdoc/user_joint.rb
105
+ - rdoc/joints.rdoc
106
+ - rdoc/hello.rdoc
107
+ - rdoc/tags_joint.rb
108
+ - rdoc/tags_joint/announcements.rdoc
109
+ - rdoc/tags_joint/secrets.rdoc
110
+ - rdoc/reggae.rb
111
+ - rdoc/reggae.rdoc
104
112
  has_rdoc: true
105
113
  homepage: http://github.com/herbdaily/marley
106
114
  licenses: []
@@ -128,6 +136,6 @@ rubyforge_project:
128
136
  rubygems_version: 1.3.5
129
137
  signing_key:
130
138
  specification_version: 3
131
- summary: Irie default restful routes for your models and other objects
139
+ summary: Irie default restful routes for models and other objects
132
140
  test_files: []
133
141