rlmattax-restfulx 1.2.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. data/README.rdoc +50 -0
  2. data/Rakefile +79 -0
  3. data/VERSION.yml +4 -0
  4. data/app_generators/rx_app/USAGE +22 -0
  5. data/app_generators/rx_app/rx_app_generator.rb +110 -0
  6. data/app_generators/rx_app/templates/actionscript.properties +16 -0
  7. data/app_generators/rx_app/templates/actionscriptair.properties +16 -0
  8. data/app_generators/rx_app/templates/app.yaml.erb +12 -0
  9. data/app_generators/rx_app/templates/default_tasks.rake +38 -0
  10. data/app_generators/rx_app/templates/empty.txt +0 -0
  11. data/app_generators/rx_app/templates/expressInstall.swf +0 -0
  12. data/app_generators/rx_app/templates/flex.properties +2 -0
  13. data/app_generators/rx_app/templates/generate.rb +17 -0
  14. data/app_generators/rx_app/templates/html-template/AC_OETags.js +276 -0
  15. data/app_generators/rx_app/templates/html-template/history/history.css +6 -0
  16. data/app_generators/rx_app/templates/html-template/history/history.js +645 -0
  17. data/app_generators/rx_app/templates/html-template/history/historyFrame.html +29 -0
  18. data/app_generators/rx_app/templates/html-template/index.template.html +121 -0
  19. data/app_generators/rx_app/templates/html-template/playerProductInstall.swf +0 -0
  20. data/app_generators/rx_app/templates/index.html.erb +18 -0
  21. data/app_generators/rx_app/templates/index.yaml +11 -0
  22. data/app_generators/rx_app/templates/mainair-app.xml +134 -0
  23. data/app_generators/rx_app/templates/mainapp-config.xml +22 -0
  24. data/app_generators/rx_app/templates/mainapp.mxml +152 -0
  25. data/app_generators/rx_app/templates/project-textmate.erb +72 -0
  26. data/app_generators/rx_app/templates/project.properties +18 -0
  27. data/app_generators/rx_app/templates/projectair.properties +24 -0
  28. data/app_generators/rx_app/templates/restfulx.yml +46 -0
  29. data/app_generators/rx_app/templates/swfobject.js +5 -0
  30. data/bin/rx-gen +31 -0
  31. data/lib/restfulx.rb +90 -0
  32. data/lib/restfulx/active_foo.rb +181 -0
  33. data/lib/restfulx/active_record_tasks.rb +90 -0
  34. data/lib/restfulx/active_record_uuid_helper.rb +17 -0
  35. data/lib/restfulx/configuration.rb +75 -0
  36. data/lib/restfulx/datamapper_foo.rb +81 -0
  37. data/lib/restfulx/rails/recipes.rb +60 -0
  38. data/lib/restfulx/rails/schema_to_yaml.rb +111 -0
  39. data/lib/restfulx/rails/schema_to_yaml/extensions/enumerable.rb +8 -0
  40. data/lib/restfulx/rails/schema_to_yaml/settings/config.rb +17 -0
  41. data/lib/restfulx/rails/schema_to_yaml/settings/core.rb +73 -0
  42. data/lib/restfulx/rails/swf_helper.rb +59 -0
  43. data/lib/restfulx/tasks.rb +110 -0
  44. data/rails_generators/rx_config/USAGE +19 -0
  45. data/rails_generators/rx_config/rx_config_generator.rb +151 -0
  46. data/rails_generators/rx_config/templates/actionscript.properties +16 -0
  47. data/rails_generators/rx_config/templates/actionscriptair.properties +16 -0
  48. data/rails_generators/rx_config/templates/expressInstall.swf +0 -0
  49. data/rails_generators/rx_config/templates/flex.properties +2 -0
  50. data/rails_generators/rx_config/templates/flex_controller.erb +4 -0
  51. data/rails_generators/rx_config/templates/html-template/AC_OETags.js +276 -0
  52. data/rails_generators/rx_config/templates/html-template/history/history.css +6 -0
  53. data/rails_generators/rx_config/templates/html-template/history/history.js +645 -0
  54. data/rails_generators/rx_config/templates/html-template/history/historyFrame.html +29 -0
  55. data/rails_generators/rx_config/templates/html-template/index.template.html +121 -0
  56. data/rails_generators/rx_config/templates/html-template/playerProductInstall.swf +0 -0
  57. data/rails_generators/rx_config/templates/index.erb +16 -0
  58. data/rails_generators/rx_config/templates/mainair-app.xml +134 -0
  59. data/rails_generators/rx_config/templates/mainapp-config.xml +22 -0
  60. data/rails_generators/rx_config/templates/mainapp.mxml +129 -0
  61. data/rails_generators/rx_config/templates/project-textmate.erb +72 -0
  62. data/rails_generators/rx_config/templates/project.properties +18 -0
  63. data/rails_generators/rx_config/templates/projectair.properties +24 -0
  64. data/rails_generators/rx_config/templates/restfulx.erb +75 -0
  65. data/rails_generators/rx_config/templates/restfulx.yml +65 -0
  66. data/rails_generators/rx_config/templates/restfulx_tasks.rake +9 -0
  67. data/rails_generators/rx_config/templates/routes.erb +47 -0
  68. data/rails_generators/rx_config/templates/session_store_flash.erb +1 -0
  69. data/rails_generators/rx_config/templates/swfobject.js +5 -0
  70. data/rails_generators/rx_controller/USAGE +10 -0
  71. data/rails_generators/rx_controller/rx_controller_generator.rb +31 -0
  72. data/rails_generators/rx_controller/templates/controller.as.erb +38 -0
  73. data/rails_generators/rx_main_app/USAGE +8 -0
  74. data/rails_generators/rx_main_app/rx_main_app_generator.rb +60 -0
  75. data/rails_generators/rx_main_app/templates/mainapp.mxml +129 -0
  76. data/rails_generators/rx_scaffold/USAGE +35 -0
  77. data/rails_generators/rx_scaffold/rx_scaffold_generator.rb +242 -0
  78. data/rails_generators/rx_scaffold/templates/controllers/default.rb.erb +125 -0
  79. data/rails_generators/rx_scaffold/templates/controllers/resource_controller.rb.erb +23 -0
  80. data/rails_generators/rx_scaffold/templates/fixtures.yml.erb +39 -0
  81. data/rails_generators/rx_scaffold/templates/functional_test.rb +45 -0
  82. data/rails_generators/rx_scaffold/templates/helper_test.rb +4 -0
  83. data/rails_generators/rx_scaffold/templates/layouts/default.erb +167 -0
  84. data/rails_generators/rx_scaffold/templates/migration.rb.erb +46 -0
  85. data/rails_generators/rx_scaffold/templates/model.as.erb +73 -0
  86. data/rails_generators/rx_scaffold/templates/model.rb.erb +46 -0
  87. data/rails_generators/rx_yaml_scaffold/USAGE +51 -0
  88. data/rails_generators/rx_yaml_scaffold/rx_yaml_scaffold_generator.rb +68 -0
  89. data/rxgen_generators/rx_config/USAGE +5 -0
  90. data/rxgen_generators/rx_config/rx_config_generator.rb +21 -0
  91. data/rxgen_generators/rx_controller/USAGE +10 -0
  92. data/rxgen_generators/rx_controller/rx_controller_generator.rb +41 -0
  93. data/rxgen_generators/rx_controller/templates/assist.py +65 -0
  94. data/rxgen_generators/rx_controller/templates/controller.as.erb +38 -0
  95. data/rxgen_generators/rx_controller/templates/iso8601.py +92 -0
  96. data/rxgen_generators/rx_controller/templates/restful.py +136 -0
  97. data/rxgen_generators/rx_main_app/USAGE +8 -0
  98. data/rxgen_generators/rx_main_app/rx_main_app_generator.rb +65 -0
  99. data/rxgen_generators/rx_main_app/templates/main.py.erb +29 -0
  100. data/rxgen_generators/rx_main_app/templates/mainapp.mxml +152 -0
  101. data/rxgen_generators/rx_scaffold/USAGE +29 -0
  102. data/rxgen_generators/rx_scaffold/rx_scaffold_generator.rb +194 -0
  103. data/rxgen_generators/rx_scaffold/templates/controller.py.erb +27 -0
  104. data/rxgen_generators/rx_scaffold/templates/layouts/default.erb +167 -0
  105. data/rxgen_generators/rx_scaffold/templates/model.as.erb +73 -0
  106. data/rxgen_generators/rx_scaffold/templates/model.py.erb +14 -0
  107. data/rxgen_generators/rx_yaml_scaffold/USAGE +45 -0
  108. data/rxgen_generators/rx_yaml_scaffold/rx_yaml_scaffold_generator.rb +47 -0
  109. data/spec/restfulx_spec.rb +4 -0
  110. data/spec/spec_helper.rb +13 -0
  111. data/tasks/restfulx.rake +2 -0
  112. data/test/rails/controllers/application_controller.rb +15 -0
  113. data/test/rails/controllers/locations_controller.rb +93 -0
  114. data/test/rails/controllers/notes_controller.rb +96 -0
  115. data/test/rails/controllers/projects_controller.rb +93 -0
  116. data/test/rails/controllers/tasks_controller.rb +93 -0
  117. data/test/rails/controllers/users_controller.rb +93 -0
  118. data/test/rails/database.yml +4 -0
  119. data/test/rails/fixtures/locations.yml +8 -0
  120. data/test/rails/fixtures/notes.yml +17 -0
  121. data/test/rails/fixtures/projects.yml +25 -0
  122. data/test/rails/fixtures/simple_properties.yml +19 -0
  123. data/test/rails/fixtures/tasks.yml +46 -0
  124. data/test/rails/fixtures/users.yml +13 -0
  125. data/test/rails/helpers/functional_test_helper.rb +21 -0
  126. data/test/rails/helpers/test_helper.rb +54 -0
  127. data/test/rails/helpers/unit_test_helper.rb +29 -0
  128. data/test/rails/model.yml +35 -0
  129. data/test/rails/models/location.rb +4 -0
  130. data/test/rails/models/note.rb +3 -0
  131. data/test/rails/models/project.rb +4 -0
  132. data/test/rails/models/simple_property.rb +2 -0
  133. data/test/rails/models/task.rb +18 -0
  134. data/test/rails/models/user.rb +20 -0
  135. data/test/rails/schema.rb +77 -0
  136. data/test/rails/test.swf +1 -0
  137. data/test/rails/test_active_foo.rb +36 -0
  138. data/test/rails/test_rails_integration_functional.rb +22 -0
  139. data/test/rails/test_to_fxml.rb +35 -0
  140. data/test/rails/test_to_json.rb +23 -0
  141. data/test/rails/views/notes/empty_params_action.html.erb +1 -0
  142. data/test/rails/views/notes/index.html.erb +1 -0
  143. metadata +234 -0
@@ -0,0 +1,27 @@
1
+ import restful
2
+ import logging
3
+
4
+ from google.appengine.ext import webapp
5
+ from google.appengine.api import users
6
+ from google.appengine.ext import db
7
+ from app.models import assist, <%= file_name %>
8
+
9
+ class Controller(restful.Controller):
10
+ def get(self):
11
+ restful.send_successful_response(self, assist.all(<%= file_name %>.<%= class_name %>))
12
+
13
+ @restful.methods_via_query_allowed
14
+ def post(self):
15
+ model = <%= file_name %>.<%= class_name %>()
16
+ assist.update_model_from_params(model, self.request.params)
17
+ restful.send_successful_response(self, model.to_xml())
18
+
19
+ def put(self):
20
+ model = <%= file_name %>.<%= class_name %>.get(db.Key(restful.get_model_key(self)))
21
+ assist.update_model_from_params(model, self.request.params)
22
+ restful.send_successful_response(self, model.to_xml())
23
+
24
+ def delete(self):
25
+ model = <%= file_name %>.<%= class_name %>.get(db.Key(restful.get_model_key(self)))
26
+ db.delete(model)
27
+ restful.send_successful_response(self, model.to_xml())
@@ -0,0 +1,167 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" label="<%= class_name %>"
3
+ xmlns:rx="org.restfulx.components.rx.*">
4
+ <mx:Script><![CDATA[
5
+ import org.restfulx.Rx;
6
+ import org.restfulx.utils.RxUtils;
7
+ import <%= base_package %>.models.<%= class_name %>;
8
+ <% for model in belongs_tos -%>
9
+ import <%= base_package %>.models.<%= model.camelcase %>;
10
+ <% end -%>
11
+ <% if attachment_field.size > 0 -%>
12
+ import flash.net.FileReference;
13
+ import org.restfulx.utils.RxFileReference;
14
+ <% end -%>
15
+
16
+ [Bindable]
17
+ private var <%= class_name.dcfirst %>:<%= class_name %> = new <%= class_name %>();
18
+ <% if attachment_field.size > 0 -%>
19
+
20
+ [Bindable]
21
+ private var fileName:String = "None selected";
22
+
23
+ private var file:RxFileReference;
24
+ <% end -%>
25
+
26
+ private function new<%= class_name %>():void {
27
+ <%= class_name.dcfirst %> = new <%= class_name %>();
28
+ <%= class_name.dcfirst.pluralize %>List.selectedIndex = -1;
29
+ }
30
+
31
+ private function save<%= class_name %>():void {
32
+ updateModelProperties();
33
+ if (<%= class_name.dcfirst %>.id) {
34
+ <%= class_name.dcfirst %>.update({onSuccess: on<%= class_name %>Update});
35
+ } else {
36
+ <%= class_name.dcfirst %>.create({onSuccess: on<%= class_name %>Create});
37
+ }
38
+ }
39
+
40
+ private function updateModelProperties():void {
41
+ <% for attribute in attributes -%>
42
+ <% if attribute.type == :boolean -%>
43
+ <%= class_name.dcfirst %>.<%= attribute.flex_name %> = <%= attribute.flex_name %>CheckBox.selected;
44
+ <% elsif attribute.type == :string -%>
45
+ <%= class_name.dcfirst %>.<%= attribute.flex_name %> = <%= attribute.flex_name %>TextInput.text;
46
+ <% elsif attribute.type == :text -%>
47
+ <%= class_name.dcfirst %>.<%= attribute.flex_name %> = <%= attribute.flex_name %>TextArea.text;
48
+ <% elsif attribute.type == :datetime || attribute.type == :time -%>
49
+ <%= class_name.dcfirst %>.<%= attribute.flex_name %> = <%= attribute.flex_name %>DateTimeTextInput.date;
50
+ <% elsif attribute.type == :date -%>
51
+ <%= class_name.dcfirst %>.<%= attribute.flex_name %> = <%= attribute.flex_name %>DateField.selectedDate;
52
+ <% else -%>
53
+ <%= class_name.dcfirst %>.<%= attribute.flex_name %> = <%= attribute.flex_type %>(<%= attribute.flex_name %>TextInput.text);
54
+ <% end -%>
55
+ <% end -%>
56
+ <% for model in belongs_tos -%>
57
+ <%= class_name.dcfirst %>.<%= model.camelcase(:lower) %> = <%= model.camelcase %>(<%= model.camelcase(:lower) %>ComboBox.selectedItem);
58
+ <% end -%>
59
+ <% if attachment_field.size > 0 -%>
60
+ <%= class_name.dcfirst %>.attachment = file;
61
+ <% end -%>
62
+ }
63
+
64
+ private function destroy<%= class_name %>():void {
65
+ <%= class_name.dcfirst %>.destroy({onSuccess: on<%= class_name %>Destroy});
66
+ }
67
+
68
+ private function on<%= class_name %>Select():void {
69
+ <%= class_name.dcfirst %> = RxUtils.clone(<%= class_name.dcfirst.pluralize %>List.selectedItem) as <%= class_name %>;
70
+ }
71
+
72
+ private function on<%= class_name %>Create(result:<%= class_name %>):void {
73
+ <%= class_name.dcfirst %> = new <%= class_name %>;
74
+ }
75
+
76
+ private function on<%= class_name %>Update(result:<%= class_name %>):void {
77
+ <%= class_name.dcfirst.pluralize %>List.selectedItem = result;
78
+ on<%= class_name %>Select();
79
+ }
80
+
81
+ private function on<%= class_name %>Destroy(result:<%= class_name %>):void {
82
+ on<%= class_name %>Create(result);
83
+ }
84
+ <% if attachment_field.size > 0 -%>
85
+
86
+ private function chooseFile():void {
87
+ file = new RxFileReference("<%= attachment_field[0].camelcase(:lower) %>");
88
+ file.reference.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler, false, 0, true);
89
+ file.reference.addEventListener(Event.SELECT, selectFile, false, 0, true);
90
+ file.reference.addEventListener(Event.CANCEL, cancelBrowse, false, 0, true);
91
+ file.reference.browse();
92
+ }
93
+
94
+ private function selectFile(event:Event):void {
95
+ fileSelected(event)
96
+ }
97
+
98
+ private function cancelBrowse(event:Event):void {
99
+ file = null;
100
+ }
101
+
102
+ private function fileSelected(event:Event):void {
103
+ fileName = FileReference(event.target).name;
104
+ }
105
+
106
+ private function ioErrorHandler(event:Event):void {
107
+ fileChooser.errorString = "Failed to selected a file. Please try again.";
108
+ }
109
+ <% end -%>
110
+ ]]></mx:Script>
111
+ <mx:Panel id="<%= class_name.dcfirst.pluralize %>Panel"
112
+ title="<%= class_name.pluralize %>" cornerRadius="0" dropShadowEnabled="false" borderStyle="solid"
113
+ borderThickness="1" backgroundColor="#EEEEEE" width="25%" height="100%">
114
+ <mx:List id="<%= class_name.dcfirst.pluralize %>List"
115
+ width="100%" height="100%"
116
+ dataProvider="{Rx.models.index(<%= class_name %>)}"
117
+ change="on<%= class_name %>Select()"/>
118
+ <mx:ControlBar width="100%">
119
+ <mx:Button label="New <%= class_name %>" width="100%" height="30"
120
+ click="new<%= class_name %>()"/>
121
+ </mx:ControlBar>
122
+ </mx:Panel>
123
+ <mx:Panel title="Edit <%= class_name %>" cornerRadius="0" dropShadowEnabled="false" borderStyle="solid"
124
+ borderThickness="1" backgroundColor="#EEEEEE" width="75%" height="100%">
125
+ <mx:Form width="100%" height="100%">
126
+ <% for attribute in attributes -%>
127
+ <mx:FormItem label="<%= attribute.flex_name.ucfirst %>" width="100%">
128
+ <% if attribute.type == :boolean -%>
129
+ <mx:CheckBox id="<%= attribute.flex_name %>CheckBox" selected="{<%= class_name.dcfirst %>.<%= attribute.flex_name %>}"/>
130
+ <% elsif attribute.type == :string -%>
131
+ <mx:TextInput id="<%= attribute.flex_name %>TextInput" width="100%" text="{<%= class_name.dcfirst %>.<%= attribute.flex_name %>}"/>
132
+ <% elsif attribute.type == :text -%>
133
+ <mx:TextArea id="<%= attribute.flex_name %>TextArea" width="100%" height="200" text="{<%= class_name.dcfirst %>.<%= attribute.flex_name %>}"/>
134
+ <% elsif attribute.type == :datetime || attribute.type == :time -%>
135
+ <rx:DateTimeTextInput id="<%= attribute.flex_name %>DateTimeTextInput" width="200" date="{<%= class_name.dcfirst %>.<%= attribute.flex_name %>}"/>
136
+ <% elsif attribute.type == :date -%>
137
+ <mx:DateField id="<%= attribute.flex_name %>DateField" selectedDate="{<%= class_name.dcfirst %>.<%= attribute.flex_name %>}"/>
138
+ <% else -%>
139
+ <mx:TextInput id="<%= attribute.flex_name %>TextInput" width="100%" text="{<%= class_name.dcfirst %>.<%= attribute.flex_name %>}"/>
140
+ <% end -%>
141
+ </mx:FormItem>
142
+ <% end -%>
143
+ <% if attachment_field.size > 0 -%>
144
+ <mx:FormItem label="<%= attachment_field[0].camelcase %>:" width="100%" id="fileChooser">
145
+ <mx:Button label="Browse…" id="fileBrowseButton" click="chooseFile()"/>
146
+ <mx:Label text="{fileName}" maxWidth="190"/>
147
+ <mx:Image source="{<%= class_name.dcfirst %>.attachmentUrl}"/>
148
+ </mx:FormItem>
149
+ <% end -%>
150
+ <% for model in belongs_tos -%>
151
+ <mx:FormItem label="<%= model.camelcase %>" width="100%">
152
+ <mx:ComboBox id="<%= model.camelcase(:lower) %>ComboBox" width="200"
153
+ labelField="{<%= model.camelcase %>.LABEL}"
154
+ dataProvider="{Rx.models.index(<%= model.camelcase %>)}" prompt="<%= model.camelcase %> ..."
155
+ selectedItem="{<%= class_name.dcfirst %>.<%= model.camelcase(:lower) %>}"/>
156
+ </mx:FormItem>
157
+ <% end -%>
158
+ </mx:Form>
159
+ <mx:ControlBar width="100%">
160
+ <mx:Button label="Save <%= class_name %>" width="50%" height="30"
161
+ click="save<%= class_name %>()"/>
162
+ <mx:Button label="Delete <%= class_name %>" width="50%" height="30"
163
+ enabled="{RxUtils.canDeleteModel(<%= class_name.dcfirst %>)}"
164
+ click="destroy<%= class_name %>()"/>
165
+ </mx:ControlBar>
166
+ </mx:Panel>
167
+ </mx:HBox>
@@ -0,0 +1,73 @@
1
+ package <%= base_package %>.models {
2
+ <% if has_manies.length > 0 || has_many_through.length > 0 -%>
3
+ import org.restfulx.collections.ModelsCollection;
4
+ <% end -%>
5
+ <% if tree_model.size > 0 -%>
6
+ <% @tree_or_no_tree = 'RxTreeModel' %>
7
+ import org.restfulx.models.RxTreeModel
8
+ <% end -%>
9
+ <% unless tree_model.size > 0 -%>
10
+ <% @tree_or_no_tree = 'RxModel' %>
11
+ import org.restfulx.models.RxModel;
12
+ <% end -%>
13
+
14
+ [Resource(name="<%= resource_controller_name %>")]
15
+ [Bindable]
16
+ public class <%= class_name %> extends <%= @tree_or_no_tree %> {
17
+ <% if attributes && !attributes.empty? && attributes[0].flex_type != "Boolean" -%>
18
+ public static const LABEL:String = "<%= attributes[0].flex_name %>";
19
+ <% else -%>
20
+ public static const LABEL:String = "id";
21
+ <% end -%>
22
+
23
+ <% for attribute in attributes -%>
24
+ <% if attribute.type == :datetime || attribute.type == :time -%>
25
+ [DateTime]
26
+ <% end -%>
27
+ public var <%= attribute.flex_name %>:<%= attribute.flex_type %> = <%= attribute.flex_default %>;
28
+
29
+ <% end -%>
30
+ <% for model in belongs_tos -%>
31
+ [BelongsTo]
32
+ public var <%= model.camelcase(:lower) %>:<%= model.camelcase %>;
33
+
34
+ <% end -%>
35
+ <% if tree_model.size > 0 -%>
36
+ [BelongsTo]
37
+ public var <%= tree_model[0].camelcase(:lower) %>:<%= class_name %>;
38
+
39
+ <% end -%>
40
+ <% for model in polymorphic -%>
41
+ [BelongsTo(polymorphic="true", dependsOn="Model1, Model2")]
42
+ public var <%= model.camelcase(:lower) %>:Object;
43
+
44
+ <% end -%>
45
+ <% if has_many_through.size > 0 -%>
46
+ <% has_many_through.each do |k,v| %>
47
+ [HasMany]
48
+ public var <%= k.camelcase(:lower) %>:ModelsCollection;
49
+
50
+ [HasMany(through="<%= k.camelcase %>")]
51
+ public var <%= v.camelcase(:lower) %>:ModelsCollection;
52
+ <% end -%>
53
+ <% end -%>
54
+ <% for model in has_ones -%>
55
+ [HasOne]
56
+ public var <%= model.camelcase(:lower) %>:<%= model.camelcase %>;
57
+
58
+ <% end -%>
59
+ <% for model in has_manies -%>
60
+ [HasMany]
61
+ public var <%= model.camelcase(:lower) %>:ModelsCollection;
62
+
63
+ <% end -%>
64
+ <% if attachment_field.size > 0 -%>
65
+ [Ignored]
66
+ public var attachmentUrl:String;
67
+
68
+ <% end -%>
69
+ public function <%= class_name %>() {
70
+ super(LABEL);
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,14 @@
1
+ from google.appengine.ext import db
2
+ <% if belongs_tos.length > 0 -%>
3
+ import <%= belongs_tos.join(", ") %>
4
+ <% end -%>
5
+
6
+ class <%= class_name %>(db.Model):
7
+ <% for attribute in attributes -%>
8
+ <%= attribute.name %> = db.<%= attribute.gae_type %>(<%= attribute.gae_default %>)
9
+ <% end -%>
10
+ <% for model in belongs_tos -%>
11
+ <%= model %> = db.ReferenceProperty(<%= model %>.<%= model.camelcase %>)
12
+ <% end -%>
13
+
14
+
@@ -0,0 +1,45 @@
1
+ Description:
2
+ Scaffolds an entire application based on db/model.yml file.
3
+
4
+ This generator transforms entries in db/model.yml into
5
+ command line calls to "rx_scaffold".
6
+
7
+ Examples:
8
+ `./script/generate rx_yaml_scaffold`
9
+
10
+ Sample Model File:
11
+ project:
12
+ - name: string
13
+ - notes: text
14
+ - start_date: date
15
+ - end_date: date
16
+ - completed: boolean
17
+ - belongs_to: [user]
18
+ - has_many: [tasks]
19
+
20
+ location:
21
+ - name: string
22
+ - notes: text
23
+ - belongs_to: [user]
24
+ - has_many: [tasks]
25
+
26
+ task:
27
+ - name: string
28
+ - notes: text
29
+ - start_time: datetime
30
+ - end_time: datetime
31
+ - completed: boolean
32
+ - next_action: boolean
33
+ - belongs_to: [project, location, user]
34
+
35
+ note:
36
+ - content: text
37
+ - belongs_to: [user]
38
+
39
+ user:
40
+ - login: string
41
+ - first_name: string
42
+ - last_name: string
43
+ - email: string
44
+ - has_many: [tasks, projects, locations]
45
+ - has_one: [note]
@@ -0,0 +1,47 @@
1
+ require 'yaml'
2
+
3
+ class RxYamlScaffoldGenerator < RubiGen::Base
4
+ include RestfulX::Configuration
5
+
6
+ def extract_attrs(line, attrs)
7
+ attrs.each do |key,value|
8
+ if value.class == Array
9
+ line << " #{key}:#{value.join(',')}"
10
+ else
11
+ line << " #{key}:#{value}"
12
+ end
13
+ end
14
+ line
15
+ end
16
+
17
+ def manifest
18
+ record do |m|
19
+ models = YAML.load(File.open(File.join(APP_ROOT, 'db/model.yml'), 'r'))
20
+ models.each do |model|
21
+ line = ""
22
+ attrs = model[1]
23
+ if attrs.class == Array
24
+ attrs.each do |elm|
25
+ line = extract_attrs(line, elm)
26
+ end
27
+ else
28
+ line = extract_attrs(line, attrs)
29
+ end
30
+ line = model[0].camelcase + " " + line
31
+ puts 'running: rx_scaffold ' + line
32
+ RubiGen::Scripts::Generate.new.run(line.split, :generator => 'rx_scaffold',
33
+ :gae => options[:gae])
34
+ puts 'done ...'
35
+ end
36
+ RubiGen::Scripts::Generate.new.run([], :generator => 'rx_main_app', :gae => options[:gae])
37
+ end
38
+ end
39
+
40
+ protected
41
+ def add_options!(opt)
42
+ opt.separator ''
43
+ opt.separator 'Options:'
44
+ opt.on("--gae", "Generate Google App Engine Python classes in addition to RestfulX Flex resources.",
45
+ "Default: false") { |v| options[:gae] = v }
46
+ end
47
+ end
@@ -0,0 +1,4 @@
1
+ require File.join(File.dirname(__FILE__), %w[spec_helper])
2
+
3
+ describe RestfulX do
4
+ end
@@ -0,0 +1,13 @@
1
+ require File.expand_path(
2
+ File.join(File.dirname(__FILE__), %w[.. lib restfulx]))
3
+
4
+ Spec::Runner.configure do |config|
5
+ # == Mock Framework
6
+ #
7
+ # RSpec uses it's own mocking framework by default. If you prefer to
8
+ # use mocha, flexmock or RR, uncomment the appropriate line:
9
+ #
10
+ # config.mock_with :mocha
11
+ # config.mock_with :flexmock
12
+ # config.mock_with :rr
13
+ end
@@ -0,0 +1,2 @@
1
+ # Rails hook for RestfulX tasks when configured as a plugin instead of a gem
2
+ require File.join(File.dirname(__FILE__), "..", "lib", "restfulx", "active_record_tasks")
@@ -0,0 +1,15 @@
1
+ # Filters added to this controller apply to all controllers in the application.
2
+ # Likewise, all the methods added will be available for all controllers.
3
+
4
+ class ApplicationController < ActionController::Base
5
+ helper :all # include all helpers, all the time
6
+
7
+ # See ActionController::RequestForgeryProtection for details
8
+ # Uncomment the :secret if you're not using the cookie session store
9
+ protect_from_forgery # :secret => 'c83e3ff98f15718c4544ca8821f2b6d4'
10
+
11
+ # See ActionController::Base for details
12
+ # Uncomment this to filter the contents of submitted sensitive data parameters
13
+ # from your application log (in this case, all fields with names like "password").
14
+ # filter_parameter_logging :password
15
+ end
@@ -0,0 +1,93 @@
1
+ class LocationsController < ApplicationController
2
+ # GET /locations
3
+ # GET /locations.xml
4
+ def index
5
+ @locations = Location.find(:all)
6
+
7
+ respond_to do |format|
8
+ format.html # index.html.erb
9
+ format.xml { render :xml => @locations }
10
+ format.fxml { render :fxml => @locations }
11
+ end
12
+ end
13
+
14
+ # GET /locations/1
15
+ # GET /locations/1.xml
16
+ def show
17
+ @location = Location.find(params[:id])
18
+
19
+ respond_to do |format|
20
+ format.html # show.html.erb
21
+ format.xml { render :xml => @location }
22
+ format.fxml { render :fxml => @location }
23
+ end
24
+ end
25
+
26
+ # GET /locations/new
27
+ # GET /locations/new.xml
28
+ def new
29
+ @location = Location.new
30
+
31
+ respond_to do |format|
32
+ format.html # new.html.erb
33
+ format.xml { render :xml => @location }
34
+ format.fxml { render :fxml => @location }
35
+ end
36
+ end
37
+
38
+ # GET /locations/1/edit
39
+ def edit
40
+ @location = Location.find(params[:id])
41
+ end
42
+
43
+ # POST /locations
44
+ # POST /locations.xml
45
+ def create
46
+ @location = Location.new(params[:location])
47
+
48
+ respond_to do |format|
49
+ if @location.save
50
+ flash[:notice] = 'Location was successfully created.'
51
+ format.html { redirect_to(@location) }
52
+ format.xml { render :xml => @location, :status => :created, :location => @location }
53
+ format.fxml { render :fxml => @location }
54
+ else
55
+ format.html { render :action => "new" }
56
+ format.xml { render :xml => @location.errors, :status => :unprocessable_entity }
57
+ format.fxml { render :fxml => @location.errors }
58
+ end
59
+ end
60
+ end
61
+
62
+ # PUT /locations/1
63
+ # PUT /locations/1.xml
64
+ def update
65
+ @location = Location.find(params[:id])
66
+
67
+ respond_to do |format|
68
+ if @location.update_attributes(params[:location])
69
+ flash[:notice] = 'Location was successfully updated.'
70
+ format.html { redirect_to(@location) }
71
+ format.xml { head :ok }
72
+ format.fxml { render :fxml => @location }
73
+ else
74
+ format.html { render :action => "edit" }
75
+ format.xml { render :xml => @location.errors, :status => :unprocessable_entity }
76
+ format.fxml { render :fxml => @location.errors }
77
+ end
78
+ end
79
+ end
80
+
81
+ # DELETE /locations/1
82
+ # DELETE /locations/1.xml
83
+ def destroy
84
+ @location = Location.find(params[:id])
85
+ @location.destroy
86
+
87
+ respond_to do |format|
88
+ format.html { redirect_to(locations_url) }
89
+ format.xml { head :ok }
90
+ format.fxml { render :fxml => @location }
91
+ end
92
+ end
93
+ end