captproton-restfulx 1.2.3

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 (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 +112 -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