alloy 0.0.1
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/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +158 -0
- data/Rakefile +44 -0
- data/alloy.gemspec +27 -0
- data/bin/alloy +5 -0
- data/lib/alloy.rb +14 -0
- data/lib/alloy/chore/coffee_script.rb +25 -0
- data/lib/alloy/cli.rb +26 -0
- data/lib/alloy/config.rb +196 -0
- data/lib/alloy/task/build.rb +63 -0
- data/lib/alloy/task/clean.rb +36 -0
- data/lib/alloy/version.rb +5 -0
- data/lib/templates/alloy.json.erb +24 -0
- data/spec/alloy/config_spec.rb +63 -0
- data/spec/fixtures/config.json +12 -0
- data/spec/fixtures/tiapp.xml +49 -0
- data/spec/spec_helper.rb +15 -0
- metadata +203 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Junya Ogura, QNYP, LLC.
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,158 @@
|
|
1
|
+
# alloy
|
2
|
+
|
3
|
+
CLI Toolbelt for Titanium Mobile development on Mac OS X.
|
4
|
+
|
5
|
+
## Prerequisite
|
6
|
+
|
7
|
+
* Mac OS X 10.7
|
8
|
+
* Titanium Studio 2.0
|
9
|
+
* Ruby 1.9.3
|
10
|
+
* CoffeeScript
|
11
|
+
|
12
|
+
## Usage
|
13
|
+
|
14
|
+
### Setup
|
15
|
+
|
16
|
+
$ cd /path/to/titanium-workspace/HelloWorld
|
17
|
+
$ alloy init
|
18
|
+
create alloy.json
|
19
|
+
|
20
|
+
### Compiling CoffeeScript into JavaScript
|
21
|
+
|
22
|
+
You should place `*.coffee` files under the directory named `app`.
|
23
|
+
|
24
|
+
$ mkdir app
|
25
|
+
$ echo "Ti.API.console 'Hello'" > app/hello.coffee
|
26
|
+
|
27
|
+
Then, run `coffee` task.
|
28
|
+
|
29
|
+
$ alloy coffee
|
30
|
+
Compiling CoffeeScript
|
31
|
+
Successfully compiled CoffeeScript
|
32
|
+
|
33
|
+
JavaScript files generated under the `Resources` directory.
|
34
|
+
|
35
|
+
$ cat Resources/hello.js
|
36
|
+
// Generated by CoffeeScript 1.3.1
|
37
|
+
|
38
|
+
Ti.API.console('Hello');
|
39
|
+
|
40
|
+
### Cleaning up build directory
|
41
|
+
|
42
|
+
Run `clean` task to clean up intermediate files (`build/iphone/*` or `build/android/*`).
|
43
|
+
|
44
|
+
$ alloy clean iphone
|
45
|
+
$ alloy clean android
|
46
|
+
|
47
|
+
### Building app and run in iPhone simulator
|
48
|
+
|
49
|
+
$ alloy build iphone
|
50
|
+
|
51
|
+
### Building app and run in Android emulator
|
52
|
+
|
53
|
+
Before using alloy, you need to create and setup a [AVD (Android Virtual Devices)](http://developer.android.com/intl/en/guide/developing/devices/index.html) for rapid development process.
|
54
|
+
|
55
|
+
#### AVD setup
|
56
|
+
|
57
|
+
1. Launch Android SDK Manager and install `SDK Platform` and `Google APIs` of `Android 2.2 (API 8)`
|
58
|
+
|
59
|
+
$ ANDROID_SDK_HOME/tools/android &
|
60
|
+
|
61
|
+
2. Check what Android target availables
|
62
|
+
|
63
|
+
$ ANDROID_SDK_HOME/tools/android list targets
|
64
|
+
Available Android targets:
|
65
|
+
----------
|
66
|
+
id: 1 or "android-15"
|
67
|
+
Name: Android 4.0.3
|
68
|
+
Type: Platform
|
69
|
+
API level: 15
|
70
|
+
Revision: 3
|
71
|
+
Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800
|
72
|
+
ABIs : armeabi-v7a, x86
|
73
|
+
----------
|
74
|
+
id: 2 or "Google Inc.:Google APIs:15"
|
75
|
+
Name: Google APIs
|
76
|
+
Type: Add-On
|
77
|
+
Vendor: Google Inc.
|
78
|
+
Revision: 2
|
79
|
+
Description: Android + Google APIs
|
80
|
+
Based on Android 4.0.3 (API level 15)
|
81
|
+
Libraries:
|
82
|
+
* com.google.android.media.effects (effects.jar)
|
83
|
+
Collection of video effects
|
84
|
+
* com.android.future.usb.accessory (usb.jar)
|
85
|
+
API for USB Accessories
|
86
|
+
* com.google.android.maps (maps.jar)
|
87
|
+
API for Google Maps
|
88
|
+
Skins: WVGA854, WQVGA400, WSVGA, WXGA720, HVGA, WQVGA432, WVGA800 (default), QVGA, WXGA800
|
89
|
+
ABIs : armeabi-v7a
|
90
|
+
|
91
|
+
3. Create a new AVD
|
92
|
+
|
93
|
+
$ ANDROID_SDK_HOME/tools/android create avd \
|
94
|
+
-n my_android-4.0.3 \
|
95
|
+
-t 1 \
|
96
|
+
--abi armeabi-v7a \
|
97
|
+
--skin WVGA800
|
98
|
+
|
99
|
+
`my_android-4.0.3` is AVD name, `1` is ID of Android target.
|
100
|
+
|
101
|
+
AVD created under `~/.android/avd`.
|
102
|
+
|
103
|
+
$ ls -la ~/.android/avd
|
104
|
+
total 8
|
105
|
+
drwxr-xr-x 4 juno staff 136 6 1 00:56 .
|
106
|
+
drwxr-xr-x 6 juno staff 204 6 1 00:51 ..
|
107
|
+
drwxr-xr-x 4 juno staff 136 6 1 00:56 my_android-4.0.3.avd
|
108
|
+
-rw-r--r-- 1 juno staff 69 6 1 00:56 my_android-4.0.3.ini
|
109
|
+
|
110
|
+
$ ANDROID_SDK_HOME/tools/android list avd
|
111
|
+
Available Android Virtual Devices:
|
112
|
+
Name: my_android-4.0.3
|
113
|
+
Path: /Users/juno/.android/avd/my_android-4.0.3.avd
|
114
|
+
Target: Android 4.0.3 (API level 15)
|
115
|
+
ABI: armeabi-v7a
|
116
|
+
Skin: WVGA800
|
117
|
+
|
118
|
+
Yay!
|
119
|
+
|
120
|
+
4. Enable SD Card support to install application
|
121
|
+
|
122
|
+
$ echo "sdcard.size=256M" >> ~/.android/avd/my_android-4.0.3.avd/config.ini
|
123
|
+
|
124
|
+
#### Running Android emulator
|
125
|
+
|
126
|
+
1. Start adb server
|
127
|
+
|
128
|
+
$ ANDROID_SDK_HOME/platform-tools/adb start-server
|
129
|
+
|
130
|
+
2. Launch Android emulator
|
131
|
+
|
132
|
+
$ ANDROID_SDK_HOME/tools/emulator -avd my_android-4.0.3
|
133
|
+
|
134
|
+
After Android launch, emulator instance appears as a device.
|
135
|
+
|
136
|
+
$ ANDROID_SDK_HOME/platform-tools/adb devices
|
137
|
+
List of devices attached
|
138
|
+
emulator-5554 device
|
139
|
+
|
140
|
+
#### Build and install application to emulator
|
141
|
+
|
142
|
+
$ alloy build android
|
143
|
+
|
144
|
+
#### Shutting down Android emulator
|
145
|
+
|
146
|
+
1. Exit Android emulator app
|
147
|
+
|
148
|
+
2. Kill adb server
|
149
|
+
|
150
|
+
$ ANDROID_SDK_HOME/platform-tools/adb kill-server
|
151
|
+
|
152
|
+
## Contributing
|
153
|
+
|
154
|
+
1. Fork it
|
155
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
156
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
157
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
158
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
|
3
|
+
#############################################################################
|
4
|
+
#
|
5
|
+
# Helper functions
|
6
|
+
#
|
7
|
+
#############################################################################
|
8
|
+
|
9
|
+
def name
|
10
|
+
@name ||= Dir['*.gemspec'].first.split('.').first
|
11
|
+
end
|
12
|
+
|
13
|
+
def version
|
14
|
+
line = File.read("lib/#{name}/version.rb")[/^\s*VERSION\s*=\s*.*/]
|
15
|
+
line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1]
|
16
|
+
end
|
17
|
+
|
18
|
+
#############################################################################
|
19
|
+
#
|
20
|
+
# Standard tasks
|
21
|
+
#
|
22
|
+
#############################################################################
|
23
|
+
|
24
|
+
task :default => :spec
|
25
|
+
|
26
|
+
require 'rspec/core/rake_task'
|
27
|
+
RSpec::Core::RakeTask.new do |t|
|
28
|
+
t.rspec_opts = ['--color']
|
29
|
+
t.pattern = 'spec/**/*_spec.rb'
|
30
|
+
end
|
31
|
+
|
32
|
+
require 'rdoc/task'
|
33
|
+
RDoc::Task.new do |t|
|
34
|
+
t.rdoc_dir = 'rdoc'
|
35
|
+
t.title = "#{name} #{version}"
|
36
|
+
t.rdoc_files.include('README*')
|
37
|
+
t.rdoc_files.include('lib/**/*.rb')
|
38
|
+
t.markup = 'tomdoc'
|
39
|
+
end
|
40
|
+
|
41
|
+
desc 'Open an irb session preloaded with this library'
|
42
|
+
task :console do
|
43
|
+
sh "irb -rubygems -r ./lib/#{name}.rb"
|
44
|
+
end
|
data/alloy.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/alloy/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Junya Ogura"]
|
6
|
+
gem.email = ["junyaogura@gmail.com"]
|
7
|
+
gem.description = %q{CLI Toolbelt for Titanium Mobile development on Mac OS X.}
|
8
|
+
gem.summary = %q{CLI Toolbelt for Titanium Mobile development on Mac OS X.}
|
9
|
+
gem.homepage = "https://github.com/qnyp/alloy"
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "alloy"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Alloy::VERSION
|
17
|
+
|
18
|
+
gem.add_development_dependency 'rake', '~> 0.9.0'
|
19
|
+
gem.add_development_dependency 'rdoc', '~> 3.0'
|
20
|
+
gem.add_development_dependency 'rspec', '~> 2.10.0'
|
21
|
+
gem.add_development_dependency 'simplecov', '~> 0.6.0'
|
22
|
+
|
23
|
+
gem.add_dependency 'colored', '~> 1.2'
|
24
|
+
gem.add_dependency 'json', '~> 1.6.6'
|
25
|
+
gem.add_dependency 'nokogiri', '~> 1.5.2'
|
26
|
+
gem.add_dependency 'thor', '~> 0.14.6'
|
27
|
+
end
|
data/bin/alloy
ADDED
data/lib/alloy.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
module Alloy
|
2
|
+
autoload :CLI, 'alloy/cli'
|
3
|
+
autoload :Config, 'alloy/config'
|
4
|
+
autoload :VERSION, 'alloy/version'
|
5
|
+
|
6
|
+
module Chore
|
7
|
+
autoload :CoffeeScript, 'alloy/chore/coffee_script'
|
8
|
+
end
|
9
|
+
|
10
|
+
module Task
|
11
|
+
autoload :Build, 'alloy/task/build'
|
12
|
+
autoload :Clean, 'alloy/task/clean'
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'colored'
|
2
|
+
|
3
|
+
module Alloy::Chore
|
4
|
+
|
5
|
+
class CoffeeScript
|
6
|
+
def self.run
|
7
|
+
puts "Compiling CoffeeScript".blue
|
8
|
+
|
9
|
+
failed = false
|
10
|
+
paths = `find app -name '*.coffee'`.split("\n")
|
11
|
+
|
12
|
+
paths.each do |path|
|
13
|
+
out_dir = path.gsub(/^app/, 'Resources').gsub(/\/[\w-]*\.coffee$/,"")
|
14
|
+
unless system "coffee -c -b -o #{out_dir} #{path}"
|
15
|
+
puts "Compilation failed: #{path}".red
|
16
|
+
failed = true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
puts "Successfully compiled CoffeeScript".green unless failed
|
21
|
+
not failed
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
data/lib/alloy/cli.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'alloy'
|
2
|
+
require 'thor'
|
3
|
+
|
4
|
+
module Alloy
|
5
|
+
class CLI < Thor
|
6
|
+
include Thor::Actions
|
7
|
+
|
8
|
+
Alloy::CLI.source_root(File.expand_path('../../templates', __FILE__))
|
9
|
+
|
10
|
+
desc 'build SUBCOMMAND', 'Build the app and run in simulator or emulator'
|
11
|
+
subcommand 'build', Task::Build
|
12
|
+
|
13
|
+
desc 'clean SUBCOMMAND', 'Clean up build directory'
|
14
|
+
subcommand 'clean', Task::Clean
|
15
|
+
|
16
|
+
desc 'coffee', 'Compile CoffeeScript into JavaScript'
|
17
|
+
def coffee
|
18
|
+
Chore::CoffeeScript.run
|
19
|
+
end
|
20
|
+
|
21
|
+
desc 'init', 'Generate alloy.json'
|
22
|
+
def init
|
23
|
+
template('alloy.json.erb', 'alloy.json')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/alloy/config.rb
ADDED
@@ -0,0 +1,196 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'nokogiri'
|
3
|
+
|
4
|
+
module Alloy
|
5
|
+
|
6
|
+
class Config
|
7
|
+
# Public: Creates a new config instance.
|
8
|
+
#
|
9
|
+
# Examples
|
10
|
+
#
|
11
|
+
# config = Alloy::Config.new('alloy.json')
|
12
|
+
#
|
13
|
+
# path - The String represents path to alloy.json
|
14
|
+
def initialize(path)
|
15
|
+
load_alloy_json(path)
|
16
|
+
load_tiapp_xml
|
17
|
+
end
|
18
|
+
|
19
|
+
# Public: Returns Application ID
|
20
|
+
#
|
21
|
+
# Examples
|
22
|
+
#
|
23
|
+
# app_id
|
24
|
+
# # => 'com.example.helloworld'
|
25
|
+
#
|
26
|
+
# Returns the Application ID String.
|
27
|
+
def app_id
|
28
|
+
@app_id
|
29
|
+
end
|
30
|
+
|
31
|
+
# Public: Returns Application Name
|
32
|
+
#
|
33
|
+
# Examples
|
34
|
+
#
|
35
|
+
# app_name
|
36
|
+
# # => 'HelloWorld'
|
37
|
+
#
|
38
|
+
# Returns the Application Name String.
|
39
|
+
def app_name
|
40
|
+
@app_name
|
41
|
+
end
|
42
|
+
|
43
|
+
# Public: Returns path to Titanium Mobile SDK installation.
|
44
|
+
#
|
45
|
+
# Examples
|
46
|
+
#
|
47
|
+
# titanium_sdk_path
|
48
|
+
# # => '/Library/Application Support/Titanium'
|
49
|
+
#
|
50
|
+
# Returns the path String.
|
51
|
+
def titanium_sdk_path
|
52
|
+
@json['titanium']['sdk_path']
|
53
|
+
end
|
54
|
+
|
55
|
+
# Public: Returns Titanium Mobile SDK version string.
|
56
|
+
#
|
57
|
+
# Examples
|
58
|
+
#
|
59
|
+
# titanium_sdk_version
|
60
|
+
# # => '1.8.2'
|
61
|
+
#
|
62
|
+
# Returns the version String.
|
63
|
+
def titanium_sdk_version
|
64
|
+
@titanium_sdk_version
|
65
|
+
end
|
66
|
+
|
67
|
+
# Public: Returns iPhone SDK version string.
|
68
|
+
#
|
69
|
+
# Examples
|
70
|
+
#
|
71
|
+
# iphone_sdk_version
|
72
|
+
# # => '5.0'
|
73
|
+
#
|
74
|
+
# Returns the version String.
|
75
|
+
def iphone_sdk_version
|
76
|
+
@json['iphone']['sdk_version']
|
77
|
+
end
|
78
|
+
|
79
|
+
# Public: Returns path string to Android SDK installation.
|
80
|
+
#
|
81
|
+
# Examples
|
82
|
+
#
|
83
|
+
# android_sdk_path
|
84
|
+
# # => ''
|
85
|
+
#
|
86
|
+
# Returns the path String.
|
87
|
+
def android_sdk_path
|
88
|
+
@json['android']['sdk_path']
|
89
|
+
end
|
90
|
+
|
91
|
+
# Public: Returns AVD ID string.
|
92
|
+
#
|
93
|
+
# Examples
|
94
|
+
#
|
95
|
+
# android_avd_id
|
96
|
+
# # => '1'
|
97
|
+
#
|
98
|
+
# Returns the AVD ID String.
|
99
|
+
def android_avd_id
|
100
|
+
@json['android']['avd_id']
|
101
|
+
end
|
102
|
+
|
103
|
+
# Public: Returns Titanium assets directory path string.
|
104
|
+
#
|
105
|
+
# Examples
|
106
|
+
#
|
107
|
+
# titanium_assets_path
|
108
|
+
# # => '/Library/Application Support/Titanium/mobilesdk/osx/2.0.2.GA'
|
109
|
+
#
|
110
|
+
# Returns the AVD ID String.
|
111
|
+
def titanium_assets_path
|
112
|
+
titanium_sdk_path + '/mobilesdk/osx/' + titanium_sdk_version
|
113
|
+
end
|
114
|
+
|
115
|
+
# Public: Returns Titanium iPhone assets directory path string.
|
116
|
+
#
|
117
|
+
# Examples
|
118
|
+
#
|
119
|
+
# titanium_iphone_path
|
120
|
+
# # => '/Library/Application Support/Titanium/mobilesdk/osx/2.0.2.GA/iphone'
|
121
|
+
#
|
122
|
+
# Returns the AVD ID String.
|
123
|
+
def titanium_iphone_path
|
124
|
+
titanium_assets_path + '/iphone'
|
125
|
+
end
|
126
|
+
|
127
|
+
# Public: Returns Titanium Android assets directory path string.
|
128
|
+
#
|
129
|
+
# Examples
|
130
|
+
#
|
131
|
+
# titanium_android_path
|
132
|
+
# # => '/Library/Application Support/Titanium/mobilesdk/osx/2.0.2.GA/android'
|
133
|
+
#
|
134
|
+
# Returns the AVD ID String.
|
135
|
+
def titanium_android_path
|
136
|
+
titanium_assets_path + '/android'
|
137
|
+
end
|
138
|
+
|
139
|
+
# Public: Returns Titanium iPhone builder.py path string.
|
140
|
+
#
|
141
|
+
# Examples
|
142
|
+
#
|
143
|
+
# titanium_iphone_builder
|
144
|
+
# # => '/Library/Application Support/Titanium/mobilesdk/osx/2.0.2.GA/iphone/builder.py'
|
145
|
+
#
|
146
|
+
# Returns the AVD ID String.
|
147
|
+
def titanium_iphone_builder
|
148
|
+
titanium_iphone_path + '/builder.py'
|
149
|
+
end
|
150
|
+
|
151
|
+
# Public: Returns Titanium Android builder.py path string.
|
152
|
+
#
|
153
|
+
# Examples
|
154
|
+
#
|
155
|
+
# titanium_android_builder
|
156
|
+
# # => '/Library/Application Support/Titanium/mobilesdk/osx/2.0.2.GA/android/builder.py'
|
157
|
+
#
|
158
|
+
# Returns the AVD ID String.
|
159
|
+
def titanium_android_builder
|
160
|
+
titanium_android_path + '/builder.py'
|
161
|
+
end
|
162
|
+
|
163
|
+
# Public: Returns project root directory path string.
|
164
|
+
#
|
165
|
+
# Examples
|
166
|
+
#
|
167
|
+
# project_root
|
168
|
+
# # => '/path/to/titanium-project-root'
|
169
|
+
#
|
170
|
+
# Returns the AVD ID String.
|
171
|
+
def project_root
|
172
|
+
@json['project_root']
|
173
|
+
end
|
174
|
+
|
175
|
+
|
176
|
+
private
|
177
|
+
|
178
|
+
def load_alloy_json(path)
|
179
|
+
@json = {}
|
180
|
+
open(path) do |file|
|
181
|
+
@json = JSON.parse(file.read)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def load_tiapp_xml(filename = 'tiapp.xml')
|
186
|
+
path = @json['project_root'] + '/' + filename
|
187
|
+
open(path) do |f|
|
188
|
+
doc = Nokogiri::XML(f)
|
189
|
+
@app_id = doc.xpath('ti:app/id').text
|
190
|
+
@app_name = doc.xpath('ti:app/name').text
|
191
|
+
@titanium_sdk_version = doc.xpath('ti:app/sdk-version').text
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'alloy'
|
2
|
+
require 'colored'
|
3
|
+
require 'shellwords'
|
4
|
+
require 'thor'
|
5
|
+
|
6
|
+
module Alloy::Task
|
7
|
+
class Build < Thor
|
8
|
+
desc 'iphone', 'Build the iPhone app and run in simulator'
|
9
|
+
def iphone
|
10
|
+
Chore::build_and_run_iphone
|
11
|
+
end
|
12
|
+
|
13
|
+
desc 'android', 'Build the Android app and run in emulator'
|
14
|
+
def android
|
15
|
+
Chore::build_and_run_android
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class Build::Chore
|
20
|
+
PERL_COLOR_FILTER = %Q{| perl -pe 's/^\\[DEBUG\\].*$/\\e[35m$&\\e[0m/g;s/^\\[INFO\\].*$/\\e[36m$&\\e[0m/g;s/^\\[WARN\\].*$/\\e[33m$&\\e[0m/g;s/^\\[ERROR\\].*$/\\e[31m$&\\e[0m/g;'}
|
21
|
+
|
22
|
+
def self.build_and_run_iphone
|
23
|
+
config = Alloy::Config.new('./alloy.json')
|
24
|
+
puts "Building with Titanium... (DEVICE_TYPE: iphone)".blue
|
25
|
+
bash_arg = [config.titanium_iphone_builder,
|
26
|
+
'run',
|
27
|
+
config.project_root + '/',
|
28
|
+
config.iphone_sdk_version,
|
29
|
+
config.app_id,
|
30
|
+
config.app_name,
|
31
|
+
'iphone'].map{|i|Shellwords.escape(i)}.join(' ')
|
32
|
+
cmd = %Q{bash -c "#{bash_arg}" #{PERL_COLOR_FILTER}}
|
33
|
+
begin
|
34
|
+
system cmd
|
35
|
+
rescue => e
|
36
|
+
puts e.backtrace.join("\n")
|
37
|
+
puts e.message.red
|
38
|
+
system %Q{killall "iPhone Simulator"}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.build_and_run_android
|
43
|
+
config = Alloy::Config.new('./alloy.json')
|
44
|
+
puts "Building with Titanium... (DEVICE_TYPE: android)".blue
|
45
|
+
command = 'simulator'
|
46
|
+
project_name = config.app_name
|
47
|
+
sdk_dir = config.android_sdk_path
|
48
|
+
project_dir = config.project_root + '/'
|
49
|
+
app_id = config.app_id
|
50
|
+
avd_id = config.android_avd_id
|
51
|
+
bash_arg = [config.titanium_android_builder,
|
52
|
+
command,
|
53
|
+
project_name,
|
54
|
+
sdk_dir,
|
55
|
+
project_dir,
|
56
|
+
app_id,
|
57
|
+
avd_id].map{|i|Shellwords.escape(i)}.join(' ')
|
58
|
+
cmd = %Q{bash -c "#{bash_arg}" #{PERL_COLOR_FILTER}}
|
59
|
+
puts cmd
|
60
|
+
system cmd
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'colored'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'thor'
|
4
|
+
|
5
|
+
module Alloy::Task
|
6
|
+
class Clean < Thor
|
7
|
+
desc 'iphone', 'Clean up iPhone build directory'
|
8
|
+
def iphone
|
9
|
+
Chore::clean_up_iphone
|
10
|
+
end
|
11
|
+
|
12
|
+
desc 'android', 'Clean up Android build directory'
|
13
|
+
def android
|
14
|
+
Chore::clean_up_android
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Clean::Chore
|
19
|
+
def self.clean_up_iphone
|
20
|
+
clean_up('build/iphone')
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.clean_up_android
|
24
|
+
clean_up('build/android')
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.clean_up(path)
|
28
|
+
if Dir.exist?(path)
|
29
|
+
FileUtils.rm_r Dir.glob("#{path}/*"), :force => true
|
30
|
+
puts "Cleaned #{path}".blue
|
31
|
+
else
|
32
|
+
puts "Directory '#{path}' not found".red
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<%
|
2
|
+
project_root = Dir.pwd
|
3
|
+
|
4
|
+
candidates = ['/Library/Application Support/Titanium',
|
5
|
+
'~/Library/Application Support/Titanium']
|
6
|
+
titanium_sdk_path = candidates.find { |i| Dir.exist?(File.expand_path(i)) }
|
7
|
+
|
8
|
+
candidates = [ENV['ANDROID_SDK'],
|
9
|
+
ENV['ANDROID_SDK_HOME']]
|
10
|
+
android_sdk_path = candidates.find { |i| i != nil }
|
11
|
+
-%>
|
12
|
+
{
|
13
|
+
"project_root": "<%= project_root %>",
|
14
|
+
"titanium": {
|
15
|
+
"sdk_path": "<%= titanium_sdk_path %>"
|
16
|
+
},
|
17
|
+
"iphone": {
|
18
|
+
"sdk_version": "5.1"
|
19
|
+
},
|
20
|
+
"android": {
|
21
|
+
"sdk_path": "<%= android_sdk_path %>",
|
22
|
+
"avd_id": "1"
|
23
|
+
}
|
24
|
+
}
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Alloy::Config do
|
4
|
+
let(:tiapp_xml_path) {
|
5
|
+
File.join(File.dirname(__FILE__), '..', 'fixtures', 'tiapp.xml')
|
6
|
+
}
|
7
|
+
let(:json_path) {
|
8
|
+
File.join(File.dirname(__FILE__), '..', 'fixtures', 'config.json')
|
9
|
+
}
|
10
|
+
|
11
|
+
describe ".load(path)" do
|
12
|
+
let(:config) { nil }
|
13
|
+
|
14
|
+
before { config = Alloy::Config.load(json_path) }
|
15
|
+
end
|
16
|
+
|
17
|
+
context "Default values" do
|
18
|
+
let(:config) { Alloy::Config.new(tiapp_xml_path) }
|
19
|
+
|
20
|
+
before do
|
21
|
+
ENV.stub(:[]).with('ANDROID_SDK') { '' }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#titanium_sdk_path" do
|
25
|
+
subject { config.titanium_sdk_path }
|
26
|
+
xit { should eq('/Library/Application\\ Support/Titanium') }
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#titanium_sdk_version" do
|
30
|
+
subject { config.titanium_sdk_version }
|
31
|
+
xit { should eq('1.8.2') }
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "#iphone_sdk_version" do
|
35
|
+
subject { config.iphone_sdk_version }
|
36
|
+
xit { should eq('5.0') }
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#android_sdk_id" do
|
40
|
+
subject { config.android_sdk_id }
|
41
|
+
xit { should eq('6') }
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#android_sdk_path" do
|
45
|
+
subject { config.android_sdk_path }
|
46
|
+
xit { should eq('') }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "Environment variable ANDROID_SDK exists" do
|
51
|
+
let(:config) { Alloy::Config.new(tiapp_xml_path) }
|
52
|
+
|
53
|
+
before do
|
54
|
+
ENV.stub(:[]).with('ANDROID_SDK') { '/path/to/android-sdk' }
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#android_sdk_path" do
|
58
|
+
subject { config.android_sdk_path }
|
59
|
+
xit { should eq('/path/to/android-sdk') }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<ti:app xmlns:ti="http://ti.appcelerator.org">
|
3
|
+
<deployment-targets>
|
4
|
+
<target device="mobileweb">false</target>
|
5
|
+
<target device="iphone">true</target>
|
6
|
+
<target device="ipad">false</target>
|
7
|
+
<target device="android">false</target>
|
8
|
+
<target device="blackberry">false</target>
|
9
|
+
</deployment-targets>
|
10
|
+
<sdk-version>2.0.1.GA2</sdk-version>
|
11
|
+
<id>com.example.hello</id>
|
12
|
+
<name>hello</name>
|
13
|
+
<version>1.0</version>
|
14
|
+
<publisher>foo</publisher>
|
15
|
+
<url>http://example.com/</url>
|
16
|
+
<description>not specified</description>
|
17
|
+
<copyright>2012 by foo</copyright>
|
18
|
+
<icon>appicon.png</icon>
|
19
|
+
<persistent-wifi>false</persistent-wifi>
|
20
|
+
<prerendered-icon>false</prerendered-icon>
|
21
|
+
<statusbar-style>default</statusbar-style>
|
22
|
+
<statusbar-hidden>false</statusbar-hidden>
|
23
|
+
<fullscreen>false</fullscreen>
|
24
|
+
<navbar-hidden>false</navbar-hidden>
|
25
|
+
<analytics>true</analytics>
|
26
|
+
<guid>249e2249-9394-4f99-ae0d-c33b6a83794f</guid>
|
27
|
+
<property name="ti.ui.defaultunit">system</property>
|
28
|
+
<iphone>
|
29
|
+
<orientations device="iphone">
|
30
|
+
<orientation>Ti.UI.PORTRAIT</orientation>
|
31
|
+
</orientations>
|
32
|
+
<orientations device="ipad">
|
33
|
+
<orientation>Ti.UI.PORTRAIT</orientation>
|
34
|
+
<orientation>Ti.UI.UPSIDE_PORTRAIT</orientation>
|
35
|
+
<orientation>Ti.UI.LANDSCAPE_LEFT</orientation>
|
36
|
+
<orientation>Ti.UI.LANDSCAPE_RIGHT</orientation>
|
37
|
+
</orientations>
|
38
|
+
</iphone>
|
39
|
+
<android xmlns:android="http://schemas.android.com/apk/res/android"/>
|
40
|
+
<mobileweb>
|
41
|
+
<precache/>
|
42
|
+
<splash>
|
43
|
+
<enabled>true</enabled>
|
44
|
+
<inline-css-images>true</inline-css-images>
|
45
|
+
</splash>
|
46
|
+
<theme>default</theme>
|
47
|
+
</mobileweb>
|
48
|
+
<modules/>
|
49
|
+
</ti:app>
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start do
|
3
|
+
add_filter '.bundle/'
|
4
|
+
add_filter 'spec/'
|
5
|
+
end
|
6
|
+
|
7
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
8
|
+
|
9
|
+
require 'rspec'
|
10
|
+
|
11
|
+
require 'alloy'
|
12
|
+
|
13
|
+
RSpec.configure do |config|
|
14
|
+
config.mock_with :rspec
|
15
|
+
end
|
metadata
ADDED
@@ -0,0 +1,203 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: alloy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Junya Ogura
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-06-02 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.9.0
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.9.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rdoc
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '3.0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '3.0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 2.10.0
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.10.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: simplecov
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 0.6.0
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 0.6.0
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: colored
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '1.2'
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '1.2'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: json
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 1.6.6
|
102
|
+
type: :runtime
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 1.6.6
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: nokogiri
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.5.2
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 1.5.2
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: thor
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ~>
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: 0.14.6
|
134
|
+
type: :runtime
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ~>
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 0.14.6
|
142
|
+
description: CLI Toolbelt for Titanium Mobile development on Mac OS X.
|
143
|
+
email:
|
144
|
+
- junyaogura@gmail.com
|
145
|
+
executables:
|
146
|
+
- alloy
|
147
|
+
extensions: []
|
148
|
+
extra_rdoc_files: []
|
149
|
+
files:
|
150
|
+
- .gitignore
|
151
|
+
- Gemfile
|
152
|
+
- LICENSE
|
153
|
+
- README.md
|
154
|
+
- Rakefile
|
155
|
+
- alloy.gemspec
|
156
|
+
- bin/alloy
|
157
|
+
- lib/alloy.rb
|
158
|
+
- lib/alloy/chore/coffee_script.rb
|
159
|
+
- lib/alloy/cli.rb
|
160
|
+
- lib/alloy/config.rb
|
161
|
+
- lib/alloy/task/build.rb
|
162
|
+
- lib/alloy/task/clean.rb
|
163
|
+
- lib/alloy/version.rb
|
164
|
+
- lib/templates/alloy.json.erb
|
165
|
+
- spec/alloy/config_spec.rb
|
166
|
+
- spec/fixtures/config.json
|
167
|
+
- spec/fixtures/tiapp.xml
|
168
|
+
- spec/spec_helper.rb
|
169
|
+
homepage: https://github.com/qnyp/alloy
|
170
|
+
licenses: []
|
171
|
+
post_install_message:
|
172
|
+
rdoc_options: []
|
173
|
+
require_paths:
|
174
|
+
- lib
|
175
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
176
|
+
none: false
|
177
|
+
requirements:
|
178
|
+
- - ! '>='
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
segments:
|
182
|
+
- 0
|
183
|
+
hash: 1436312249168359088
|
184
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
186
|
+
requirements:
|
187
|
+
- - ! '>='
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: '0'
|
190
|
+
segments:
|
191
|
+
- 0
|
192
|
+
hash: 1436312249168359088
|
193
|
+
requirements: []
|
194
|
+
rubyforge_project:
|
195
|
+
rubygems_version: 1.8.23
|
196
|
+
signing_key:
|
197
|
+
specification_version: 3
|
198
|
+
summary: CLI Toolbelt for Titanium Mobile development on Mac OS X.
|
199
|
+
test_files:
|
200
|
+
- spec/alloy/config_spec.rb
|
201
|
+
- spec/fixtures/config.json
|
202
|
+
- spec/fixtures/tiapp.xml
|
203
|
+
- spec/spec_helper.rb
|