dima-ruboss4ruby 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. data/Generators +7 -0
  2. data/History.txt +4 -0
  3. data/Manifest.txt +116 -0
  4. data/README.rdoc +23 -0
  5. data/gpl-3.0.txt +674 -0
  6. data/lib/ruboss4ruby.rb +84 -0
  7. data/lib/ruboss4ruby/active_foo.rb +221 -0
  8. data/lib/ruboss4ruby/active_record_tasks.rb +75 -0
  9. data/lib/ruboss4ruby/configuration.rb +59 -0
  10. data/lib/ruboss4ruby/datamapper_foo.rb +25 -0
  11. data/lib/ruboss4ruby/generated_attribute.rb +61 -0
  12. data/lib/ruboss4ruby/tasks.rb +80 -0
  13. data/merb_generators/ruboss_config.rb +103 -0
  14. data/merb_generators/ruboss_controller.rb +59 -0
  15. data/merb_generators/ruboss_flex_app.rb +67 -0
  16. data/merb_generators/ruboss_resource.rb +37 -0
  17. data/merb_generators/ruboss_resource_controller.rb +80 -0
  18. data/merb_generators/ruboss_scaffold.rb +157 -0
  19. data/merb_generators/templates/ruboss_config/actionscript.properties +16 -0
  20. data/merb_generators/templates/ruboss_config/actionscriptair.properties +16 -0
  21. data/merb_generators/templates/ruboss_config/expressInstall.swf +0 -0
  22. data/merb_generators/templates/ruboss_config/flex.properties +2 -0
  23. data/merb_generators/templates/ruboss_config/html-template/AC_OETags.js +276 -0
  24. data/merb_generators/templates/ruboss_config/html-template/history/history.css +6 -0
  25. data/merb_generators/templates/ruboss_config/html-template/history/history.js +645 -0
  26. data/merb_generators/templates/ruboss_config/html-template/history/historyFrame.html +29 -0
  27. data/merb_generators/templates/ruboss_config/html-template/index.template.html +121 -0
  28. data/merb_generators/templates/ruboss_config/html-template/playerProductInstall.swf +0 -0
  29. data/merb_generators/templates/ruboss_config/index.html.erb +18 -0
  30. data/merb_generators/templates/ruboss_config/mainair-app.xml +134 -0
  31. data/merb_generators/templates/ruboss_config/project.properties +18 -0
  32. data/merb_generators/templates/ruboss_config/projectair.properties +24 -0
  33. data/merb_generators/templates/ruboss_config/ruboss.yml +16 -0
  34. data/merb_generators/templates/ruboss_config/swfobject.js +5 -0
  35. data/merb_generators/templates/ruboss_controller/controller.as.erb +40 -0
  36. data/merb_generators/templates/ruboss_flex_app/mainapp.mxml +34 -0
  37. data/merb_generators/templates/ruboss_resource_controller/controller_ar.rb.erb +49 -0
  38. data/merb_generators/templates/ruboss_resource_controller/controller_dm.rb.erb +46 -0
  39. data/merb_generators/templates/ruboss_resource_controller/spec/controllers/%file_name%_spec.rb +7 -0
  40. data/merb_generators/templates/ruboss_resource_controller/spec/requests/%file_name%_spec.rb +1 -0
  41. data/merb_generators/templates/ruboss_resource_controller/test/controllers/%file_name%_test.rb +17 -0
  42. data/rails_generators/ruboss_config/USAGE +18 -0
  43. data/rails_generators/ruboss_config/ruboss_config_generator.rb +114 -0
  44. data/rails_generators/ruboss_config/templates/actionscript.properties +16 -0
  45. data/rails_generators/ruboss_config/templates/actionscriptair.properties +16 -0
  46. data/rails_generators/ruboss_config/templates/expressInstall.swf +0 -0
  47. data/rails_generators/ruboss_config/templates/flex.properties +2 -0
  48. data/rails_generators/ruboss_config/templates/html-template/AC_OETags.js +276 -0
  49. data/rails_generators/ruboss_config/templates/html-template/history/history.css +6 -0
  50. data/rails_generators/ruboss_config/templates/html-template/history/history.js +645 -0
  51. data/rails_generators/ruboss_config/templates/html-template/history/historyFrame.html +29 -0
  52. data/rails_generators/ruboss_config/templates/html-template/index.template.html +121 -0
  53. data/rails_generators/ruboss_config/templates/html-template/playerProductInstall.swf +0 -0
  54. data/rails_generators/ruboss_config/templates/index.html.erb +18 -0
  55. data/rails_generators/ruboss_config/templates/mainair-app.xml +134 -0
  56. data/rails_generators/ruboss_config/templates/mainapp-config.xml +21 -0
  57. data/rails_generators/ruboss_config/templates/mainapp.mxml +31 -0
  58. data/rails_generators/ruboss_config/templates/project-textmate.erb +52 -0
  59. data/rails_generators/ruboss_config/templates/project.properties +18 -0
  60. data/rails_generators/ruboss_config/templates/projectair.properties +24 -0
  61. data/rails_generators/ruboss_config/templates/ruboss.yml +14 -0
  62. data/rails_generators/ruboss_config/templates/ruboss_tasks.rake +5 -0
  63. data/rails_generators/ruboss_config/templates/swfobject.js +5 -0
  64. data/rails_generators/ruboss_controller/USAGE +11 -0
  65. data/rails_generators/ruboss_controller/ruboss_controller_generator.rb +31 -0
  66. data/rails_generators/ruboss_controller/templates/controller.as.erb +40 -0
  67. data/rails_generators/ruboss_scaffold/USAGE +35 -0
  68. data/rails_generators/ruboss_scaffold/ruboss_scaffold_generator.rb +177 -0
  69. data/rails_generators/ruboss_scaffold/templates/component.mxml.erb +149 -0
  70. data/rails_generators/ruboss_scaffold/templates/controller.rb.erb +97 -0
  71. data/rails_generators/ruboss_scaffold/templates/fixtures.yml.erb +35 -0
  72. data/rails_generators/ruboss_scaffold/templates/migration.rb.erb +19 -0
  73. data/rails_generators/ruboss_scaffold/templates/model.as.erb +42 -0
  74. data/rails_generators/ruboss_scaffold/templates/model.rb.erb +11 -0
  75. data/rails_generators/ruboss_yaml_scaffold/USAGE +14 -0
  76. data/rails_generators/ruboss_yaml_scaffold/ruboss_yaml_scaffold_generator.rb +44 -0
  77. data/rcl-1.0.txt +0 -0
  78. metadata +197 -0
@@ -0,0 +1,84 @@
1
+ module Ruboss
2
+ VERSION = '1.0.5'
3
+ RUBOSS_FRAMEWORK_VERSION = '1.0.5'
4
+
5
+ LIB_DIR = File.join(File.dirname(__FILE__), 'ruboss4ruby/')
6
+ end
7
+
8
+ # Merb specific handling
9
+ # make sure we're running inside Merb
10
+ if defined?(Merb::Plugins)
11
+ Merb::Plugins.add_rakefiles 'ruboss4ruby/tasks'
12
+
13
+ Merb::BootLoader.before_app_loads do
14
+ require Ruboss::LIB_DIR + 'configuration'
15
+
16
+ if defined?(ActiveRecord::Base)
17
+ Merb.add_mime_type(:fxml, :to_fxml, %w[application/xml text/xml application/x-xml], :charset => "utf-8")
18
+ require Ruboss::LIB_DIR + 'active_foo'
19
+ Merb::Plugins.add_rakefiles 'ruboss4ruby/active_record_tasks'
20
+ else
21
+ Merb.add_mime_type(:fxml, :to_xml, %w[application/xml text/xml application/x-xml], :charset => "utf-8")
22
+ if defined?(Merb::Orms::DataMapper)
23
+ require Ruboss::LIB_DIR + 'datamapper_foo'
24
+ end
25
+ end
26
+ end
27
+ elsif defined?(ActionController::Base)
28
+ # if we are not running in Merb, we've got to be running in Rails
29
+ Mime::Type.register_alias "application/xml", :fxml
30
+
31
+ ['configuration', 'active_foo', 'rails/ruboss_helper',
32
+ 'rails/ruboss_test_helpers'].each { |lib| require Ruboss::LIB_DIR + lib }
33
+
34
+ ActionView::Base.send :include, RubossHelper unless ActionView::Base.included_modules.include?(RubossHelper)
35
+ Test::Unit::TestCase.send :include, RubossTestHelpers unless Test::Unit::TestCase.included_modules.include?(RubossTestHelpers)
36
+
37
+ module ActionController
38
+ class Base
39
+ alias_method :old_render, :render unless method_defined?(:old_render)
40
+
41
+ # so that we can have handling for :fxml option and write code like
42
+ # format.fxml { render :fxml => @projects }
43
+ def render(options = nil, extra_options = {}, &block)
44
+ if options.is_a?(Hash) && options[:fxml]
45
+ xml = options[:fxml]
46
+ response.content_type ||= Mime::XML
47
+ render_for_text(xml.respond_to?(:to_fxml) ? xml.to_fxml : xml, options[:status])
48
+ else
49
+ old_render(options, extra_options, &block)
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ module RubossController
56
+ private
57
+
58
+ # Extract any keys named _metadata from the models in the params hash
59
+ # and put them in the root of the params hash.
60
+ def extract_metadata_from_params
61
+ metadata = {}
62
+ metadata.merge!(params.delete('_metadata')) if params.has_key?('_metadata')
63
+ params.each do |k, v|
64
+ next unless v.respond_to?(:has_key?) and v.has_key?('_metadata')
65
+ metadata.merge!(v.delete('_metadata'))
66
+ end
67
+ params.merge!(metadata) unless metadata.empty?
68
+ end
69
+ end
70
+
71
+ module ActiveRecord
72
+ module NamedScope
73
+ class Scope
74
+ delegate :to_fxml, :to => :proxy_found
75
+ end
76
+ end
77
+ end
78
+
79
+ ActionController::Base.send :include, RubossController
80
+ ActionController::Base.send :prepend_before_filter, :extract_metadata_from_params
81
+
82
+ # temporarily disable forgery protection site-wise
83
+ ActionController::Base.allow_forgery_protection = false
84
+ end
@@ -0,0 +1,221 @@
1
+ #ActiveRecord+ActiveSupport specific patches
2
+
3
+ # Flex friendly date, datetime formats
4
+ ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!(:flex_date => "%Y/%m/%d")
5
+ ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(:flex_datetime => "%Y/%m/%d %H:%M:%S")
6
+
7
+ Hash::XML_FORMATTING['date'] = Proc.new { |date| date.to_s(:flex_date) }
8
+ Hash::XML_FORMATTING['datetime'] = Proc.new { |datetime| datetime.to_s(:flex_datetime) }
9
+
10
+ module ActiveSupport
11
+ module CoreExtensions
12
+ module Hash
13
+ module Conversions
14
+ def to_fxml(options = {})
15
+ if self.empty? && !options[:root]
16
+ raise "empty hash being converted to FXML must specify :root option, e.g. <class_name>.to_s.underscore.pluralize"
17
+ end
18
+ options.merge!(:dasherize => false)
19
+ options[:indent] ||= 2
20
+ options.reverse_merge!({ :builder => Builder::XmlMarkup.new(:indent => options[:indent]),
21
+ :root => "hash" })
22
+ options[:builder].instruct! unless options.delete(:skip_instruct)
23
+ dasherize = !options.has_key?(:dasherize) || options[:dasherize]
24
+ root = dasherize ? options[:root].to_s.dasherize : options[:root].to_s
25
+
26
+ options[:builder].__send__(:method_missing, root) do
27
+ each do |key, value|
28
+ case value
29
+ when ::Hash
30
+ value.to_fxml(options.merge({ :root => key, :skip_instruct => true }))
31
+ when ::Array
32
+ value.to_fxml(options.merge({ :root => key, :children => key.to_s.singularize, :skip_instruct => true}))
33
+ when ::Method, ::Proc
34
+ # If the Method or Proc takes two arguments, then
35
+ # pass the suggested child element name. This is
36
+ # used if the Method or Proc will be operating over
37
+ # multiple records and needs to create an containing
38
+ # element that will contain the objects being
39
+ # serialized.
40
+ if 1 == value.arity
41
+ value.call(options.merge({ :root => key, :skip_instruct => true }))
42
+ else
43
+ value.call(options.merge({ :root => key, :skip_instruct => true }), key.to_s.singularize)
44
+ end
45
+ else
46
+ if value.respond_to?(:to_fxml)
47
+ value.to_fxml(options.merge({ :root => key, :skip_instruct => true }))
48
+ else
49
+ type_name = XML_TYPE_NAMES[value.class.name]
50
+
51
+ key = dasherize ? key.to_s.dasherize : key.to_s
52
+
53
+ attributes = options[:skip_types] || value.nil? || type_name.nil? ? { } : { :type => type_name }
54
+ if value.nil?
55
+ attributes[:nil] = true
56
+ end
57
+
58
+ options[:builder].tag!(key,
59
+ XML_FORMATTING[type_name] ? XML_FORMATTING[type_name].call(value) : value,
60
+ attributes
61
+ )
62
+ end
63
+ end
64
+ end
65
+
66
+ yield options[:builder] if block_given?
67
+ end
68
+ end
69
+ end
70
+ end
71
+ module Array
72
+ module Conversions
73
+ def to_fxml(options = {})
74
+ if self.empty? && !options[:root]
75
+ raise "empty array being converted to FXML must specify :root option, e.g. <class_name>.to_s.underscore.pluralize"
76
+ end
77
+ raise "Not all elements respond to to_fxml" unless all? { |e| e.respond_to? :to_fxml }
78
+
79
+ options[:root] ||= all? { |e| e.is_a?(first.class) && first.class.to_s != "Hash" } ? first.class.to_s.underscore.pluralize : "records"
80
+ options[:children] ||= options[:root].singularize
81
+ options[:indent] ||= 2
82
+ options[:builder] ||= Builder::XmlMarkup.new(:indent => options[:indent])
83
+ options.merge!(:dasherize => false)
84
+
85
+ root = options.delete(:root).to_s
86
+ children = options.delete(:children)
87
+
88
+ if !options.has_key?(:dasherize) || options[:dasherize]
89
+ root = root.dasherize
90
+ end
91
+
92
+ options[:builder].instruct! unless options.delete(:skip_instruct)
93
+
94
+ opts = options.merge({ :root => children })
95
+
96
+ xml = options[:builder]
97
+ if empty?
98
+ xml.tag!(root, options[:skip_types] ? {} : {:type => "array"})
99
+ else
100
+ xml.tag!(root, options[:skip_types] ? {} : {:type => "array"}) {
101
+ yield xml if block_given?
102
+ each { |e| e.to_fxml(opts.merge!({ :skip_instruct => true })) }
103
+ }
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+
111
+ module ActiveRecord
112
+ # Flex friendly XML serialization patches
113
+ class Base
114
+ class << self
115
+ # TODO: this doesn't work with hash based to_fxml(:include) options, only array based
116
+ def default_fxml_methods(*args)
117
+ methods = *args.dup
118
+ module_eval <<-END
119
+ def self.default_fxml_methods_array
120
+ return [#{methods.inspect}].flatten
121
+ end
122
+ END
123
+ end
124
+
125
+ def default_fxml_includes(*args)
126
+ includes = *args.dup
127
+ module_eval <<-END
128
+ def self.default_fxml_include_params
129
+ return [#{includes.inspect}].flatten
130
+ end
131
+ END
132
+ end
133
+
134
+ def default_fxml_hash(already_included = [])
135
+ # return {} unless self.class.respond_to?(:default_fxml_include_params) || self.class.respond_to?(:default_fxml_methods_array)
136
+ default_hash = {:include => {}}
137
+ default_hash[:methods] = self.default_fxml_methods_array if self.respond_to?(:default_fxml_methods_array)
138
+ if self.respond_to?(:default_fxml_include_params)
139
+ default_includes = self.default_fxml_include_params
140
+ default_hash[:include] = default_includes.inject({}) do |include_hash, included|
141
+ next if already_included.include?(included) # We only want to include things once, to avoid infinite loops
142
+ included_class = included.to_s.singularize.camelize.constantize
143
+ include_hash[included] = included_class.default_fxml_hash(already_included + default_includes)
144
+ include_hash
145
+ end
146
+ end
147
+ default_hash
148
+ end
149
+
150
+ # options[:include] can be a Hash, Array, Symbol or nil.
151
+ # We always want it as a Hash. This translates includes to a Hash like this:
152
+ # If it's a nil, return an empty Hash ({})
153
+ # If it's a Hash, then it is just returned
154
+ # If it's an array, then it returns a Hash with each array element as a key, and values of empty Hashes.
155
+ # If it's a symbol, then it returns a Hash with a single key/value pair, with the symbol as the key and an empty Hash as the value.
156
+ def includes_as_hash(includes = nil)
157
+ res = case
158
+ when includes.is_a?(Hash)
159
+ includes
160
+ when includes.nil?
161
+ {}
162
+ else #Deal with arrays and symbols
163
+ res = [includes].flatten.inject({}) {|include_hash, included| include_hash[included] = {} ; include_hash}
164
+ end
165
+ res
166
+ end
167
+
168
+ end
169
+ end
170
+
171
+ module Serialization
172
+ def to_fxml(options = {}, &block)
173
+ options.merge!(:dasherize => false)
174
+ default_except = [:crypted_password, :salt, :remember_token, :remember_token_expires_at]
175
+ options[:except] = (options[:except] ? options[:except] + default_except : default_except)
176
+ to_xml(options, &block)
177
+ end
178
+ end
179
+
180
+ # Change the xml serializer so that '?'s are stripped from attribute names.
181
+ # This makes it possible to serialize methods that end in a question mark, like 'valid?' or 'is_true?'
182
+ class XmlSerializer
183
+ def add_tag(attribute)
184
+ builder.tag!(
185
+ dasherize? ? attribute.display_name.dasherize : attribute.display_name,
186
+ attribute.value.to_s,
187
+ attribute.decorations(!options[:skip_types])
188
+ )
189
+ end
190
+ class Attribute
191
+ def display_name
192
+ @name.gsub('?','')
193
+ end
194
+ end
195
+ end
196
+
197
+ # Add more extensive reporting on errors including field name along with a message
198
+ # when errors are serialized to XML
199
+ class Errors
200
+ def to_fxml(options={})
201
+ options[:root] ||= "errors"
202
+ options[:indent] ||= 2
203
+ options[:builder] ||= Builder::XmlMarkup.new(:indent => options[:indent])
204
+ options[:builder].instruct! unless options.delete(:skip_instruct)
205
+ options[:builder].errors do |e|
206
+ # The @errors instance variable is a Hash inside the Errors class
207
+ @errors.each_key do |attr|
208
+ @errors[attr].each do |msg|
209
+ next if msg.nil?
210
+ if attr == "base"
211
+ options[:builder].error("message" => msg)
212
+ else
213
+ fullmsg = @base.class.human_attribute_name(attr) + ' ' + msg
214
+ options[:builder].error("field" => attr.camelcase(:lower), "message" => fullmsg)
215
+ end
216
+ end
217
+ end
218
+ end
219
+ end
220
+ end
221
+ end
@@ -0,0 +1,75 @@
1
+ require File.join(File.dirname(__FILE__), 'tasks')
2
+
3
+ # these tasks are active record specific
4
+
5
+ APP_ENV = defined?(ENV['RAILS_ENV']) ? ENV['RAILS_ENV'] : ENV['MERB_ENV']
6
+
7
+ namespace :db do
8
+ namespace :mysql do
9
+ namespace :stage do
10
+ desc "Stage production, test and development databases"
11
+ task :all do
12
+ db_names = %w(development test production)
13
+ admin_password = ENV["ADMINPASS"] || ""
14
+ db_user_name = ENV["USER"] || "root"
15
+ db_password = ENV["PASS"] || ""
16
+ stage_database(db_names, admin_password, db_user_name, db_password)
17
+ end
18
+ end
19
+
20
+ desc "Stage the database environment for #{APP_ENV}"
21
+ task :stage do
22
+ db_names = [APP_ENV]
23
+ admin_password = ENV["ADMINPASS"] || ""
24
+ db_user_name = ENV["USER"] || "root"
25
+ db_password = ENV["PASS"] || ""
26
+ stage_database(db_names, admin_password, db_user_name, db_password)
27
+ end
28
+ end
29
+
30
+ def stage_database(db_names, admin_password, db_user_name, db_password)
31
+ sql_command = ""
32
+
33
+ db_names.each do |name|
34
+ db_name = ActiveRecord::Base.configurations[name]['database']
35
+ sql_command += "drop database if exists #{db_name}; " <<
36
+ "create database #{db_name}; grant all privileges on #{db_name}.* " <<
37
+ "to #{db_user_name}@localhost identified by \'#{db_password}\';"
38
+ ActiveRecord::Base.configurations[name]['username'] = db_user_name
39
+ ActiveRecord::Base.configurations[name]['password'] = db_password
40
+ end
41
+
42
+ if (!File.exist?("#{APP_ROOT}/tmp/stage.sql"))
43
+ File.open("#{APP_ROOT}/tmp/stage.sql", "w") do |file|
44
+ file.print sql_command
45
+ end
46
+ end
47
+
48
+ # back up the original database.yml file just in case
49
+ File.copy("#{APP_ROOT}/config/database.yml",
50
+ "#{APP_ROOT}/config/database.yml.sample") if !File.exist?("#{APP_ROOT}/config/database.yml.sample")
51
+
52
+ dbconfig = File.read("#{APP_ROOT}/config/database.yml")
53
+ dbconfig.gsub!(/username:.*/, "username: #{db_user_name}")
54
+ dbconfig.gsub!(/password:.*/, "password: #{db_password}")
55
+
56
+ File.open("#{APP_ROOT}/config/database.yml", "w") do |file|
57
+ file.print dbconfig
58
+ end
59
+
60
+ if system %(mysql -h localhost -u root --password=#{admin_password} < tmp/stage.sql)
61
+ puts "Updated config/database.yml and staged the database based on your settings"
62
+ File.delete("tmp/stage.sql") if File.file?("tmp/stage.sql")
63
+ else
64
+ puts "Staging was not performed. Check console for errors. It is possible that 'mysql' executable was not found."
65
+ end
66
+ end
67
+
68
+ desc "Drop the database environment for #{APP_ENV} only if it exists"
69
+ task :drop_if_exists do
70
+ Rake::Task["db:drop"].invoke rescue nil
71
+ end
72
+
73
+ desc "Refresh the database environment for #{APP_ENV}"
74
+ task :refresh => ['db:drop_if_exists', 'db:create', 'db:migrate', 'db:fixtures:load']
75
+ end
@@ -0,0 +1,59 @@
1
+ class String
2
+ def capitalize_without_downcasing
3
+ self[0,1].capitalize + self[1..-1]
4
+ end
5
+
6
+ def downcase_first_letter
7
+ self[0,1].downcase + self[1..-1]
8
+ end
9
+
10
+ def camelcase(first_letter = :upper)
11
+ case first_letter
12
+ when :upper then self.camelize(true)
13
+ when :lower then self.camelize(false)
14
+ end
15
+ end
16
+
17
+ def camelize(first_letter_in_uppercase = true)
18
+ if first_letter_in_uppercase
19
+ self.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
20
+ else
21
+ self[0,1].downcase + self.camelize[1..-1]
22
+ end
23
+ end
24
+
25
+ def underscore
26
+ self.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
27
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').tr("-", "_").downcase
28
+ end
29
+ end
30
+
31
+ module Ruboss
32
+ module Configuration
33
+ APP_ROOT = defined?(RAILS_ROOT) ? RAILS_ROOT : Merb.root
34
+
35
+ def extract_names
36
+ project_name = APP_ROOT.split("/").last.camelcase.gsub(/\s/, '')
37
+ project_name_downcase = project_name.downcase
38
+
39
+ begin
40
+ config = YAML.load(File.open("#{APP_ROOT}/config/ruboss.yml"))
41
+ base_package = config['base-package'] || project_name_downcase
42
+ base_folder = base_package.gsub('.', '/').gsub(/\s/, '')
43
+ controller_name = config['controller-name'] || "ApplicationController"
44
+ rescue
45
+ base_folder = base_package = project_name_downcase
46
+ controller_name = "ApplicationController"
47
+ end
48
+ [project_name, project_name_downcase, controller_name, base_package, base_folder]
49
+ end
50
+
51
+ def list_as_files(dir_name)
52
+ Dir.entries(dir_name).grep(/\.as$/).map { |name| name.sub(/\.as$/, "") }.join(", ")
53
+ end
54
+
55
+ def list_mxml_files(dir_name)
56
+ Dir.entries(dir_name).grep(/\.mxml$/).map { |name| name.sub(/\.mxml$/, "") }
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,25 @@
1
+ require 'builder'
2
+ require Ruboss::LIB_DIR + 'configuration'
3
+
4
+ module DataMapper
5
+ module Validate
6
+ class ValidationErrors
7
+ def to_xml
8
+ xml = Builder::XmlMarkup.new(:indent => 2)
9
+ xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8"
10
+ xml.errors do |e|
11
+ @errors.each_key do |attribute|
12
+ @errors[attribute].each do |msg|
13
+ next if msg.nil?
14
+ if attribute == "base"
15
+ e.error("message" => msg)
16
+ else
17
+ e.error("field" => attribute.to_s.camelcase(:lower), "message" => msg)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end