calatrava 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +9 -0
- data/.rvmrc +2 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +202 -0
- data/Plans.md +20 -0
- data/README.md +73 -0
- data/Rakefile +26 -0
- data/bin/calatrava +6 -0
- data/calatrava.gemspec +35 -0
- data/features/cli.feature +14 -0
- data/features/project.feature +48 -0
- data/features/step_definitions/template_steps.rb +8 -0
- data/features/support/env.rb +5 -0
- data/lib/calatrava/app.rb +30 -0
- data/lib/calatrava/manifest.rb +44 -0
- data/lib/calatrava/project.rb +218 -0
- data/lib/calatrava/resources_build_phase.rb +19 -0
- data/lib/calatrava/tasks/apache.rb +44 -0
- data/lib/calatrava/tasks/artifact.rb +24 -0
- data/lib/calatrava/tasks/assets.rb +6 -0
- data/lib/calatrava/tasks/automation.rb +38 -0
- data/lib/calatrava/tasks/bootstrap.rb +10 -0
- data/lib/calatrava/tasks/build.rb +1 -0
- data/lib/calatrava/tasks/configuration.rb +41 -0
- data/lib/calatrava/tasks/droid.rb +83 -0
- data/lib/calatrava/tasks/haml.rb +71 -0
- data/lib/calatrava/tasks/ios.rb +73 -0
- data/lib/calatrava/tasks/kernel.rb +52 -0
- data/lib/calatrava/tasks/precommit.rb +22 -0
- data/lib/calatrava/tasks/release.rb +17 -0
- data/lib/calatrava/tasks/shell.rb +17 -0
- data/lib/calatrava/tasks/web.rb +82 -0
- data/lib/calatrava/tasks.rb +93 -0
- data/lib/calatrava/template.rb +44 -0
- data/lib/calatrava/templates/.rvmrc.calatrava +2 -0
- data/lib/calatrava/templates/Gemfile.calatrava +4 -0
- data/lib/calatrava/templates/Rakefile +1 -0
- data/lib/calatrava/templates/assets/lib/ICanHaz.js +542 -0
- data/lib/calatrava/templates/assets/lib/underscore.js +1059 -0
- data/lib/calatrava/templates/assets/lib/zepto.js +1355 -0
- data/lib/calatrava/templates/build_env.sh +2 -0
- data/lib/calatrava/templates/config/environments.yml +17 -0
- data/lib/calatrava/templates/config/templates/env.coffee.erb +7 -0
- data/lib/calatrava/templates/config/templates/httpd.conf.erb +33 -0
- data/lib/calatrava/templates/droid/app/bridge.coffee +130 -0
- data/lib/calatrava/templates/droid/calatrava/ant/calatrava.xml +48 -0
- data/lib/calatrava/templates/droid/calatrava/calatrava-build.xml +91 -0
- data/lib/calatrava/templates/droid/calatrava/ivy.xml +8 -0
- data/lib/calatrava/templates/droid/calatrava/ivysettings.xml +12 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/CALATRAVA_TMPL/AndroidManifest.xml.calatrava +20 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/CALATRAVA_TMPL/ConversionForm.java.calatrava +27 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/CALATRAVA_TMPL/Title.java.calatrava +23 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/CalatravaPage.java +13 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/AjaxRequestManager.java +166 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/AssetRepository.java +17 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/KernelBridge.java +25 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/Launcher.java +85 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/PageRegistry.java +225 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/RegisteredActivity.java +86 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/RequestLoader.java +31 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/RhinoService.java +212 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/shell/WebViewActivity.java +247 -0
- data/lib/calatrava/templates/droid/manifest.yml +1 -0
- data/lib/calatrava/templates/ios/Podfile.calatrava +5 -0
- data/lib/calatrava/templates/ios/manifest.yml +1 -0
- data/lib/calatrava/templates/ios/res/js/bridge.js +249 -0
- data/lib/calatrava/templates/ios/res/xibs/ProgressViewController.xib +334 -0
- data/lib/calatrava/templates/ios/res/xibs/WebViewController.xib +173 -0
- data/lib/calatrava/templates/ios/src/AppDelegate.h +8 -0
- data/lib/calatrava/templates/ios/src/AppDelegate.m +56 -0
- data/lib/calatrava/templates/ios/src/CALATRAVA_TMPL-Info.plist +45 -0
- data/lib/calatrava/templates/ios/src/CALATRAVA_TMPL-Prefix.pch +14 -0
- data/lib/calatrava/templates/ios/src/ConversionFormViewController.h +16 -0
- data/lib/calatrava/templates/ios/src/ConversionFormViewController.m +179 -0
- data/lib/calatrava/templates/ios/src/ConversionFormViewController.xib +357 -0
- data/lib/calatrava/templates/ios/src/en.lproj/InfoPlist.strings +2 -0
- data/lib/calatrava/templates/ios/src/main.m +10 -0
- data/lib/calatrava/templates/ios/test/AJAXConnectionTest.m +21 -0
- data/lib/calatrava/templates/ios/test/AppTests-Prefix.pch +8 -0
- data/lib/calatrava/templates/ios/test/CalatravaiOSTests-Info.plist +22 -0
- data/lib/calatrava/templates/ios/test/TWBridgePageRegistryTest.m +15 -0
- data/lib/calatrava/templates/ios/test/en.lproj/InfoPlist.strings +2 -0
- data/lib/calatrava/templates/kernel/.gitignore +1 -0
- data/lib/calatrava/templates/kernel/app/calatrava.coffee +8 -0
- data/lib/calatrava/templates/kernel/app/converter/controller.converter.coffee +50 -0
- data/lib/calatrava/templates/kernel/app/converter/init.converter.coffee +11 -0
- data/lib/calatrava/templates/kernel/app/pageHelper.coffee +17 -0
- data/lib/calatrava/templates/kernel/features/support/bridge.coffee +124 -0
- data/lib/calatrava/templates/kernel/features/support/spec_helper.js +49 -0
- data/lib/calatrava/templates/kernel/spec/converter/controller.converter.spec.coffee +37 -0
- data/lib/calatrava/templates/kernel/spec/environment.spec_helper.coffee +25 -0
- data/lib/calatrava/templates/kernel/spec/spec_helper.js +49 -0
- data/lib/calatrava/templates/kernel/spec/stubView.coffee +18 -0
- data/lib/calatrava/templates/kernel/watchr.rb +17 -0
- data/lib/calatrava/templates/package.json +20 -0
- data/lib/calatrava/templates/shell/layouts/single_page.haml +23 -0
- data/lib/calatrava/templates/shell/pages/converter/conversionForm.haml +12 -0
- data/lib/calatrava/templates/shell/pages/converter/page.conversionForm.coffee +42 -0
- data/lib/calatrava/templates/shell/shell.scss +1 -0
- data/lib/calatrava/templates/shell/support/shell.coffee +21 -0
- data/lib/calatrava/templates/web/apache/conf/mime.types +1357 -0
- data/lib/calatrava/templates/web/app/source/bridge.coffee +158 -0
- data/lib/calatrava/templates/web/app/source/init.coffee +14 -0
- data/lib/calatrava/templates/web/app/views/index.haml +18 -0
- data/lib/calatrava/templates/web/deploy/instance.sh +10 -0
- data/lib/calatrava/templates/web/manifest.yml +1 -0
- data/lib/calatrava/version.rb +3 -0
- data/lib/calatrava.rb +5 -0
- metadata +302 -0
@@ -0,0 +1,218 @@
|
|
1
|
+
require 'mustache'
|
2
|
+
require 'yaml'
|
3
|
+
require 'xcoder'
|
4
|
+
require 'xcodeproj'
|
5
|
+
|
6
|
+
require 'calatrava/resources_build_phase'
|
7
|
+
|
8
|
+
module Calatrava
|
9
|
+
|
10
|
+
class Project
|
11
|
+
|
12
|
+
def sh(cmd)
|
13
|
+
$stdout.puts cmd
|
14
|
+
system(cmd)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.here(directory)
|
18
|
+
@@current = Project.new(directory)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.current
|
22
|
+
@@current
|
23
|
+
end
|
24
|
+
|
25
|
+
attr_reader :name
|
26
|
+
|
27
|
+
def initialize(name, overrides = {})
|
28
|
+
@name = name
|
29
|
+
@slug = name.gsub(" ", "_").downcase
|
30
|
+
@title = @name[0..0].upcase + @name[1..-1]
|
31
|
+
@options = {}
|
32
|
+
if File.exists?(@name) && File.directory?(@name)
|
33
|
+
@path = File.expand_path(@name)
|
34
|
+
@options = YAML.load(IO.read(File.join(@name, 'calatrava.yml')))
|
35
|
+
@name = @options[:project_name]
|
36
|
+
end
|
37
|
+
@options.merge! overrides
|
38
|
+
end
|
39
|
+
|
40
|
+
def dev?
|
41
|
+
@options[:is_dev]
|
42
|
+
end
|
43
|
+
|
44
|
+
def create(template)
|
45
|
+
create_project(template)
|
46
|
+
create_directory_tree(template)
|
47
|
+
create_files(template)
|
48
|
+
|
49
|
+
create_android_tree(template)
|
50
|
+
create_ios_tree(template)
|
51
|
+
end
|
52
|
+
|
53
|
+
def create_project(template)
|
54
|
+
FileUtils.mkdir_p @name
|
55
|
+
File.open(File.join(@name, 'calatrava.yml'), "w+") do |f|
|
56
|
+
f.print({:project_name => @name}.to_yaml)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def target_item(item)
|
61
|
+
item.gsub("CALATRAVA_TMPL", @name)
|
62
|
+
end
|
63
|
+
|
64
|
+
def create_directory_tree(template)
|
65
|
+
template.walk_directories do |dir|
|
66
|
+
FileUtils.mkdir_p(File.join(@name, target_item(dir)))
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def create_files(template)
|
71
|
+
template.walk_files do |file_info|
|
72
|
+
target_name = target_item(file_info[:name])
|
73
|
+
if File.extname(file_info[:name]) == ".calatrava"
|
74
|
+
File.open(File.join(@name, target_name.gsub(".calatrava", "")), "w+") do |f|
|
75
|
+
expanded = Mustache.render(IO.read(file_info[:path]),
|
76
|
+
:project_name => @name,
|
77
|
+
:project_slug => @slug,
|
78
|
+
:project_title => @title,
|
79
|
+
:dev? => dev?)
|
80
|
+
f.print(expanded)
|
81
|
+
end
|
82
|
+
else
|
83
|
+
FileUtils.cp(file_info[:path], File.join(@name, target_name))
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def create_android_tree(template)
|
89
|
+
Dir.chdir(File.join(@name, "droid")) do
|
90
|
+
sh "android create project --name '#{@slug}' --path '#{@name}' --package com.#{@slug} --target android-10 --activity #{@title}"
|
91
|
+
|
92
|
+
Dir.walk("calatrava") do |item|
|
93
|
+
target_item = item.sub('calatrava', @name)
|
94
|
+
FileUtils.mkdir_p(target_item) if File.directory? item
|
95
|
+
FileUtils.cp(item, target_item) if File.file? item
|
96
|
+
end
|
97
|
+
Dir.chdir "#{@name}" do
|
98
|
+
Dir.chdir "src/com/#{@name}" do
|
99
|
+
FileUtils.mv "Title.java", "#{@title}.java"
|
100
|
+
FileUtils.mv "AndroidManifest.xml", "../../../AndroidManifest.xml"
|
101
|
+
end
|
102
|
+
FileUtils.mv "calatrava-build.xml", "build.xml"
|
103
|
+
end
|
104
|
+
|
105
|
+
FileUtils.rm_rf "calatrava"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def create_ios_project
|
110
|
+
Xcodeproj::Project.new.tap do |proj|
|
111
|
+
%w{Foundation UIKit CoreGraphics}.each { |fw| proj.add_system_framework fw }
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def create_ios_project_groups(base_dir, proj, target)
|
116
|
+
source_files_for_target = []
|
117
|
+
|
118
|
+
walker = lambda do |item, group|
|
119
|
+
if item.directory?
|
120
|
+
group_name = item.basename
|
121
|
+
child_group = group.create_group group_name
|
122
|
+
item.each_child { |item| walker.call(item, child_group) }
|
123
|
+
elsif item.file?
|
124
|
+
file_path = item.relative_path_from(base_dir)
|
125
|
+
group.create_file file_path.to_s
|
126
|
+
source_files_for_target << Xcodeproj::Project::Object::PBXNativeTarget::SourceFileDescription.new(file_path, "", nil)
|
127
|
+
else
|
128
|
+
raise 'what is it then?!'
|
129
|
+
end
|
130
|
+
end
|
131
|
+
(base_dir + "src").each_child { |item| walker.call(item, proj.main_group) }
|
132
|
+
target.add_source_files source_files_for_target
|
133
|
+
end
|
134
|
+
|
135
|
+
def create_ios_folder_references(base_dir, proj, target)
|
136
|
+
FileUtils.mkdir_p "ios/public"
|
137
|
+
public_folder = proj.main_group.create_file "public"
|
138
|
+
public_folder.last_known_file_type = 'folder'
|
139
|
+
build_file = public_folder.build_files.new
|
140
|
+
|
141
|
+
shared_phase = Xcodeproj::Project::Object::PBXResourcesBuildPhase.new(proj,nil,{})
|
142
|
+
|
143
|
+
shared_phase << build_file
|
144
|
+
target.build_phases << shared_phase
|
145
|
+
|
146
|
+
end
|
147
|
+
|
148
|
+
def create_ios_project_target(proj)
|
149
|
+
target = Xcodeproj::Project::Object::PBXNativeTarget.new(proj,
|
150
|
+
nil,
|
151
|
+
'productType' => 'com.apple.product-type.application',
|
152
|
+
'productName' => @name)
|
153
|
+
|
154
|
+
target.build_configurations.each do |config|
|
155
|
+
config.build_settings.merge!(Xcodeproj::Project::Object::XCBuildConfiguration::COMMON_BUILD_SETTINGS[:ios])
|
156
|
+
|
157
|
+
# E.g. [:ios, :release]
|
158
|
+
extra_settings_key = [:ios, config.name.downcase.to_sym]
|
159
|
+
if extra_settings = Xcodeproj::Project::Object::XCBuildConfiguration::COMMON_BUILD_SETTINGS[extra_settings_key]
|
160
|
+
config.build_settings.merge!(extra_settings)
|
161
|
+
end
|
162
|
+
|
163
|
+
config.build_settings.merge!({
|
164
|
+
"GCC_PREFIX_HEADER" => "src/#{@name}-Prefix.pch",
|
165
|
+
"OTHER_LDFLAGS" => ['-ObjC', '-all_load'],
|
166
|
+
"INFOPLIST_FILE" => "src/#{@name}-Info.plist",
|
167
|
+
"SKIP_INSTALL" => "NO",
|
168
|
+
"IPHONEOS_DEPLOYMENT_TARGET" => "5.0",
|
169
|
+
})
|
170
|
+
config.build_settings.delete "DSTROOT"
|
171
|
+
config.build_settings.delete "INSTALL_PATH"
|
172
|
+
|
173
|
+
end
|
174
|
+
|
175
|
+
calatrava_phase = Xcodeproj::Project::Object::PBXShellScriptBuildPhase.new(proj,nil,{})
|
176
|
+
target.build_phase_references.insert(0,calatrava_phase.uuid) # hacky manual way to get build phase inserted in the right place
|
177
|
+
|
178
|
+
calatrava_phase.name = "Build Calatrava Kernel & Shell"
|
179
|
+
calatrava_phase.shell_script = <<-EOS.split("\n").collect(&:strip).join("\n")
|
180
|
+
source ${SRCROOT}/../build_env.sh
|
181
|
+
bundle exec rake ios:xcode:prebuild
|
182
|
+
EOS
|
183
|
+
|
184
|
+
proj.targets << target
|
185
|
+
target
|
186
|
+
end
|
187
|
+
|
188
|
+
def create_ios_tree(template)
|
189
|
+
proj = create_ios_project
|
190
|
+
base_dir = Pathname.new(@name) + "ios"
|
191
|
+
|
192
|
+
target = create_ios_project_target(proj)
|
193
|
+
create_ios_project_groups(base_dir, proj, target)
|
194
|
+
create_ios_folder_references(base_dir, proj, target)
|
195
|
+
|
196
|
+
proj.save_as (base_dir + "#{@name}.xcodeproj").to_s
|
197
|
+
end
|
198
|
+
|
199
|
+
def modules
|
200
|
+
Dir[File.join(@path, 'kernel/app/*')].select { |n| File.directory? n }.collect { |n| File.basename n }
|
201
|
+
end
|
202
|
+
|
203
|
+
def src_paths
|
204
|
+
modules.collect { |m| "app/#{m}" }.join(':')
|
205
|
+
end
|
206
|
+
|
207
|
+
def build_ios(options = {})
|
208
|
+
proj = Xcode.project("ios/#{@name}.xcworkspace")
|
209
|
+
builder = proj.target(@name).config('Debug').builder
|
210
|
+
builder.clean
|
211
|
+
builder.sdk = options[:sdk] || :iphonesimulator
|
212
|
+
builder.build
|
213
|
+
builder.package
|
214
|
+
end
|
215
|
+
|
216
|
+
end
|
217
|
+
|
218
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'xcodeproj'
|
2
|
+
|
3
|
+
module Xcodeproj
|
4
|
+
class Project
|
5
|
+
module Object
|
6
|
+
|
7
|
+
class PBXResourcesBuildPhase < PBXBuildPhase
|
8
|
+
has_many :files
|
9
|
+
|
10
|
+
def initialize(*)
|
11
|
+
super
|
12
|
+
self.file_references ||= []
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
directory APACHE_LOGS_DIR
|
4
|
+
|
5
|
+
if `uname -a`.chomp["amzn1"]
|
6
|
+
HTTPD = "httpd"
|
7
|
+
MODULES_PATH = "/usr/lib64/httpd/modules"
|
8
|
+
LOAD_LOG_MODULE = true
|
9
|
+
elsif `uname`.chomp == "Linux"
|
10
|
+
HTTPD = "apache2"
|
11
|
+
MODULES_PATH = "/usr/lib/apache2/modules"
|
12
|
+
LOAD_LOG_MODULE = false
|
13
|
+
else
|
14
|
+
HTTPD = "httpd"
|
15
|
+
MODULES_PATH = "/usr/libexec/apache2"
|
16
|
+
LOAD_LOG_MODULE = true
|
17
|
+
end
|
18
|
+
|
19
|
+
def httpd(command)
|
20
|
+
exec %Q|#{HTTPD} -d #{APACHE_DIR} -f conf/httpd.conf -e DEBUG -k #{command} -DNO_DETACH -DFOREGROUND|
|
21
|
+
end
|
22
|
+
|
23
|
+
def configure_apache
|
24
|
+
cp config_path("httpd.conf"), File.join(APACHE_DIR, 'conf')
|
25
|
+
end
|
26
|
+
|
27
|
+
def launch_apache
|
28
|
+
puts
|
29
|
+
puts "\t\t" + "*"*40
|
30
|
+
puts "\t\t" + "*** STARTING APACHE ON PORT 8888 ***"
|
31
|
+
puts "\t\t" + "*"*40
|
32
|
+
puts
|
33
|
+
|
34
|
+
httpd :start
|
35
|
+
end
|
36
|
+
|
37
|
+
def stop_apache
|
38
|
+
httpd :stop
|
39
|
+
end
|
40
|
+
|
41
|
+
def reload_apache
|
42
|
+
httpd :restart
|
43
|
+
end
|
44
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
def artifact(path, env = nil)
|
2
|
+
artifact_dir = env.nil? ? "artifacts/" : "artifacts/#{env}/"
|
3
|
+
mkdir_p artifact_dir
|
4
|
+
cp path, artifact_dir, :preserve => true
|
5
|
+
end
|
6
|
+
|
7
|
+
def artifact_dir(source_path, name)
|
8
|
+
artifact_dir_path = "artifacts/#{name}/"
|
9
|
+
mkdir_p artifact_dir_path
|
10
|
+
sh "cp -R #{source_path}/* #{artifact_dir_path}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def artifact_path(sub_path)
|
14
|
+
File.join("artifacts", sub_path)
|
15
|
+
end
|
16
|
+
|
17
|
+
namespace :artifact do
|
18
|
+
|
19
|
+
desc "Removes all pre-existing artifacts"
|
20
|
+
task :clean do
|
21
|
+
rm_rf "artifacts/*.*"
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
def coffee(in_dir_or_file, out_dir)
|
2
|
+
if !Dir["#{in_dir_or_file}/**/*.coffee"].empty? || File.exists?(in_dir_or_file)
|
3
|
+
$stdout.puts "coffee #{in_dir_or_file} -> #{out_dir}"
|
4
|
+
sh "node_modules/coffee-script/bin/coffee --compile --output #{out_dir} #{in_dir_or_file}"
|
5
|
+
end
|
6
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
namespace :automation do
|
2
|
+
namespace :web do
|
3
|
+
desc "Runs cucumber tests against the web app"
|
4
|
+
task :features, [:file] => [:apache_for_features, :create_sim_link, :copy_steps_file, :clean_up_results_dir] do |t, args|
|
5
|
+
ENV['PATH'] = "#{ROOT_DIR}/web/features:#{ENV['PATH']}"
|
6
|
+
features_to_be_run = args[:file] ? "#{FEATURES_DIR}/#{args[:file]}" : FEATURES_DIR
|
7
|
+
sh "cucumber --strict --tags @all,@web --tags ~@wip #{features_to_be_run} --format html --out #{FEATURE_RESULTS_DIR}/report.html --format pretty"
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "launch a daemon apache instance on port 8888 which will serve the features and mock the backend services"
|
11
|
+
task :apache_for_features => ['web:build', APACHE_LOGS_DIR] do
|
12
|
+
create_plist
|
13
|
+
configure_apache
|
14
|
+
`launchctl unload #{APACHE_DIR}/com.jenkins.calatrava.apache.plist`
|
15
|
+
`launchctl load -w #{APACHE_DIR}/com.jenkins.calatrava.apache.plist`
|
16
|
+
`sleep 5`
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "create sim link for the ios step_definitions and support folder"
|
20
|
+
task :create_sim_link do
|
21
|
+
sh "rm -rf #{FEATURES_DIR}/step_definitions"
|
22
|
+
sh "rm -rf #{FEATURES_DIR}/support"
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "copy the web_steps file to web_steps.rb"
|
26
|
+
task :copy_steps_file do
|
27
|
+
sh "rm -f #{FEATURES_DIR}/*.rb"
|
28
|
+
sh "cp #{FEATURES_DIR}/web_steps #{FEATURES_DIR}/web_steps.rb"
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "delete and create the results dir"
|
32
|
+
task :clean_up_results_dir do
|
33
|
+
sh "rm -rf #{FEATURE_RESULTS_DIR}"
|
34
|
+
sh "mkdir #{FEATURE_RESULTS_DIR}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
task :build => ['web:build', 'ios:build', 'droid:build']
|
@@ -0,0 +1,41 @@
|
|
1
|
+
def config_for(environment)
|
2
|
+
YAML::load(File.open(CONFIG_YAML))[environment]
|
3
|
+
end
|
4
|
+
|
5
|
+
def evaluate_template(template_path, configuration)
|
6
|
+
file_path = File.join(CONFIG_RESULT_DIR, File.basename(template_path).gsub(".erb", ''))
|
7
|
+
puts "Config: #{File.basename(template_path)} -> #{File.basename(file_path)}"
|
8
|
+
result = ERB.new(IO.read(template_path)).result(binding)
|
9
|
+
IO.write(file_path, result)
|
10
|
+
end
|
11
|
+
|
12
|
+
def config_path(file)
|
13
|
+
env = ENV['CALATRAVA_ENV'] || "development"
|
14
|
+
puts "CALATRAVA_ENV = '#{env}'"
|
15
|
+
full_path = artifact_path(File.join(env, file))
|
16
|
+
fail "Could not find '#{file}' in environment '#{env}'" unless File.exists? full_path
|
17
|
+
full_path
|
18
|
+
end
|
19
|
+
|
20
|
+
def app_name
|
21
|
+
end
|
22
|
+
|
23
|
+
TEMPLATES = FileList["#{CONFIG_TEMPLATE_DIR}/*.erb"]
|
24
|
+
|
25
|
+
namespace :configure do
|
26
|
+
|
27
|
+
%w{local development test automation production}.each do |environment|
|
28
|
+
desc "Create config files for #{environment} environment"
|
29
|
+
task environment.to_sym => [:clean, CONFIG_RESULT_DIR] do
|
30
|
+
configuration = config_for(environment)
|
31
|
+
TEMPLATES.each do |template|
|
32
|
+
evaluate_template(template, configuration)
|
33
|
+
end
|
34
|
+
artifact_dir(CONFIG_RESULT_DIR, environment)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
task :clean do
|
39
|
+
rm_rf CONFIG_RESULT_DIR
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
namespace :droid do
|
2
|
+
|
3
|
+
version = "1.0"
|
4
|
+
droid_manifest = Calatrava::Manifest.new('droid')
|
5
|
+
|
6
|
+
html_views = droid_manifest.features.collect do |feature|
|
7
|
+
html_dir = "droid/#{Calatrava::Project.current.name}/assets/hybrid/views"
|
8
|
+
Dir["shell/pages/#{feature}/*.haml"].collect do |page|
|
9
|
+
pageName = File.basename(page, '.haml')
|
10
|
+
file "#{html_dir}/#{pageName}.html" => page do
|
11
|
+
HamlSupport::compile_hybrid_page feature, page, html_dir
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end.flatten
|
15
|
+
|
16
|
+
desc "Creates html from haml using Android layout"
|
17
|
+
task :haml => [CONFIG[:droid][:html]] + html_views
|
18
|
+
|
19
|
+
desc "Compile droid-specific coffee to javascript"
|
20
|
+
task :coffee => CONFIG[:droid][:assets] do
|
21
|
+
coffee File.join(CONFIG[:droid][:root], "app"), CONFIG[:droid][:js]
|
22
|
+
end
|
23
|
+
|
24
|
+
desc "Copies required assets for droid"
|
25
|
+
task :shared => ["shell:scss", "shell:coffee", "kernel:coffee",
|
26
|
+
CONFIG[:droid][:css], CONFIG[:droid][:imgs], CONFIG[:droid][:js],
|
27
|
+
:config, CONFIG[:droid][:fonts]] do
|
28
|
+
cp_ne "#{BUILD_CORE_CSS_DIR}/*.css", CONFIG[:droid][:css]
|
29
|
+
cp_ne "#{ASSETS_IMG_DIR}/*", CONFIG[:droid][:imgs]
|
30
|
+
cp_ne "assets/lib/*.js", CONFIG[:droid][:js]
|
31
|
+
|
32
|
+
droid_manifest.js_files.each do |js_file|
|
33
|
+
sh "cp #{js_file} #{CONFIG[:droid][:js]}"
|
34
|
+
end
|
35
|
+
droid_manifest.load_file("droid/#{Calatrava::Project.current.name}/assets/hybrid", 'hybrid/scripts', :type => :text, :include_pages => false)
|
36
|
+
|
37
|
+
cp_ne "build/shell/js/**/*.js", CONFIG[:droid][:js]
|
38
|
+
cp_ne "build/kernel/js/*.js", CONFIG[:droid][:js]
|
39
|
+
cp_ne "#{ASSETS_FONTS_DIR}/*", CONFIG[:droid][:fonts]
|
40
|
+
end
|
41
|
+
|
42
|
+
task :app => [:shared, :haml, :coffee]
|
43
|
+
|
44
|
+
desc "Prepares config for the app"
|
45
|
+
task :config do
|
46
|
+
env_coffee = config_path("env.coffee")
|
47
|
+
coffee env_coffee, CONFIG[:droid][:js]
|
48
|
+
end
|
49
|
+
|
50
|
+
desc "Builds the complete Android app"
|
51
|
+
task :build => [:app, :config, :write_build_number] do
|
52
|
+
cd "droid/#{Calatrava::Project.current.name}" do
|
53
|
+
sh "ant clean debug"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
desc "Update the app to show the correct build number"
|
58
|
+
task :write_build_number do
|
59
|
+
cd "droid/#{Calatrava::Project.current.name}" do
|
60
|
+
sh %{cat AndroidManifest.xml | sed -E "s/android:versionName=\".*\"/android:versionName=\\"#{version}\\">/g" > AndroidManifest.xml.new}
|
61
|
+
mv "AndroidManifest.xml.new", "AndroidManifest.xml"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
desc "Publishes the built Android app as an artifact"
|
66
|
+
task :publish => :build do
|
67
|
+
artifact("droid/#{Calatrava::Project.current.name}/bin/#{Calatrava::Project.current.name}-debug.apk", ENV['CALATRAVA_ENV'])
|
68
|
+
end
|
69
|
+
|
70
|
+
desc "Deploy app to device/emulator"
|
71
|
+
task :deploy => :publish do
|
72
|
+
sh "adb uninstall com.#{Calatrava::Project.current.name} ; adb install -r artifacts/#{ENV['CALATRAVA_ENV']}/#{Calatrava::Project.current.name}-debug.apk"
|
73
|
+
end
|
74
|
+
|
75
|
+
desc "Clean droid public directory"
|
76
|
+
task :clean do
|
77
|
+
rm_rf CONFIG[:droid][:public]
|
78
|
+
cd "droid/#{Calatrava::Project.current.name}" do
|
79
|
+
sh "ant clean"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'haml'
|
2
|
+
|
3
|
+
module HamlSupport
|
4
|
+
|
5
|
+
class Helper
|
6
|
+
|
7
|
+
attr_reader :page_name
|
8
|
+
|
9
|
+
def initialize(feature = nil, page = nil)
|
10
|
+
@feature = feature
|
11
|
+
@page_name = page
|
12
|
+
end
|
13
|
+
|
14
|
+
def content_for(named_chunk)
|
15
|
+
chunk = @chunks[named_chunk]
|
16
|
+
(chunk && chunk.call) || ""
|
17
|
+
end
|
18
|
+
|
19
|
+
def layout_with(layout_name, content_blocks = {})
|
20
|
+
@chunks = content_blocks
|
21
|
+
layout_template = IO.read(File.join(SHELL_LAYOUTS_DIR, "#{layout_name}.haml"))
|
22
|
+
Haml::Engine.new(layout_template).render(self, {})
|
23
|
+
end
|
24
|
+
|
25
|
+
def render_partial(partial_name, locals = {})
|
26
|
+
partial_template = IO.read("#{partial_name}.haml")
|
27
|
+
Haml::Engine.new(partial_template).render(self, locals)
|
28
|
+
end
|
29
|
+
|
30
|
+
def render_page(page_name = nil, locals = {})
|
31
|
+
page_name = File.join(@feature, @page_name) unless page_name
|
32
|
+
page_template = IO.read(File.join('shell/pages', "#{page_name}.haml"))
|
33
|
+
Haml::Engine.new(page_template).render(self, locals)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
class << self
|
39
|
+
|
40
|
+
def compile_hybrid_page(feature, page_path, output_path, options = {})
|
41
|
+
puts "haml page: #{page_path} -> #{output_path}"
|
42
|
+
|
43
|
+
options[:helper] = Helper.new(feature, File.basename(page_path, ".haml"))
|
44
|
+
options[:template] = "shell/layouts/single_page.haml"
|
45
|
+
options[:out] = File.join(output_path, File.basename(page_path, '.*') + '.html')
|
46
|
+
|
47
|
+
render_haml(options)
|
48
|
+
end
|
49
|
+
|
50
|
+
def compile(haml_path, html_dir, options = {})
|
51
|
+
puts "haml: #{haml_path} -> #{html_dir}"
|
52
|
+
|
53
|
+
options[:helper] ||= Helper.new
|
54
|
+
options[:template] = haml_path
|
55
|
+
options[:out] = File.join(html_dir, File.basename(haml_path, '.*') + '.html')
|
56
|
+
|
57
|
+
render_haml(options)
|
58
|
+
end
|
59
|
+
|
60
|
+
def render_haml(options)
|
61
|
+
html_path = options[:out]
|
62
|
+
template = IO.read(options[:template])
|
63
|
+
|
64
|
+
html = Haml::Engine.new(template).render(options[:helper])
|
65
|
+
|
66
|
+
html.gsub!("file:///android_asset/hybrid", "../assets") if options[:platform] == 'ios'
|
67
|
+
IO.write(html_path, html)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
namespace :ios do
|
2
|
+
|
3
|
+
|
4
|
+
ios_manifest = Calatrava::Manifest.new('ios')
|
5
|
+
|
6
|
+
html_views = ios_manifest.features.collect do |feature|
|
7
|
+
html_dir = "ios/public/views"
|
8
|
+
Dir["shell/pages/#{feature}/*.haml"].collect do |page|
|
9
|
+
pageName = File.basename(page, '.haml')
|
10
|
+
file "#{html_dir}/#{pageName}.html" => page do
|
11
|
+
HamlSupport::compile_hybrid_page feature, page, html_dir, :platform => 'ios'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end.flatten
|
15
|
+
|
16
|
+
desc "Creates html from haml using iPhone layout"
|
17
|
+
task :haml => [CONFIG[:ios][:html]] + html_views
|
18
|
+
|
19
|
+
directory 'ios/public/assets'
|
20
|
+
|
21
|
+
desc "Copies required assets for ios"
|
22
|
+
task :shared => ["shell:scss", "shell:coffee", "kernel:coffee", 'ios/public/assets',
|
23
|
+
CONFIG[:ios][:css], CONFIG[:ios][:imgs], CONFIG[:ios][:js], :config, CONFIG[:ios][:fonts]] do
|
24
|
+
cp_ne "#{BUILD_CORE_CSS_DIR}/*.css", CONFIG[:ios][:css]
|
25
|
+
cp_ne "#{ASSETS_IMG_DIR}/*", CONFIG[:ios][:imgs]
|
26
|
+
cp_ne "assets/lib/*.js", CONFIG[:ios][:js]
|
27
|
+
cp_ne "ios/res/js/*.js", CONFIG[:ios][:js]
|
28
|
+
|
29
|
+
ios_manifest.js_files.each do |js_file|
|
30
|
+
sh "cp #{js_file} #{CONFIG[:ios][:js]}"
|
31
|
+
end
|
32
|
+
ios_manifest.load_file('ios/public/assets', '%@/public/assets/scripts', :type => :text, :include_pages => false)
|
33
|
+
|
34
|
+
cp_ne "build/shell/js/**/*.js", CONFIG[:ios][:js]
|
35
|
+
cp_ne "build/kernel/js/*.js", CONFIG[:ios][:js]
|
36
|
+
cp_ne "#{ASSETS_FONTS_DIR}/*", CONFIG[:ios][:fonts]
|
37
|
+
end
|
38
|
+
|
39
|
+
task :app => [:shared, :haml]
|
40
|
+
|
41
|
+
desc "Prepares config for the app"
|
42
|
+
task :config do
|
43
|
+
env_coffee = config_path("env.coffee")
|
44
|
+
coffee env_coffee, CONFIG[:ios][:js]
|
45
|
+
end
|
46
|
+
|
47
|
+
task :configured_app => [:app, :config]
|
48
|
+
|
49
|
+
desc "Builds the iOS app"
|
50
|
+
task :build => :configured_app do
|
51
|
+
ENV['CMDLINE_BUILD'] = 'true'
|
52
|
+
Calatrava::Project.current.build_ios
|
53
|
+
end
|
54
|
+
|
55
|
+
desc "Publish the iOS app as an artifact"
|
56
|
+
task :publish => :build do
|
57
|
+
artifact(CONFIG[:ios][:xcode][:package_path], ENV['CALATRAVA_ENV'])
|
58
|
+
end
|
59
|
+
|
60
|
+
desc "Clean ios public directory"
|
61
|
+
task :clean do
|
62
|
+
sh "rm -rf #{CONFIG[:ios][:public]}/*"
|
63
|
+
end
|
64
|
+
|
65
|
+
namespace :xcode do
|
66
|
+
task :prebuild do
|
67
|
+
if !ENV['CMDLINE_BUILD']
|
68
|
+
Rake::Task['configure:development'].invoke
|
69
|
+
Rake::Task['ios:configured_app'].invoke
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
namespace :kernel do
|
2
|
+
|
3
|
+
directory "build/kernel/js"
|
4
|
+
|
5
|
+
desc "Build kernel js files"
|
6
|
+
task :coffee => "build/kernel/js" do
|
7
|
+
coffee "kernel/app", "build/kernel/js"
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "Clean built kernel"
|
11
|
+
task :clean do
|
12
|
+
rm_rf "build/kernel"
|
13
|
+
end
|
14
|
+
|
15
|
+
file '.node_updated' => 'package.json' do
|
16
|
+
sh "npm install"
|
17
|
+
sh "touch .node_updated"
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "Run jasmine test. If specs not given in argument, runs all test"
|
21
|
+
task :spec => '.node_updated' do |t, args|
|
22
|
+
cd "kernel" do
|
23
|
+
ENV['NODE_PATH'] = "app:#{Calatrava::Project.current.src_paths}:spec:../assets/lib"
|
24
|
+
sh "../node_modules/jasmine-node/bin/jasmine-node --coffee --test-dir spec"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Run cucumber.js features for kernel"
|
29
|
+
task :features, [:file] => ['.node_updated', :create_sim_link] do |t, args|
|
30
|
+
cd "kernel" do
|
31
|
+
ENV['NODE_PATH'] = "#{Calatrava::Project.current.src_paths}:features/support:../assets/lib:features/step_definitions:../features/testdata"
|
32
|
+
features_to_be_run = args[:file] ? "#{kernel/features}/#{args[:file]}" : "features"
|
33
|
+
sh "../node_modules/cucumber/bin/cucumber.js --tags @all,@kernel --tags ~@wip '#{features_to_be_run}'"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
namespace :features do
|
38
|
+
task :wip => ['.node_updated', :create_sim_link] do
|
39
|
+
cd "kernel" do
|
40
|
+
ENV['NODE_PATH'] = "#{Calatrava::Project.current.src_paths}:features/support:../assets/lib:features/step_definitions:../features/testdata"
|
41
|
+
sh "../node_modules/cucumber/bin/cucumber.js --tags @wip --tags @kernel features"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
desc "create sim link for the kernels step_definitions and support folder"
|
47
|
+
task :create_sim_link do
|
48
|
+
sh "ln -sFfh kernel/features/step_definitions/ features/step_definitions"
|
49
|
+
sh "ln -sFfh kernel/features/support/ features/support"
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|