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.
- data/README.rdoc +50 -0
- data/Rakefile +79 -0
- data/VERSION.yml +4 -0
- data/app_generators/rx_app/USAGE +22 -0
- data/app_generators/rx_app/rx_app_generator.rb +110 -0
- data/app_generators/rx_app/templates/actionscript.properties +16 -0
- data/app_generators/rx_app/templates/actionscriptair.properties +16 -0
- data/app_generators/rx_app/templates/app.yaml.erb +12 -0
- data/app_generators/rx_app/templates/default_tasks.rake +38 -0
- data/app_generators/rx_app/templates/empty.txt +0 -0
- data/app_generators/rx_app/templates/expressInstall.swf +0 -0
- data/app_generators/rx_app/templates/flex.properties +2 -0
- data/app_generators/rx_app/templates/generate.rb +17 -0
- data/app_generators/rx_app/templates/html-template/AC_OETags.js +276 -0
- data/app_generators/rx_app/templates/html-template/history/history.css +6 -0
- data/app_generators/rx_app/templates/html-template/history/history.js +645 -0
- data/app_generators/rx_app/templates/html-template/history/historyFrame.html +29 -0
- data/app_generators/rx_app/templates/html-template/index.template.html +121 -0
- data/app_generators/rx_app/templates/html-template/playerProductInstall.swf +0 -0
- data/app_generators/rx_app/templates/index.html.erb +18 -0
- data/app_generators/rx_app/templates/index.yaml +11 -0
- data/app_generators/rx_app/templates/mainair-app.xml +134 -0
- data/app_generators/rx_app/templates/mainapp-config.xml +22 -0
- data/app_generators/rx_app/templates/mainapp.mxml +152 -0
- data/app_generators/rx_app/templates/project-textmate.erb +72 -0
- data/app_generators/rx_app/templates/project.properties +18 -0
- data/app_generators/rx_app/templates/projectair.properties +24 -0
- data/app_generators/rx_app/templates/restfulx.yml +46 -0
- data/app_generators/rx_app/templates/swfobject.js +5 -0
- data/bin/rx-gen +31 -0
- data/lib/restfulx.rb +90 -0
- data/lib/restfulx/active_foo.rb +181 -0
- data/lib/restfulx/active_record_tasks.rb +90 -0
- data/lib/restfulx/active_record_uuid_helper.rb +17 -0
- data/lib/restfulx/configuration.rb +75 -0
- data/lib/restfulx/datamapper_foo.rb +81 -0
- data/lib/restfulx/rails/recipes.rb +60 -0
- data/lib/restfulx/rails/schema_to_yaml.rb +112 -0
- data/lib/restfulx/rails/schema_to_yaml/extensions/enumerable.rb +8 -0
- data/lib/restfulx/rails/schema_to_yaml/settings/config.rb +17 -0
- data/lib/restfulx/rails/schema_to_yaml/settings/core.rb +73 -0
- data/lib/restfulx/rails/swf_helper.rb +59 -0
- data/lib/restfulx/tasks.rb +110 -0
- data/rails_generators/rx_config/USAGE +19 -0
- data/rails_generators/rx_config/rx_config_generator.rb +151 -0
- data/rails_generators/rx_config/templates/actionscript.properties +16 -0
- data/rails_generators/rx_config/templates/actionscriptair.properties +16 -0
- data/rails_generators/rx_config/templates/expressInstall.swf +0 -0
- data/rails_generators/rx_config/templates/flex.properties +2 -0
- data/rails_generators/rx_config/templates/flex_controller.erb +4 -0
- data/rails_generators/rx_config/templates/html-template/AC_OETags.js +276 -0
- data/rails_generators/rx_config/templates/html-template/history/history.css +6 -0
- data/rails_generators/rx_config/templates/html-template/history/history.js +645 -0
- data/rails_generators/rx_config/templates/html-template/history/historyFrame.html +29 -0
- data/rails_generators/rx_config/templates/html-template/index.template.html +121 -0
- data/rails_generators/rx_config/templates/html-template/playerProductInstall.swf +0 -0
- data/rails_generators/rx_config/templates/index.erb +16 -0
- data/rails_generators/rx_config/templates/mainair-app.xml +134 -0
- data/rails_generators/rx_config/templates/mainapp-config.xml +22 -0
- data/rails_generators/rx_config/templates/mainapp.mxml +129 -0
- data/rails_generators/rx_config/templates/project-textmate.erb +72 -0
- data/rails_generators/rx_config/templates/project.properties +18 -0
- data/rails_generators/rx_config/templates/projectair.properties +24 -0
- data/rails_generators/rx_config/templates/restfulx.erb +75 -0
- data/rails_generators/rx_config/templates/restfulx.yml +65 -0
- data/rails_generators/rx_config/templates/restfulx_tasks.rake +9 -0
- data/rails_generators/rx_config/templates/routes.erb +47 -0
- data/rails_generators/rx_config/templates/session_store_flash.erb +1 -0
- data/rails_generators/rx_config/templates/swfobject.js +5 -0
- data/rails_generators/rx_controller/USAGE +10 -0
- data/rails_generators/rx_controller/rx_controller_generator.rb +31 -0
- data/rails_generators/rx_controller/templates/controller.as.erb +38 -0
- data/rails_generators/rx_main_app/USAGE +8 -0
- data/rails_generators/rx_main_app/rx_main_app_generator.rb +60 -0
- data/rails_generators/rx_main_app/templates/mainapp.mxml +129 -0
- data/rails_generators/rx_scaffold/USAGE +35 -0
- data/rails_generators/rx_scaffold/rx_scaffold_generator.rb +242 -0
- data/rails_generators/rx_scaffold/templates/controllers/default.rb.erb +125 -0
- data/rails_generators/rx_scaffold/templates/controllers/resource_controller.rb.erb +23 -0
- data/rails_generators/rx_scaffold/templates/fixtures.yml.erb +39 -0
- data/rails_generators/rx_scaffold/templates/functional_test.rb +45 -0
- data/rails_generators/rx_scaffold/templates/helper_test.rb +4 -0
- data/rails_generators/rx_scaffold/templates/layouts/default.erb +167 -0
- data/rails_generators/rx_scaffold/templates/migration.rb.erb +46 -0
- data/rails_generators/rx_scaffold/templates/model.as.erb +73 -0
- data/rails_generators/rx_scaffold/templates/model.rb.erb +46 -0
- data/rails_generators/rx_yaml_scaffold/USAGE +51 -0
- data/rails_generators/rx_yaml_scaffold/rx_yaml_scaffold_generator.rb +68 -0
- data/rxgen_generators/rx_config/USAGE +5 -0
- data/rxgen_generators/rx_config/rx_config_generator.rb +21 -0
- data/rxgen_generators/rx_controller/USAGE +10 -0
- data/rxgen_generators/rx_controller/rx_controller_generator.rb +41 -0
- data/rxgen_generators/rx_controller/templates/assist.py +65 -0
- data/rxgen_generators/rx_controller/templates/controller.as.erb +38 -0
- data/rxgen_generators/rx_controller/templates/iso8601.py +92 -0
- data/rxgen_generators/rx_controller/templates/restful.py +136 -0
- data/rxgen_generators/rx_main_app/USAGE +8 -0
- data/rxgen_generators/rx_main_app/rx_main_app_generator.rb +65 -0
- data/rxgen_generators/rx_main_app/templates/main.py.erb +29 -0
- data/rxgen_generators/rx_main_app/templates/mainapp.mxml +152 -0
- data/rxgen_generators/rx_scaffold/USAGE +29 -0
- data/rxgen_generators/rx_scaffold/rx_scaffold_generator.rb +194 -0
- data/rxgen_generators/rx_scaffold/templates/controller.py.erb +27 -0
- data/rxgen_generators/rx_scaffold/templates/layouts/default.erb +167 -0
- data/rxgen_generators/rx_scaffold/templates/model.as.erb +73 -0
- data/rxgen_generators/rx_scaffold/templates/model.py.erb +14 -0
- data/rxgen_generators/rx_yaml_scaffold/USAGE +45 -0
- data/rxgen_generators/rx_yaml_scaffold/rx_yaml_scaffold_generator.rb +47 -0
- data/spec/restfulx_spec.rb +4 -0
- data/spec/spec_helper.rb +13 -0
- data/tasks/restfulx.rake +2 -0
- data/test/rails/controllers/application_controller.rb +15 -0
- data/test/rails/controllers/locations_controller.rb +93 -0
- data/test/rails/controllers/notes_controller.rb +96 -0
- data/test/rails/controllers/projects_controller.rb +93 -0
- data/test/rails/controllers/tasks_controller.rb +93 -0
- data/test/rails/controllers/users_controller.rb +93 -0
- data/test/rails/database.yml +4 -0
- data/test/rails/fixtures/locations.yml +8 -0
- data/test/rails/fixtures/notes.yml +17 -0
- data/test/rails/fixtures/projects.yml +25 -0
- data/test/rails/fixtures/simple_properties.yml +19 -0
- data/test/rails/fixtures/tasks.yml +46 -0
- data/test/rails/fixtures/users.yml +13 -0
- data/test/rails/helpers/functional_test_helper.rb +21 -0
- data/test/rails/helpers/test_helper.rb +54 -0
- data/test/rails/helpers/unit_test_helper.rb +29 -0
- data/test/rails/model.yml +35 -0
- data/test/rails/models/location.rb +4 -0
- data/test/rails/models/note.rb +3 -0
- data/test/rails/models/project.rb +4 -0
- data/test/rails/models/simple_property.rb +2 -0
- data/test/rails/models/task.rb +18 -0
- data/test/rails/models/user.rb +20 -0
- data/test/rails/schema.rb +77 -0
- data/test/rails/test.swf +1 -0
- data/test/rails/test_active_foo.rb +36 -0
- data/test/rails/test_rails_integration_functional.rb +22 -0
- data/test/rails/test_to_fxml.rb +35 -0
- data/test/rails/test_to_json.rb +23 -0
- data/test/rails/views/notes/empty_params_action.html.erb +1 -0
- data/test/rails/views/notes/index.html.erb +1 -0
- metadata +234 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# ActiveRecord specific Rake tasks. Namely, nice little extras such as:
|
|
2
|
+
# - db:mysql:stage
|
|
3
|
+
# - db:refresh
|
|
4
|
+
require File.join(File.dirname(__FILE__), 'tasks')
|
|
5
|
+
require File.join(File.dirname(__FILE__), 'rails', 'schema_to_yaml')
|
|
6
|
+
|
|
7
|
+
# stores local copy of the application environment ('production', 'test', etc)
|
|
8
|
+
# so that appropriate values in config/database.yml are used
|
|
9
|
+
APP_ENV = defined?(ENV['RAILS_ENV']) ? ENV['RAILS_ENV'] : ENV['MERB_ENV']
|
|
10
|
+
|
|
11
|
+
namespace :db do
|
|
12
|
+
namespace :mysql do
|
|
13
|
+
namespace :stage do
|
|
14
|
+
desc "Stage production, test and development databases"
|
|
15
|
+
task :all do
|
|
16
|
+
db_names = %w(development test production)
|
|
17
|
+
admin_password = ENV["ADMINPASS"] || ""
|
|
18
|
+
db_user_name = ENV["USER"] || "root"
|
|
19
|
+
db_password = ENV["PASS"] || ""
|
|
20
|
+
stage_database(db_names, admin_password, db_user_name, db_password)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
desc "Stage the database environment for #{APP_ENV}"
|
|
25
|
+
task :stage do
|
|
26
|
+
db_names = [APP_ENV]
|
|
27
|
+
admin_password = ENV["ADMINPASS"] || ""
|
|
28
|
+
db_user_name = ENV["USER"] || "root"
|
|
29
|
+
db_password = ENV["PASS"] || ""
|
|
30
|
+
stage_database(db_names, admin_password, db_user_name, db_password)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Performs MySQL database set-up based on the username and password
|
|
35
|
+
# provided. Also updates Rails config/database.yml file with database
|
|
36
|
+
# username and password
|
|
37
|
+
def stage_database(db_names, admin_password, db_user_name, db_password)
|
|
38
|
+
sql_command = ""
|
|
39
|
+
|
|
40
|
+
db_names.each do |name|
|
|
41
|
+
db_name = ActiveRecord::Base.configurations[name]['database']
|
|
42
|
+
sql_command += "drop database if exists #{db_name}; " <<
|
|
43
|
+
"create database #{db_name}; grant all privileges on #{db_name}.* " <<
|
|
44
|
+
"to #{db_user_name}@localhost identified by \'#{db_password}\';"
|
|
45
|
+
ActiveRecord::Base.configurations[name]['username'] = db_user_name
|
|
46
|
+
ActiveRecord::Base.configurations[name]['password'] = db_password
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
if (!File.exist?("#{APP_ROOT}/tmp/stage.sql"))
|
|
50
|
+
File.open("#{APP_ROOT}/tmp/stage.sql", "w") do |file|
|
|
51
|
+
file.print sql_command
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# back up the original database.yml file just in case
|
|
56
|
+
File.copy("#{APP_ROOT}/config/database.yml",
|
|
57
|
+
"#{APP_ROOT}/config/database.yml.sample") if !File.exist?("#{APP_ROOT}/config/database.yml.sample")
|
|
58
|
+
|
|
59
|
+
dbconfig = File.read("#{APP_ROOT}/config/database.yml")
|
|
60
|
+
dbconfig.gsub!(/username:.*/, "username: #{db_user_name}")
|
|
61
|
+
dbconfig.gsub!(/password:.*/, "password: #{db_password}")
|
|
62
|
+
|
|
63
|
+
File.open("#{APP_ROOT}/config/database.yml", "w") do |file|
|
|
64
|
+
file.print dbconfig
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
if system %(mysql -h localhost -u root --password=#{admin_password} < tmp/stage.sql)
|
|
68
|
+
puts "Updated config/database.yml and staged the database based on your settings"
|
|
69
|
+
File.delete("tmp/stage.sql") if File.file?("tmp/stage.sql")
|
|
70
|
+
else
|
|
71
|
+
puts "Staging was not performed. Check console for errors. It is possible that 'mysql' executable was not found."
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
desc "Drop the database environment for #{APP_ENV} only if it exists"
|
|
76
|
+
task :drop_if_exists do
|
|
77
|
+
Rake::Task["db:drop"].invoke rescue nil
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
desc "Refresh the database environment for #{APP_ENV}"
|
|
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
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Patches ActiveRecord models to use UUID based IDs instead of the default numeric ones
|
|
2
|
+
require 'uuidtools'
|
|
3
|
+
|
|
4
|
+
# Extends ActiveRecord models with UUID based IDs
|
|
5
|
+
module RestfulX
|
|
6
|
+
module UUIDHelper
|
|
7
|
+
def self.included(base)
|
|
8
|
+
base.class_eval do
|
|
9
|
+
before_create :generate_uuid
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def generate_uuid
|
|
14
|
+
self.id = UUIDTools::UUID.random_create.to_s.gsub("-", "") unless self.id
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Interestingly enough there's no way to *just* upper-case or down-case first letter of a given
|
|
2
|
+
# string. Ruby's own +capitalize+ actually downcases all the rest of the characters in the string
|
|
3
|
+
# We patch the class to add our own implementation.
|
|
4
|
+
require "yaml"
|
|
5
|
+
require "erb"
|
|
6
|
+
require File.dirname(__FILE__) + "/rails/schema_to_yaml/settings/config"
|
|
7
|
+
require File.dirname(__FILE__) + "/rails/schema_to_yaml/settings/core"
|
|
8
|
+
|
|
9
|
+
Dir[File.dirname(__FILE__) + "/rails/schema_to_yaml/extensions/*.rb"].each do |f|
|
|
10
|
+
require f
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class String
|
|
14
|
+
# Upper-case first character of a string leave the rest of the string intact
|
|
15
|
+
def ucfirst
|
|
16
|
+
self[0,1].capitalize + self[1..-1]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Down-case first character of a string leaving the rest of it intact
|
|
20
|
+
def dcfirst
|
|
21
|
+
self[0,1].downcase + self[1..-1]
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Primary RestfulX configuration options
|
|
26
|
+
module RestfulX
|
|
27
|
+
# Computes necessary configuration options from the environment. This can be used in Rails, Merb
|
|
28
|
+
# or standalone from the command line.
|
|
29
|
+
module Configuration
|
|
30
|
+
# We try to figure out the application root using a number of possible options
|
|
31
|
+
APP_ROOT = defined?(RAILS_ROOT) ? RAILS_ROOT : defined?(Merb) ? Merb.root : File.expand_path(".")
|
|
32
|
+
|
|
33
|
+
RxSettings = SchemaToYaml::Settings::Core
|
|
34
|
+
|
|
35
|
+
# Extract project, package, controller name, etc from the environment. This will respect
|
|
36
|
+
# config/restfulx.yml if it exists, you can override all of the defaults there.
|
|
37
|
+
def extract_names(project = nil)
|
|
38
|
+
if project
|
|
39
|
+
project_name = project.downcase.gsub(/\W/, '')
|
|
40
|
+
flex_project_name = project_name.camelize
|
|
41
|
+
else
|
|
42
|
+
project_name = APP_ROOT.split("/").last.gsub(/\W/, '')
|
|
43
|
+
flex_project_name = project_name.camelize
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# give a chance to override the settings via restfulx.yml
|
|
47
|
+
begin
|
|
48
|
+
config = YAML.load(File.open("#{APP_ROOT}/config/restfulx.yml"))
|
|
49
|
+
base_package = config['base_package'] || flex_project_name.downcase
|
|
50
|
+
base_folder = base_package.gsub('.', '/')
|
|
51
|
+
project_name = config['project_name'].downcase.gsub(/\W/, '') || project_name
|
|
52
|
+
flex_project_name = project_name.camelize
|
|
53
|
+
controller_name = config['controller_name'] || "ApplicationController"
|
|
54
|
+
flex_root = config['flex_root'] || "app/flex"
|
|
55
|
+
distributed = config['distributed'] || false
|
|
56
|
+
rescue
|
|
57
|
+
base_folder = base_package = flex_project_name.downcase
|
|
58
|
+
controller_name = "ApplicationController"
|
|
59
|
+
flex_root = "app/flex"
|
|
60
|
+
distributed = false
|
|
61
|
+
end
|
|
62
|
+
[project_name, flex_project_name, controller_name, base_package, base_folder, flex_root, distributed]
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# List files ending in *.as (ActionScript) in a given folder
|
|
66
|
+
def list_as_files(dir_name)
|
|
67
|
+
Dir.entries(dir_name).grep(/\.as$/).map { |name| name.sub(/\.as$/, "") }.join(", ")
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# List files ending in *.mxml in a given folder
|
|
71
|
+
def list_mxml_files(dir_name)
|
|
72
|
+
Dir.entries(dir_name).grep(/\.mxml$/).map { |name| name.sub(/\.mxml$/, "") }
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Flex friendly DataMapper patches, more specifically we just add +to_xml+ on
|
|
2
|
+
# ValidationErrors class
|
|
3
|
+
require 'dm-serializer/common'
|
|
4
|
+
require 'dm-serializer/xml_serializers'
|
|
5
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'restfulx') if !defined?(RestfulX)
|
|
6
|
+
|
|
7
|
+
# RestfulX datamapper patches
|
|
8
|
+
module DataMapper
|
|
9
|
+
|
|
10
|
+
# Monkey patches dm-serialization to_json method to add ruby_class: YourClass
|
|
11
|
+
# to all serialized objects
|
|
12
|
+
module Serialize
|
|
13
|
+
# Serialize a Resource to JavaScript Object Notation (JSON; RFC 4627)
|
|
14
|
+
#
|
|
15
|
+
# @return <String> a JSON representation of the Resource
|
|
16
|
+
def to_json(*args)
|
|
17
|
+
options = args.first || {}
|
|
18
|
+
result = '{ '
|
|
19
|
+
fields = []
|
|
20
|
+
|
|
21
|
+
propset = properties_to_serialize(options)
|
|
22
|
+
|
|
23
|
+
fields += propset.map do |property|
|
|
24
|
+
"#{property.name.to_json}: #{send(property.getter).to_json}"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
fields << "\"ruby_class\": #{self.class.to_json}"
|
|
28
|
+
|
|
29
|
+
# add methods
|
|
30
|
+
(options[:methods] || []).each do |meth|
|
|
31
|
+
if self.respond_to?(meth)
|
|
32
|
+
fields << "#{meth.to_json}: #{send(meth).to_json}"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Note: if you want to include a whole other model via relation, use :methods
|
|
37
|
+
# comments.to_json(:relationships=>{:user=>{:include=>[:first_name],:methods=>[:age]}})
|
|
38
|
+
# add relationships
|
|
39
|
+
# TODO: This needs tests and also needs to be ported to #to_xml and #to_yaml
|
|
40
|
+
(options[:relationships] || {}).each do |rel,opts|
|
|
41
|
+
if self.respond_to?(rel)
|
|
42
|
+
fields << "#{rel.to_json}: #{send(rel).to_json(opts)}"
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
result << fields.join(', ')
|
|
47
|
+
result << ' }'
|
|
48
|
+
result
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# see DataMapper docs for more details
|
|
53
|
+
module Validate
|
|
54
|
+
# By default DataMapper validation errors doesn't have +to_xml+ method. This is
|
|
55
|
+
# actually very useful when dealing with remote stateful clients such as Flex/AIR.
|
|
56
|
+
class ValidationErrors
|
|
57
|
+
# Add Flex-friendly +to_xml+ implementation
|
|
58
|
+
def to_xml
|
|
59
|
+
xml = DataMapper::Serialize::XMLSerializers::SERIALIZER
|
|
60
|
+
doc ||= xml.new_document
|
|
61
|
+
root = xml.root_node(doc, "errors")
|
|
62
|
+
@errors.each_key do |attribute|
|
|
63
|
+
@errors[attribute].each do |msg|
|
|
64
|
+
next if msg.nil?
|
|
65
|
+
if attribute == "base"
|
|
66
|
+
xml.add_node(root, "error", nil, {"message" => msg})
|
|
67
|
+
else
|
|
68
|
+
xml.add_node(root, "error", nil, {"field" => attribute.to_s.camel_case.dcfirst, "message" => msg})
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
xml.output(doc)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Add to_json support for datamapper errors too
|
|
76
|
+
def to_json
|
|
77
|
+
@errors.to_json
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Adds Capistrano recipes for deploying Flex applications
|
|
2
|
+
#
|
|
3
|
+
# To use these recipes, add the following to your Capfile:
|
|
4
|
+
#
|
|
5
|
+
# require 'restfulx/rails/recipes'
|
|
6
|
+
require 'find'
|
|
7
|
+
|
|
8
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
|
9
|
+
after "deploy:setup", "deploy:flex:setup"
|
|
10
|
+
|
|
11
|
+
namespace :db do
|
|
12
|
+
desc "runs db:refresh in the latest release directory."
|
|
13
|
+
task :refresh, :roles => :db do
|
|
14
|
+
run("cd #{latest_release} && rake db:refresh RAILS_ENV=production")
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
namespace :deploy do
|
|
19
|
+
namespace :flex do
|
|
20
|
+
|
|
21
|
+
desc "Creates the flex_files directory in the shared directory"
|
|
22
|
+
task :setup do
|
|
23
|
+
flex_dir = File.join(shared_path, 'flex_files')
|
|
24
|
+
run "#{try_sudo} mkdir -p #{flex_dir} && #{try_sudo} chmod g+w #{flex_dir}"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
desc "uploads everything in public/bin up to the server"
|
|
28
|
+
task :via_dumb_copy, :roles => :app do
|
|
29
|
+
# the -p flag on mkdir makes intermediate directories (i.e. both /bin and /bin/history),
|
|
30
|
+
# and doesn't raise an error if any of the directories already exist.
|
|
31
|
+
rails_root = Dir.pwd # You have to run cap tasks from RAILS_ROOT anyways
|
|
32
|
+
base_dir = File.join(rails_root, 'public', 'bin')
|
|
33
|
+
ec2_base_dir = File.join(shared_path, 'flex_files')
|
|
34
|
+
|
|
35
|
+
Find.find(base_dir) do |file|
|
|
36
|
+
filename_without_base_dir = file.sub(base_dir, '')
|
|
37
|
+
if File.directory?(file)
|
|
38
|
+
run "mkdir -p #{File.join(ec2_base_dir, filename_without_base_dir)}"
|
|
39
|
+
else
|
|
40
|
+
content = File.open(file, 'rb') {|f| f.read}
|
|
41
|
+
put content, File.join(ec2_base_dir, filename_without_base_dir)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
desc "synchronizes the local and remote public/bin directories using rsync"
|
|
47
|
+
task :via_rsync, :roles => :app do
|
|
48
|
+
username = user || ENV['USER']
|
|
49
|
+
rails_root = Dir.pwd # You have to run cap tasks from RAILS_ROOT anyways
|
|
50
|
+
execute_on_servers do |server|
|
|
51
|
+
`rsync -r -p -v -e \"ssh -i #{ssh_options[:keys]}\" #{File.join(rails_root, 'public', 'bin')}/ #{username}@#{server}:#{File.join(shared_path, 'flex_files')}/`
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
task :make_symlink, :roles => :app do
|
|
56
|
+
run "ln -s #{shared_path}/flex_files #{release_path}/public/bin"
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Used for analyzing your schema and exporting a model.yml file for Rx
|
|
2
|
+
# Provides facilities to convert an existing Rails application schema.rb file to
|
|
3
|
+
# RestfulX model.yml file
|
|
4
|
+
module SchemaToYaml
|
|
5
|
+
# SchemaToYaml.schema_to_yaml
|
|
6
|
+
# - set of commands that introspects your database and formats your model.yml for export
|
|
7
|
+
def self.schema_to_yaml
|
|
8
|
+
# Iterates through your database, and sets up table_arr with all columns
|
|
9
|
+
# - excludes schema_info/schema_migrations/and any other tables you specify in restfulx.yml
|
|
10
|
+
table_arr = ActiveRecord::Base.connection.tables -
|
|
11
|
+
%w(schema_info schema_migrations).map -
|
|
12
|
+
RxSettings.ignored.tables[0].split
|
|
13
|
+
|
|
14
|
+
# Excludes columns from each table
|
|
15
|
+
disregarded_columns = %w(id created_at updated_at) + RxSettings.ignored.fields[0].split
|
|
16
|
+
|
|
17
|
+
# Schema variable is appended to throughout, and is the variable exported to model.yml
|
|
18
|
+
schema = []
|
|
19
|
+
|
|
20
|
+
# Set up empty array for has_many relationships
|
|
21
|
+
@array_of_has_manies = []
|
|
22
|
+
|
|
23
|
+
# Iterates through each table, and checks for any database field ending in _id
|
|
24
|
+
table_arr.each do |table|
|
|
25
|
+
column_arr = ActiveRecord::Base.connection.columns(table)
|
|
26
|
+
column_arr.each do |col|
|
|
27
|
+
col_name = col.name.to_s
|
|
28
|
+
@array_of_has_manies << "#{col_name.gsub(/_id\b/,'')}_#{table}" if col_name[-3,3]=='_id'
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
table_arr.each do |table|
|
|
33
|
+
# Set up empty arrays for other associations
|
|
34
|
+
belong_tos = []
|
|
35
|
+
has_manies = []
|
|
36
|
+
polymorphics = []
|
|
37
|
+
|
|
38
|
+
# Append table name to schema
|
|
39
|
+
# - project:
|
|
40
|
+
schema << "#{table.singularize}:\n"
|
|
41
|
+
column_arr = ActiveRecord::Base.connection.columns(table)
|
|
42
|
+
|
|
43
|
+
column_arr.each do |col|
|
|
44
|
+
col_name = col.name.to_s
|
|
45
|
+
|
|
46
|
+
# Ignore certain columns
|
|
47
|
+
columns_check = []
|
|
48
|
+
disregarded_columns.each {|dc| columns_check << col_name.include?(dc) }
|
|
49
|
+
|
|
50
|
+
# Sets up polymorphics array, we'll need to check for duplicates below
|
|
51
|
+
polymorphics << col_name.gsub('_id','PMCHECK').gsub('_type','PMCHECK')
|
|
52
|
+
|
|
53
|
+
# Appends each column under respective table
|
|
54
|
+
schema << " - #{col_name}: #{col.type}\n" unless columns_check.include?(true)
|
|
55
|
+
|
|
56
|
+
# Checks for certain column names
|
|
57
|
+
# - If it finds parent_id it sets up a tree_model for generation
|
|
58
|
+
# - If it finds _file_size it sets up attachment for generation
|
|
59
|
+
# - Sets up belong_tos
|
|
60
|
+
if col_name == 'parent_id'
|
|
61
|
+
schema << " - tree_model: [#{col_name.gsub(/_id\b/,'')}]\n"
|
|
62
|
+
elsif col_name =~ /_file_size$/
|
|
63
|
+
schema << " - attachment_field: [#{col_name.gsub(/_file_size$/,'')}]\n"
|
|
64
|
+
else
|
|
65
|
+
belong_tos << col_name.gsub(/_id\b/,', ') if col_name[-3,3]=='_id' && !disregarded_columns.include?(col_name)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Checks for duplicates in the polymorphics array (used for error checking)
|
|
70
|
+
if polymorphics.dups.size > 0
|
|
71
|
+
schema << " - polymorphic: [#{polymorphics.dups.first.gsub('PMCHECK','')}]\n"
|
|
72
|
+
@polymorphic = polymorphics.dups.first.gsub('PMCHECK','')
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Cleans up has many
|
|
76
|
+
@array_of_has_manies.each do |hm|
|
|
77
|
+
sanity_check = hm.gsub(/^#{table.singularize}_/,'')
|
|
78
|
+
if hm =~ /^#{table.singularize}_/ && table_arr.include?(sanity_check)
|
|
79
|
+
has_manies << hm.gsub(/^#{table.singularize}_/,'') + ', '
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Appends belong_to's to schema ##Patch here ## http://gist.github.com/151713 if all of the belongs_to on a particular table are polymorphic, then belong_tos is empty, so belong_tos.last is nil, so 87 (before patch) blows up
|
|
84
|
+
if belong_tos.size > 0
|
|
85
|
+
belong_tos = belong_tos.delete_if {|x| x == "#{@polymorphic}, " }
|
|
86
|
+
if belong_tos.size > 0
|
|
87
|
+
last_in_array_fix = belong_tos.last
|
|
88
|
+
last_in_array_fix = last_in_array_fix.gsub(', ','')
|
|
89
|
+
belong_tos.pop
|
|
90
|
+
belong_tos << last_in_array_fix
|
|
91
|
+
schema << " - belongs_to: [#{belong_tos}]\n"
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Appends has_manies' to schema
|
|
96
|
+
if has_manies.size > 0
|
|
97
|
+
last_in_array_fix = has_manies.last
|
|
98
|
+
last_in_array_fix = last_in_array_fix.gsub(', ','')
|
|
99
|
+
has_manies.pop
|
|
100
|
+
has_manies << last_in_array_fix
|
|
101
|
+
schema << " - has_many: [#{has_manies}]\n"
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
schema << "\n"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Writes model.yml file
|
|
108
|
+
yml_file = File.join(RAILS_ROOT, "db", "model.yml")
|
|
109
|
+
File.open(yml_file, "w") { |f| f << schema.to_s }
|
|
110
|
+
puts "Model.yml created at db/model.yml"
|
|
111
|
+
end
|
|
112
|
+
end
|