dima-restfulx 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. data/Rakefile +65 -30
  2. data/VERSION.yml +4 -0
  3. data/app_generators/rx_app/rx_app_generator.rb +25 -9
  4. data/app_generators/rx_app/templates/actionscript.properties +3 -3
  5. data/app_generators/rx_app/templates/actionscriptair.properties +3 -3
  6. data/app_generators/rx_app/templates/app.yaml.erb +1 -1
  7. data/app_generators/rx_app/templates/default_tasks.rake +5 -18
  8. data/app_generators/rx_app/templates/generate.rb +1 -1
  9. data/app_generators/rx_app/templates/index.html.erb +1 -1
  10. data/app_generators/rx_app/templates/mainair-app.xml +3 -3
  11. data/app_generators/rx_app/templates/mainapp.mxml +107 -2
  12. data/app_generators/rx_app/templates/project-textmate.erb +4 -4
  13. data/app_generators/rx_app/templates/project.properties +1 -1
  14. data/app_generators/rx_app/templates/projectair.properties +1 -1
  15. data/app_generators/rx_app/templates/restfulx.yml +61 -0
  16. data/lib/restfulx/active_foo.rb +0 -7
  17. data/lib/restfulx/active_record_tasks.rb +10 -0
  18. data/lib/restfulx/configuration.rb +15 -10
  19. data/lib/restfulx/rails/swf_helper.rb +1 -1
  20. data/lib/restfulx/schema_to_yaml/extensions/enumerable.rb +7 -0
  21. data/lib/restfulx/schema_to_yaml/settings/config.rb +16 -0
  22. data/lib/restfulx/schema_to_yaml/settings/core.rb +70 -0
  23. data/lib/restfulx/schema_to_yaml.rb +120 -0
  24. data/lib/restfulx/tasks.rb +68 -42
  25. data/lib/restfulx/uuid_helper.rb +15 -0
  26. data/lib/restfulx.rb +5 -28
  27. data/rails_generators/rx_config/USAGE +2 -1
  28. data/rails_generators/rx_config/rx_config_generator.rb +78 -53
  29. data/rails_generators/rx_config/templates/actionscript.properties +3 -3
  30. data/rails_generators/rx_config/templates/actionscriptair.properties +3 -3
  31. data/rails_generators/rx_config/templates/flex_controller.erb +4 -0
  32. data/rails_generators/rx_config/templates/{index.html.erb → index.erb} +2 -4
  33. data/rails_generators/rx_config/templates/mainair-app.xml +3 -3
  34. data/rails_generators/rx_config/templates/mainapp.mxml +100 -2
  35. data/rails_generators/rx_config/templates/project-textmate.erb +4 -4
  36. data/rails_generators/rx_config/templates/project.properties +1 -1
  37. data/rails_generators/rx_config/templates/projectair.properties +1 -1
  38. data/rails_generators/rx_config/templates/restfulx.erb +39 -0
  39. data/rails_generators/rx_config/templates/restfulx.yml +51 -4
  40. data/rails_generators/rx_config/templates/restfulx_tasks.rake +3 -0
  41. data/rails_generators/rx_config/templates/routes.erb +47 -0
  42. data/rails_generators/rx_controller/rx_controller_generator.rb +9 -6
  43. data/rails_generators/rx_controller/templates/controller.as.erb +7 -9
  44. data/{generators → rails_generators}/rx_main_app/USAGE +0 -0
  45. data/rails_generators/rx_main_app/rx_main_app_generator.rb +60 -0
  46. data/rails_generators/rx_main_app/templates/mainapp.mxml +129 -0
  47. data/rails_generators/rx_scaffold/rx_scaffold_generator.rb +89 -35
  48. data/rails_generators/rx_scaffold/templates/{controller.rb.erb → controllers/default.rb.erb} +29 -1
  49. data/rails_generators/rx_scaffold/templates/controllers/resource_controller.rb.erb +23 -0
  50. data/rails_generators/rx_scaffold/templates/fixtures.yml.erb +9 -5
  51. data/{generators/rx_scaffold/templates/component.mxml.erb → rails_generators/rx_scaffold/templates/layouts/default.erb} +75 -59
  52. data/rails_generators/rx_scaffold/templates/migration.rb.erb +29 -2
  53. data/rails_generators/rx_scaffold/templates/model.as.erb +33 -2
  54. data/rails_generators/rx_scaffold/templates/model.rb.erb +36 -1
  55. data/rails_generators/rx_yaml_scaffold/rx_yaml_scaffold_generator.rb +29 -10
  56. data/{generators → rxgen_generators}/rx_config/USAGE +0 -0
  57. data/{generators → rxgen_generators}/rx_config/rx_config_generator.rb +0 -0
  58. data/{generators → rxgen_generators}/rx_controller/USAGE +0 -0
  59. data/{generators → rxgen_generators}/rx_controller/rx_controller_generator.rb +6 -5
  60. data/{generators → rxgen_generators}/rx_controller/templates/assist.py +2 -2
  61. data/{generators → rxgen_generators}/rx_controller/templates/controller.as.erb +8 -6
  62. data/{generators → rxgen_generators}/rx_controller/templates/restful.py +0 -0
  63. data/rxgen_generators/rx_main_app/USAGE +8 -0
  64. data/{generators → rxgen_generators}/rx_main_app/rx_main_app_generator.rb +10 -5
  65. data/{generators → rxgen_generators}/rx_main_app/templates/main.py.erb +0 -0
  66. data/rxgen_generators/rx_main_app/templates/mainapp.mxml +136 -0
  67. data/{generators → rxgen_generators}/rx_scaffold/USAGE +0 -0
  68. data/{generators → rxgen_generators}/rx_scaffold/rx_scaffold_generator.rb +5 -4
  69. data/{rails_generators → rxgen_generators}/rx_scaffold/templates/component.mxml.erb +24 -52
  70. data/{generators → rxgen_generators}/rx_scaffold/templates/controller.py.erb +1 -1
  71. data/{generators → rxgen_generators}/rx_scaffold/templates/model.as.erb +0 -0
  72. data/{generators → rxgen_generators}/rx_scaffold/templates/model.py.erb +0 -0
  73. data/{generators → rxgen_generators}/rx_yaml_scaffold/USAGE +0 -0
  74. data/{generators → rxgen_generators}/rx_yaml_scaffold/rx_yaml_scaffold_generator.rb +0 -0
  75. metadata +104 -66
  76. data/History.txt +0 -7
  77. data/Manifest.txt +0 -127
  78. data/generators/rx_main_app/templates/mainapp.mxml +0 -35
  79. data/rdoc/generators/template/html/jamis.rb +0 -588
  80. data/test/rails/playing_around_in_a_console.txt +0 -71
data/Rakefile CHANGED
@@ -1,42 +1,77 @@
1
- # Look in the tasks/setup.rb file for the various options that can be
2
- # configured in this Rakefile. The .rake files in the tasks directory
3
- # are where the options are used.
1
+ require 'rake'
4
2
 
5
3
  begin
6
- require 'bones'
7
- Bones.setup
4
+ require 'jeweler'
5
+ Jeweler::Tasks.new do |gem|
6
+ gem.name = "restfulx"
7
+ gem.summary = "RestfulX Framework Code Generation Engine / Rails 2.1+ Integration Support"
8
+ gem.email = "dima.berastau@gmail.com"
9
+ gem.homepage = "http://restfulx.org"
10
+ gem.rubyforge_project = "restfulx"
11
+ gem.authors = ["Dima Berastau"]
12
+ gem.files = FileList["[A-Z]*", "{bin,app_generators,rails_generators,rxgen_generators,lib,test,spec}/**/*"]
13
+ gem.add_dependency('rubigen', '>= 1.5.0')
14
+ gem.add_dependency('activesupport', '>=2.0.0')
15
+ end
8
16
  rescue LoadError
9
- load 'tasks/setup.rb'
17
+ puts "Jeweler not available. Install it with: sudo gem install dima-jeweler -s http://gems.github.com"
10
18
  end
11
19
 
12
- ensure_in_path 'lib'
13
- require 'restfulx'
14
-
15
- depend_on 'rubigen', '1.4.0'
16
- depend_on 'activesupport', '2.0.0'
17
-
18
- task :default => 'spec:run'
20
+ require 'rake/rdoctask'
21
+ Rake::RDocTask.new do |rdoc|
22
+ config = YAML.load(File.read('VERSION.yml'))
23
+ rdoc.rdoc_dir = 'doc/api'
24
+ rdoc.title = "RestfulX #{config[:major]}.#{config[:minor]}.#{config[:patch]}"
25
+ rdoc.options << '--line-numbers' << '--inline-source' #<< '-Tjamis'
26
+ rdoc.rdoc_files.include('README*')
27
+ rdoc.rdoc_files.include('lib/**/*.rb')
28
+ end
19
29
 
20
- PROJ.name = 'restfulx'
21
- PROJ.summary = 'RestfulX Framework Code Generation Engine / Rails 2.1+ Integration Support'
22
- PROJ.authors = 'Dima Berastau'
23
- PROJ.email = 'dima.berastau@gmail.com'
24
- PROJ.url = 'http://wiki.github.com/dima/restfulx'
25
- PROJ.version = RestfulX::VERSION
30
+ begin
31
+ require 'rake/contrib/sshpublisher'
32
+ namespace :rubyforge do
33
+ namespace :release do
34
+ desc "Publish RDoc to RubyForge."
35
+ task :docs => [:rdoc] do
36
+ config = YAML.load(
37
+ File.read(File.expand_path('~/.rubyforge/user-config.yml'))
38
+ )
26
39
 
27
- PROJ.executables = ['bin/rx-gen']
40
+ host = "#{config['username']}@rubyforge.org"
41
+ remote_dir = "/var/www/gforge-projects/restfulx/"
42
+ local_dir = 'doc/api'
28
43
 
29
- #PROJ.rdoc.opts << '-Tjamis'
30
- PROJ.rdoc.exclude << %w(.txt)
31
- PROJ.rdoc.main = 'README.rdoc'
32
- PROJ.rdoc.dir = 'doc/api'
44
+ Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
45
+ end
46
+ end
47
+ end
48
+ rescue LoadError
49
+ puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
50
+ end
33
51
 
34
- PROJ.readme_file = 'README.rdoc'
35
- PROJ.rubyforge.name = 'restfulx'
52
+ require 'rake/testtask'
53
+ Rake::TestTask.new(:test) do |t|
54
+ t.libs << 'lib' << 'test'
55
+ t.pattern = 'test/**/test_*.rb'
56
+ t.verbose = false
57
+ end
36
58
 
37
- PROJ.exclude << %w(.DS_Store .gitignore .log, .sqlite3)
59
+ begin
60
+ require 'rcov/rcovtask'
61
+ Rcov::RcovTask.new do |t|
62
+ t.libs << 'test'
63
+ t.test_files = FileList['test/**/test_*.rb']
64
+ t.verbose = true
65
+ end
66
+ rescue LoadError
67
+ puts "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
68
+ end
38
69
 
39
- PROJ.spec.opts << '--color'
40
- PROJ.test.opts << '-W1'
70
+ begin
71
+ require 'cucumber/rake/task'
72
+ Cucumber::Rake::Task.new(:features)
73
+ rescue LoadError
74
+ puts "Cucumber is not available. In order to run features, you must: sudo gem install cucumber"
75
+ end
41
76
 
42
- # EOF
77
+ task :default => :test
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :patch: 2
3
+ :major: 1
4
+ :minor: 2
@@ -8,7 +8,11 @@ class RxAppGenerator < RubiGen::Base
8
8
  :command_controller_name,
9
9
  :component_names,
10
10
  :application_tag,
11
- :use_air
11
+ :use_air,
12
+ :use_gae,
13
+ :flex_root,
14
+ :base_flex_package,
15
+ :distributed
12
16
 
13
17
  def initialize(runtime_args, runtime_options = {})
14
18
  super
@@ -16,9 +20,14 @@ class RxAppGenerator < RubiGen::Base
16
20
  @destination_root = File.expand_path(args.shift)
17
21
 
18
22
  @project_name, @flex_project_name, @command_controller_name,
19
- @base_package, @base_folder = extract_names(base_name)
23
+ @base_package, @base_folder, @flex_root, @distributed = extract_names(base_name)
20
24
 
25
+ @base_package = options[:base_flex_package] if options[:base_flex_package]
26
+ @base_folder = options[:base_flex_package].gsub('.', '/').gsub(/\W/, '') if options[:base_flex_package]
27
+ @flex_root = options[:flex_root] if options[:flex_root]
28
+ @use_gae = options[:gae]
21
29
  @use_air = options[:air_config]
30
+ @distributed = options[:distributed] unless @distributed
22
31
  if @use_air
23
32
  @application_tag = 'WindowedApplication'
24
33
  else
@@ -32,7 +41,7 @@ class RxAppGenerator < RubiGen::Base
32
41
  record do |m|
33
42
  m.directory ''
34
43
 
35
- %w(script lib db bin-debug).each { |dir| m.directory dir }
44
+ %w(script lib db config bin-debug).each { |dir| m.directory dir }
36
45
 
37
46
  if options[:gae]
38
47
  m.file 'index.yaml', 'index.yaml' unless File.exist?('index.yaml')
@@ -44,6 +53,7 @@ class RxAppGenerator < RubiGen::Base
44
53
  m.file 'empty.txt', 'app/models/__init__.py'
45
54
  end
46
55
 
56
+ m.template 'restfulx.yml', 'config/restfulx.yml'
47
57
  m.file 'default_tasks.rake', 'Rakefile' unless File.exist?('Rakefile')
48
58
  m.file 'flex.properties', '.flexProperties'
49
59
  m.file 'generate.rb', 'script/generate', { :chmod => 0755 }
@@ -70,15 +80,15 @@ class RxAppGenerator < RubiGen::Base
70
80
  end
71
81
 
72
82
  %w(components controllers commands models events).each do |dir|
73
- m.directory "app/flex/#{base_folder}/#{dir}"
83
+ m.directory "#{flex_root}/#{base_folder}/#{dir}"
74
84
  end
75
85
 
76
- m.directory "app/flex/#{base_folder}/components/generated"
86
+ m.directory "#{flex_root}/#{base_folder}/components/generated"
77
87
 
78
- m.template 'project-textmate.erb', "#{project_name.underscore}.tmproj"
79
- m.template 'mainapp.mxml', File.join('app', 'flex', "#{project_name}.mxml")
80
- m.template 'mainapp-config.xml', File.join('app', 'flex', "#{project_name}-config.xml")
81
- m.template 'mainair-app.xml', File.join('app', 'flex', "#{project_name}-app.xml") if @use_air
88
+ m.template 'project-textmate.erb', "#{project_name}.tmproj"
89
+ m.template 'mainapp.mxml', File.join("#{flex_root}", "#{flex_project_name}.mxml")
90
+ m.template 'mainapp-config.xml', File.join("#{flex_root}", "#{flex_project_name}-config.xml")
91
+ m.template 'mainair-app.xml', File.join("#{flex_root}", "#{flex_project_name}-app.xml") if @use_air
82
92
  end
83
93
  end
84
94
 
@@ -90,5 +100,11 @@ class RxAppGenerator < RubiGen::Base
90
100
  "Default: false") { |v| options[:air_config] = v }
91
101
  opt.on("--gae", "Generate Google App Engine Python classes in addition to RestfulX Flex resources.",
92
102
  "Default: false") { |v| options[:gae] = v }
103
+ opt.on("--flex-root [FOLDER]", "Root folder for generated flex code.",
104
+ "Default: app/flex") { |v| options[:flex_root] = v }
105
+ opt.on("--base-flex-package [PACKAGE]", "Base package for your application.",
106
+ "Default: #{flex_project_name}") { |v| options[:base_flex_package] = v }
107
+ opt.on("--distributed", "Creates migrations, controllers and models that use UUIDs and are distribution ready",
108
+ "Default: false") { |v| options[:distributed] = v }
93
109
  end
94
110
  end
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <actionScriptProperties mainApplicationPath="<%= project_name %>.mxml" version="3">
3
- <compiler additionalCompilerArguments="-locale en_US -keep-as3-metadata+=Resource,HasOne,HasMany,BelongsTo,DateTime,Lazy,Ignored" copyDependentFiles="true" enableModuleDebug="true" generateAccessible="false" htmlExpressInstall="true" htmlGenerate="true" htmlHistoryManagement="true" htmlPlayerVersion="9.0.28" htmlPlayerVersionCheck="true" outputFolderPath="public/bin" rootURL="http://localhost:3000/bin" sourceFolderPath="app/flex" strict="true" useApolloConfig="false" verifyDigests="true" warn="true">
2
+ <actionScriptProperties mainApplicationPath="<%= flex_project_name %>.mxml" version="3">
3
+ <compiler additionalCompilerArguments="-locale en_US -keep-as3-metadata+=Resource,HasOne,HasMany,BelongsTo,DateTime,Lazy,Ignored" copyDependentFiles="true" enableModuleDebug="true" generateAccessible="false" htmlExpressInstall="true" htmlGenerate="true" htmlHistoryManagement="true" htmlPlayerVersion="9.0.28" htmlPlayerVersionCheck="true" outputFolderPath="public/bin" rootURL="http://localhost:3000/bin" sourceFolderPath="<%= flex_root %>" strict="true" useApolloConfig="false" verifyDigests="true" warn="true">
4
4
  <compilerSourcePath/>
5
5
  <libraryPath defaultLinkType="1">
6
6
  <libraryPathEntry kind="4" path=""/>
@@ -9,7 +9,7 @@
9
9
  <sourceAttachmentPath/>
10
10
  </compiler>
11
11
  <applications>
12
- <application path="<%= project_name %>.mxml"/>
12
+ <application path="<%= flex_project_name %>.mxml"/>
13
13
  </applications>
14
14
  <modules/>
15
15
  <buildCSSFiles/>
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <actionScriptProperties mainApplicationPath="<%= project_name %>.mxml" version="3">
3
- <compiler additionalCompilerArguments="-locale en_US -keep-as3-metadata+=Resource,HasOne,HasMany,BelongsTo,DateTime,Lazy,Ignored" copyDependentFiles="true" enableModuleDebug="true" generateAccessible="false" htmlExpressInstall="true" htmlGenerate="false" htmlHistoryManagement="false" htmlPlayerVersion="9.0.28" htmlPlayerVersionCheck="true" outputFolderPath="bin-debug" sourceFolderPath="app/flex" strict="true" useApolloConfig="true" verifyDigests="true" warn="true">
2
+ <actionScriptProperties mainApplicationPath="<%= flex_project_name %>.mxml" version="3">
3
+ <compiler additionalCompilerArguments="-locale en_US -keep-as3-metadata+=Resource,HasOne,HasMany,BelongsTo,DateTime,Lazy,Ignored" copyDependentFiles="true" enableModuleDebug="true" generateAccessible="false" htmlExpressInstall="true" htmlGenerate="false" htmlHistoryManagement="false" htmlPlayerVersion="9.0.28" htmlPlayerVersionCheck="true" outputFolderPath="bin-debug" sourceFolderPath="<%= flex_root %>" strict="true" useApolloConfig="true" verifyDigests="true" warn="true">
4
4
  <compilerSourcePath/>
5
5
  <libraryPath defaultLinkType="1">
6
6
  <libraryPathEntry kind="4" path=""/>
@@ -9,7 +9,7 @@
9
9
  <sourceAttachmentPath/>
10
10
  </compiler>
11
11
  <applications>
12
- <application path="<%= project_name %>.mxml"/>
12
+ <application path="<%= flex_project_name %>.mxml"/>
13
13
  </applications>
14
14
  <modules/>
15
15
  <buildCSSFiles/>
@@ -1,4 +1,4 @@
1
- application: <%= project_name.downcase %>
1
+ application: <%= project_name %>
2
2
  version: 1
3
3
  runtime: python
4
4
  api_version: 1
@@ -15,7 +15,7 @@ namespace :flex do
15
15
  desc "Build flex application"
16
16
  task :build do
17
17
  libs = [] # you can add libraries that are not in lib folder here
18
- compile_app(get_executable('mxmlc'), 'bin-debug', "-library-path+=#{libs.join(',')}")
18
+ compile_application(:destination => 'bin-debug', :opts => "-library-path+=#{libs.join(',')}")
19
19
  end
20
20
  end
21
21
 
@@ -23,29 +23,16 @@ namespace :rx do
23
23
  namespace :test do
24
24
  desc "Build flex test swf file"
25
25
  task :build do
26
- project_path = File.join(APP_ROOT, "app/flex", TEST_APP_NAME)
27
-
28
26
  libs = Dir.glob(File.join(APP_ROOT, 'lib', '*.swc'))
29
27
  #libs << 'foobar' # you can add libraries that not in lib folder here
30
-
31
- target_project_path = File.join(APP_ROOT, "bin-debug", TEST_APP_NAME.sub(/.mxml$/, '.swf'))
32
-
33
- cmd = "#{get_executable('mxmlc')} +configname=air -library-path+=#{libs.join(',')} " <<
34
- "-output #{target_project_path} -debug=true #{project_path}"
35
-
36
- if !system("#{cmd}")
37
- puts "failed to compile test application"
38
- end
28
+
29
+ compile_application(:application => TEST_APP_NAME, :destination => 'bin-debug',
30
+ :opts => "+configname=air -library-path+=#{libs.join(',')}")
39
31
  end
40
32
 
41
33
  desc "Run flex test application"
42
34
  task :run do
43
- project_path = File.join(APP_ROOT, "app/flex", TEST_APP_NAME)
44
- target_project_air_descriptor = project_path.sub(/.mxml$/, '-app.xml')
45
-
46
- if !system("#{get_executable('adl')} #{target_project_air_descriptor} #{APP_ROOT}")
47
- puts "failed to run test application"
48
- end
35
+ run_air_application(:application => TEST_APP_NAME)
49
36
  end
50
37
  end
51
38
  end
@@ -13,5 +13,5 @@ require 'restfulx'
13
13
 
14
14
  ARGV.shift if ['--help', '-h'].include?(ARGV[0])
15
15
 
16
- RubiGen::Base.use_component_sources!
16
+ RubiGen::Base.use_component_sources! [:rxgen]
17
17
  RubiGen::Scripts::Generate.new.run(ARGV)
@@ -4,7 +4,7 @@
4
4
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
5
5
  <script type="text/javascript" src="javascripts/swfobject.js"></script>
6
6
  <script type="text/javascript">
7
- swfobject.embedSWF("bin/<%= project_name %>.swf", "mainApp", "100%", "100%", "9.0.0", "expressInstall.swf");
7
+ swfobject.embedSWF("bin/<%= flex_project_name %>.swf", "mainApp", "100%", "100%", "9.0.0", "expressInstall.swf");
8
8
  </script>
9
9
  <style>
10
10
  body { margin: 0px; overflow: hidden; }
@@ -15,13 +15,13 @@
15
15
  -->
16
16
 
17
17
  <!-- The application identifier string, unique to this application. Required. -->
18
- <id><%= project_name %></id>
18
+ <id><%= flex_project_name %></id>
19
19
 
20
20
  <!-- Used as the filename for the application. Required. -->
21
- <filename><%= project_name %></filename>
21
+ <filename><%= flex_project_name %></filename>
22
22
 
23
23
  <!-- The name that is displayed in the AIR application installer. Optional. -->
24
- <name><%= project_name %></name>
24
+ <name><%= flex_project_name %></name>
25
25
 
26
26
  <!-- An application version designator (such as "v1", "2.5", or "Alpha 1"). Required. -->
27
27
  <version>v1</version>
@@ -6,20 +6,126 @@
6
6
  <mx:Script>
7
7
  <![CDATA[
8
8
  <% if use_air -%>
9
+ <% if distributed -%>
10
+ import air.net.SocketMonitor;
11
+ import org.restfulx.events.PullEndEvent;
12
+ import org.restfulx.events.PullStartEvent;
13
+ import org.restfulx.events.PushEndEvent;
14
+ import org.restfulx.events.PushStartEvent;
15
+ import org.restfulx.controllers.ChangeController;
16
+ import org.restfulx.services.ISyncingServiceProvider;
17
+ import org.restfulx.services.http.XMLHTTPServiceProvider;
18
+ <% end -%>
9
19
  import org.restfulx.services.air.AIRServiceProvider;
20
+ <% end -%>
21
+ <% if use_gae -%>
22
+ import org.restfulx.services.http.GAEHTTPServiceProvider;
10
23
  <% end -%>
11
24
  import org.restfulx.Rx;
12
25
  import <%= base_package %>.controllers.<%= command_controller_name %>;
26
+ <% if use_air -%>
27
+ <% if distributed -%>
28
+
29
+ [Bindable]
30
+ private var socketMonitor:SocketMonitor;
31
+
32
+ [Bindable]
33
+ private var online:Boolean;
34
+
35
+ [Bindable]
36
+ private var syncStatus:String;
37
+ <% end -%>
38
+ <% end -%>
13
39
 
14
40
  private function init():void {
15
41
  <% if use_air -%>
16
- <%= command_controller_name %>.initialize([AIRServiceProvider], AIRServiceProvider.ID, "<%= base_package %>");
42
+ <% if distributed -%>
43
+ Rx.httpRootUrl = "http://localhost:3000/";
44
+ Rx.enableSync = true;
45
+
46
+ socketMonitor = new SocketMonitor("localhost", 3000);
47
+ socketMonitor.pollInterval = 2000; /* miliseconds */
48
+ socketMonitor.addEventListener(StatusEvent.STATUS, onNetworkStatusChange);
49
+ socketMonitor.start();
50
+
51
+ <% end -%>
52
+ <%= command_controller_name %>.initialize([AIRServiceProvider],
53
+ AIRServiceProvider.ID, "<%= base_package %>");
54
+ <% if distributed -%>
55
+
56
+ Rx.changes.setSyncProviders(
57
+ ISyncingServiceProvider(Rx.services.getServiceProvider(AIRServiceProvider.ID)),
58
+ Rx.services.getServiceProvider(XMLHTTPServiceProvider.ID));
59
+
60
+ Rx.changes.addEventListener(PushStartEvent.ID, onPushStart);
61
+ Rx.changes.addEventListener(PushEndEvent.ID, onPushEnd);
62
+ Rx.changes.addEventListener(PullStartEvent.ID, onPullStart);
63
+ Rx.changes.addEventListener(PullEndEvent.ID, onPullEnd);
64
+ <% end -%>
65
+ <% else -%>
66
+ <% if use_gae -%>
67
+ <%= command_controller_name %>.initialize([GAEHTTPServiceProvider], GAEHTTPServiceProvider.ID);
17
68
  <% else -%>
18
69
  <%= command_controller_name %>.initialize();
70
+ <% end -%>
19
71
  <% end -%>
20
72
  }
73
+ <% if use_air -%>
74
+ <% if distributed -%>
75
+
76
+ private function onPushStart(event:Event):void {
77
+ syncStatus = "Pushing changes ...";
78
+ }
79
+
80
+ private function onPushEnd(event:Event):void {
81
+ syncStatus = "Push complete.";
82
+ }
83
+
84
+ private function onPullStart(event:Event):void {
85
+ syncStatus = "Pulling data...";
86
+ }
87
+
88
+ private function onPullEnd(event:Event):void {
89
+ syncStatus = "Pull complete.";
90
+ }
91
+
92
+ private function onNetworkStatusChange(event:StatusEvent):void {
93
+ online = (socketMonitor.available) ? true : false;
94
+
95
+ if (online) {
96
+ Rx.defaultServiceId = XMLHTTPServiceProvider.ID;
97
+ } else {
98
+ Rx.defaultServiceId = AIRServiceProvider.ID;
99
+ }
100
+ }
101
+
102
+ private function getCurrentProviderName(id:int):String {
103
+ switch (id) {
104
+ case XMLHTTPServiceProvider.ID:
105
+ return "Rails";
106
+ case AIRServiceProvider.ID:
107
+ return "AIR (SQLite)";
108
+ default :
109
+ return "No idea";
110
+ }
111
+ }
112
+ <% end -%>
113
+ <% end -%>
21
114
  ]]>
22
115
  </mx:Script>
116
+ <% if use_air -%>
117
+ <% if distributed -%>
118
+ <mx:VBox height="100%">
119
+ <mx:Label text="Current Provider: {getCurrentProviderName(Rx.defaultServiceId)}"/>
120
+ <mx:Label text="Status: {online ? 'Online' : 'Offline' }"/>
121
+ <mx:HBox>
122
+ <mx:Button label="Push" click="{Rx.changes.push()}" enabled="{online}"/>
123
+ <mx:Button label="Pull" click="{Rx.changes.pull()}" enabled="{online}"/>
124
+ </mx:HBox>
125
+ <mx:Label text="{syncStatus}"/>
126
+ </mx:VBox>
127
+ <% end -%>
128
+ <% end -%>
23
129
  <mx:LinkBar dataProvider="{mainViewStack}" direction="vertical" borderStyle="solid" backgroundColor="#EEEEEE"/>
24
130
  <mx:ViewStack id="mainViewStack" width="100%" height="100%">
25
131
  <!-- For a simple demo, put all the components here. -->
@@ -28,4 +134,3 @@
28
134
  <% end -%>
29
135
  </mx:ViewStack>
30
136
  </mx:<%= application_tag %>>
31
-
@@ -3,14 +3,14 @@
3
3
  <plist version="1.0">
4
4
  <dict>
5
5
  <key>currentDocument</key>
6
- <string>app/flex/<%= project_name %>.mxml</string>
6
+ <string>app/flex/<%= flex_project_name %>.mxml</string>
7
7
  <key>documents</key>
8
8
  <array>
9
9
  <dict>
10
10
  <key>expanded</key>
11
11
  <true/>
12
12
  <key>name</key>
13
- <string><%= project_name.underscore %></string>
13
+ <string><%= project_name %></string>
14
14
  <key>regexFolderFilter</key>
15
15
  <string>!.*/(\.[^/]*|CVS|_darcs|_MTN|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$</string>
16
16
  <key>sourceDirectory</key>
@@ -27,7 +27,7 @@
27
27
  <key>enabled</key>
28
28
  <true/>
29
29
  <key>value</key>
30
- <string>app/flex/<%= project_name %>.mxml</string>
30
+ <string>app/flex/<%= flex_project_name %>.mxml</string>
31
31
  <key>variable</key>
32
32
  <string>TM_FLEX_FILE_SPECS</string>
33
33
  </dict>
@@ -35,7 +35,7 @@
35
35
  <key>enabled</key>
36
36
  <true/>
37
37
  <key>value</key>
38
- <string>public/bin/<%= project_name %>.swf</string>
38
+ <string>public/bin/<%= flex_project_name %>.swf</string>
39
39
  <key>variable</key>
40
40
  <string>TM_FLEX_OUTPUT</string>
41
41
  </dict>
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <projectDescription>
3
- <name><%= flex_project_name %></name>
3
+ <name><%= project_name %></name>
4
4
  <comment></comment>
5
5
  <projects>
6
6
  </projects>
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <projectDescription>
3
- <name><%= flex_project_name %></name>
3
+ <name><%= project_name %></name>
4
4
  <comment></comment>
5
5
  <projects>
6
6
  </projects>
@@ -0,0 +1,61 @@
1
+ # RestfulX code generation configuration options
2
+
3
+ # This option controls what the main Flex application file will be called.
4
+ # By default it will be equal to the name of your rails project camelized
5
+ project-name: <%= project_name %>
6
+
7
+ # This options determines what the root folder for generated Flex code is.
8
+ # By default 'app/flex'
9
+ flex-root: <%= flex_root %>
10
+
11
+ # By default flex models, commands, controllers and components are genearated into
12
+ # <flex-root>/<your rails project name> folder. If you'd like to customize the target folder
13
+ # (to say append a "com" package before your rails project name) uncomment the line below
14
+ # base-package must follow the usual flex package notation (a string separated by ".")
15
+ base-package: <%= base_package %>
16
+
17
+ # Main RestfulX controller is typically named AppicationController. This controller is created in
18
+ # <base-package>.controllers folder. You can customize the name by uncommenting the following line
19
+ # and changing the controller name.
20
+ controller-name: <%= command_controller_name %>
21
+
22
+ # If you are using Rails on the back-end and Adobe AIR as the client you can generate Rails/Flex/AIR
23
+ # code to take advantage of synchronization (online/offline) support in RestfulX by changing the following
24
+ # option to true. By default distribution is disabled.
25
+ distributed: <%= distributed %>
26
+
27
+ # These options control code-generation options for view components, Flex and Rails models and so on.
28
+ # Allowing you to choose what controller patterns, layouts, attachment plugin you want to use, etc.
29
+ defaults: &defaults
30
+ attachment_plugin: 'paperclip' # => paperclip/attachment_fu
31
+ controller_pattern: 'default' # => default/resource_controller
32
+ layouts:
33
+ default: 'default' # => default (more coming soon)
34
+ ignored: # => ignored tables/fields won't appear in model.yml
35
+ tables: [table1 table2]
36
+ fields: [field1 field2]
37
+
38
+ development:
39
+ <<: *defaults
40
+
41
+ test:
42
+ <<: *defaults
43
+
44
+ production:
45
+ <<: *defaults
46
+
47
+ # Special model.yml fields for RestfulX code-generation:
48
+ #
49
+ # attachment_field: [avatar]
50
+ # * arg takes Paperclip field name, or takes [uploaded_data] for Attachment_Fu
51
+ # belongs_to: [account, profile]
52
+ # has_many: [announcements, files, folders, users]
53
+ # has_many_through: [permissions, roles]
54
+ # * has_many :roles, :through => :permissions
55
+ # has_one: [suitcase]
56
+ # polymorphic: [commentable]
57
+ # tree_model: [parent]
58
+ # layout: [default]
59
+ # * default template is the only current theme, with more coming soon
60
+ # ignored_fields: [children_count, ancestors_count, descendants_count, position]
61
+ # * specify fields you don't want generated for your template
@@ -11,13 +11,6 @@
11
11
  # Some of the things that are done can be called _monkey_ _patching_ while others can
12
12
  # be called extensions. Caveat emptor.
13
13
 
14
- # Flex friendly date, datetime formats
15
- ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!(:flex_date => "%Y/%m/%d")
16
- ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(:flex_datetime => "%Y/%m/%d %H:%M:%S")
17
-
18
- Hash::XML_FORMATTING['date'] = Proc.new { |date| date.to_s(:flex_date) }
19
- Hash::XML_FORMATTING['datetime'] = Proc.new { |datetime| datetime.to_s(:flex_datetime) }
20
-
21
14
  # ActiveSupport specific patches. More specifically we add +to_fxml+ methods to Array and
22
15
  # Hash conversion modules
23
16
  module ActiveSupport
@@ -2,6 +2,7 @@
2
2
  # - db:mysql:stage
3
3
  # - db:refresh
4
4
  require File.join(File.dirname(__FILE__), 'tasks')
5
+ require File.join(File.dirname(__FILE__), 'schema_to_yaml')
5
6
 
6
7
  # stores local copy of the application environment ('production', 'test', etc)
7
8
  # so that appropriate values in config/database.yml are used
@@ -78,4 +79,13 @@ namespace :db do
78
79
 
79
80
  desc "Refresh the database environment for #{APP_ENV}"
80
81
  task :refresh => ['db:drop_if_exists', 'db:create', 'db:migrate', 'db:fixtures:load']
82
+
83
+ # used to analyze your schema and dump out a model.yml file for converting old rails projects
84
+ namespace :schema do
85
+ desc "Create model.yml from schema.rb"
86
+ task :to_yaml => :environment do
87
+ SchemaToYaml.schema_to_yaml
88
+ end
89
+ end
90
+
81
91
  end
@@ -42,25 +42,30 @@ module RestfulX
42
42
  # controller-name: ApplicationController
43
43
  def extract_names(project = nil)
44
44
  if project
45
- project_name = project.camelcase.gsub(/\s/, '')
46
- project_name_downcase = project_name.downcase
45
+ project_name = project.downcase.gsub(/\W/, '')
46
+ flex_project_name = project_name.camelize
47
47
  else
48
- project_name = APP_ROOT.split("/").last.camelcase.gsub(/\s/, '')
49
- project_name_downcase = project_name.downcase
48
+ project_name = APP_ROOT.split("/").last.gsub(/\W/, '')
49
+ flex_project_name = project_name.camelize
50
50
  end
51
-
51
+
52
52
  # give a chance to override the settings via restfulx.yml
53
53
  begin
54
54
  config = YAML.load(File.open("#{APP_ROOT}/config/restfulx.yml"))
55
- base_package = config['base-package'] || project_name_downcase
56
- base_folder = base_package.gsub('.', '/').gsub(/\s/, '')
57
- project_name = config['project-name'].camelcase.gsub(/\s/, '') || project_name
55
+ base_package = config['base-package'] || flex_project_name.downcase
56
+ base_folder = base_package.gsub('.', '/').gsub(/\W/, '')
57
+ project_name = config['project-name'].downcase.gsub(/\W/, '') || project_name
58
+ flex_project_name = project_name.camelize
58
59
  controller_name = config['controller-name'] || "ApplicationController"
60
+ flex_root = config['flex-root'] || "app/flex"
61
+ distributed = config['distributed'] || false
59
62
  rescue
60
- base_folder = base_package = project_name_downcase
63
+ base_folder = base_package = flex_project_name.downcase
61
64
  controller_name = "ApplicationController"
65
+ flex_root = "app/flex"
66
+ distributed = false
62
67
  end
63
- [project_name, project_name_downcase, controller_name, base_package, base_folder]
68
+ [project_name, flex_project_name, controller_name, base_package, base_folder, flex_root, distributed]
64
69
  end
65
70
 
66
71
  # List files ending in *.as (ActionScript) in a given folder