pindah 0.1.0.alpha
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +6 -0
- data/Manifest.txt +11 -0
- data/README.md +61 -0
- data/Rakefile +20 -0
- data/bin/pindah +10 -0
- data/lib/pindah.rb +90 -0
- data/lib/pindah_cli.rb +42 -0
- data/templates/build.xml +27 -0
- data/templates/initial_activity.mirah +7 -0
- data/test/fixtures/HelloWorld.mirah +7 -0
- data/test/pindah_cli_test.rb +50 -0
- metadata +90 -0
data/History.txt
ADDED
data/Manifest.txt
ADDED
data/README.md
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# pindah
|
2
|
+
|
3
|
+
A tool for writing Android applications in [Mirah](http://mirah.org).
|
4
|
+
|
5
|
+
## Requirements
|
6
|
+
|
7
|
+
You must have the [Android SDK](http://d.android.com/sdk/) installed
|
8
|
+
with the <tt>tools/</tt> directory placed on your $PATH. Inside
|
9
|
+
<tt>tools/</tt>, the <tt>android</tt> program will allow you to
|
10
|
+
download "platform" packages corresponding with Android versions you
|
11
|
+
wish to develop against. You'll need to install "Android SDK Platform
|
12
|
+
tools" and at least one platform revision to get started. At the time
|
13
|
+
of this writing, Android 2.1 (revision 7)
|
14
|
+
[covers most of the market](http://developer.android.com/resources/dashboard/platform-versions.html)
|
15
|
+
and is a reasonable target for new applications. Once the platform
|
16
|
+
tools are installed, place the SDK's <tt>platform-tools/</tt>
|
17
|
+
directory on your $PATH as well.
|
18
|
+
|
19
|
+
You'll also need [JRuby](http://jruby.org) installed with bin/ on your
|
20
|
+
$PATH. If your gem and rake are not from from JRuby, prefix the gem
|
21
|
+
and rake commands with jruby -S:
|
22
|
+
|
23
|
+
$ gem install pindah
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
See [Garrett](http://github.com/technomancy/Garrett) for an example of
|
28
|
+
basic usage.
|
29
|
+
|
30
|
+
TODO: project template creation is not complete
|
31
|
+
|
32
|
+
$ pindah hello.world hello_world [HelloActivity]
|
33
|
+
|
34
|
+
$ cd hello_world && tree
|
35
|
+
|
36
|
+
[TODO: project skeleton listing]
|
37
|
+
|
38
|
+
$ rake -T
|
39
|
+
|
40
|
+
rake clean # Removes output files created by other targets.
|
41
|
+
rake compile # Compiles project's .mirah files into .class files
|
42
|
+
rake debug # Builds the application and signs it with a debug key.
|
43
|
+
rake install # Installs/reinstalls the debug package onto a running ...
|
44
|
+
rake javac # Compiles R.java and other gen/ files.
|
45
|
+
rake logcat # Tail logs from a device or a device or emulator
|
46
|
+
rake release # Builds the application.
|
47
|
+
rake spec # Print the project spec
|
48
|
+
rake uninstall # Uninstalls the application from a running emulator or dev...
|
49
|
+
|
50
|
+
## See Also
|
51
|
+
|
52
|
+
If Mirah is just too low-level and you need something more dynamic,
|
53
|
+
you can try [Ruboto](https://github.com/ruboto/ruboto-core/), though
|
54
|
+
be warned there is a very significant overhead it brings with it from
|
55
|
+
JRuby's runtime.
|
56
|
+
|
57
|
+
## License
|
58
|
+
|
59
|
+
Released under the Apache 2.0 license.
|
60
|
+
|
61
|
+
Copyright (c) 2011 Phil Hagelberg, Nick Plante, J.D. Huntington
|
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
|
6
|
+
Hoe.spec 'pindah' do |h|
|
7
|
+
developer('Phil Hagelberg', 'technomancy@gmail.com')
|
8
|
+
h.url = "http://github.com/mirah/pindah"
|
9
|
+
h.readme_file = "README.md"
|
10
|
+
h.summary = "A tool for writing Android applications in Mirah"
|
11
|
+
extra_deps << ["mirah", ">= 0.0.5"]
|
12
|
+
end
|
13
|
+
|
14
|
+
# vim: syntax=ruby
|
15
|
+
|
16
|
+
Rake::TestTask.new do |t|
|
17
|
+
t.libs << "test"
|
18
|
+
t.test_files = FileList['test/**/*.rb']
|
19
|
+
t.verbose = true
|
20
|
+
end
|
data/bin/pindah
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'pindah_cli'))
|
4
|
+
begin
|
5
|
+
PindahCLI.create *ARGV
|
6
|
+
rescue ArgumentError
|
7
|
+
puts "Usage: #{File.basename(__FILE__)} org.mirah.HelloWorld ~/hello_world [HelloActivity]"
|
8
|
+
end
|
9
|
+
|
10
|
+
abort "TODO: create project skeleton: rakefile, manifest, resources"
|
data/lib/pindah.rb
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
require "rake"
|
2
|
+
require "fileutils"
|
3
|
+
require "pp"
|
4
|
+
require "erb"
|
5
|
+
|
6
|
+
begin
|
7
|
+
require 'ant'
|
8
|
+
rescue LoadError
|
9
|
+
abort 'This Rakefile requires JRuby. Please use jruby -S rake.'
|
10
|
+
end
|
11
|
+
|
12
|
+
require "mirah"
|
13
|
+
|
14
|
+
module Pindah
|
15
|
+
VERSION = '0.1.0.alpha'
|
16
|
+
|
17
|
+
def self.infer_sdk_location(path)
|
18
|
+
tools = path.split(":").detect {|p| File.exists? "#{p}/android" }
|
19
|
+
File.expand_path("#{tools}/..")
|
20
|
+
end
|
21
|
+
|
22
|
+
DEFAULTS = { :output => File.expand_path("bin"),
|
23
|
+
:src => File.expand_path("src"),
|
24
|
+
:classpath => Dir["jars/*jar"],
|
25
|
+
:sdk => Pindah.infer_sdk_location(ENV["PATH"])
|
26
|
+
}
|
27
|
+
|
28
|
+
ANT_TASKS = ["clean", "javac", "compile", "debug", "release",
|
29
|
+
"install", "uninstall"]
|
30
|
+
|
31
|
+
task :generate_manifest # TODO: generate from yaml?
|
32
|
+
|
33
|
+
desc "Tail logs from a device or a device or emulator"
|
34
|
+
task :logcat do
|
35
|
+
system "adb -d logcat #{@spec[:log_filter]}"
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "Print the project spec"
|
39
|
+
task :spec do
|
40
|
+
pp @spec
|
41
|
+
end
|
42
|
+
|
43
|
+
task :default => [:install]
|
44
|
+
|
45
|
+
def self.spec=(spec)
|
46
|
+
abort "Must provide :target version in Pindah.spec!" if !spec[:target]
|
47
|
+
abort "Must provide :name in Pindah.spec!" if !spec[:name]
|
48
|
+
|
49
|
+
@spec = DEFAULTS.merge(spec)
|
50
|
+
|
51
|
+
@spec[:root] = File.expand_path "."
|
52
|
+
@spec[:classes] ||= "#{@spec[:output]}/classes"
|
53
|
+
@spec[:classpath] << @spec[:classes]
|
54
|
+
@spec[:classpath] << "#{@spec[:sdk]}/platforms/#{@spec[:target]}/android.jar"
|
55
|
+
@spec[:log_spec] ||= "ActivityManager:I #{@spec[:name]}:D " +
|
56
|
+
"AndroidRuntime:E *:S"
|
57
|
+
|
58
|
+
ant_setup
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.ant_setup
|
62
|
+
@ant = Ant.new
|
63
|
+
|
64
|
+
# TODO: this is lame, but ant interpolation doesn't work for project name
|
65
|
+
build_template = ERB.new(File.read(File.join(File.dirname(__FILE__), '..',
|
66
|
+
'templates', 'build.xml')))
|
67
|
+
build = "/tmp/pindah-#{Process.pid}-build.xml"
|
68
|
+
File.open(build, "w") { |f| f.puts build_template.result(binding) }
|
69
|
+
at_exit { File.delete build }
|
70
|
+
|
71
|
+
{ "target" => @spec[:target],
|
72
|
+
"target-version" => @spec[:target],
|
73
|
+
"sdk.dir" => @spec[:sdk],
|
74
|
+
"classes" => @spec[:classes],
|
75
|
+
"classpath" => @spec[:classpath].join(Java::JavaLang::System::
|
76
|
+
getProperty("path.separator"))
|
77
|
+
}.each do |key, value|
|
78
|
+
@ant.project.set_user_property(key, value)
|
79
|
+
end
|
80
|
+
|
81
|
+
# TODO: compile task execs mirahc instead of running inside current JVM
|
82
|
+
Ant::ProjectHelper.configure_project(@ant.project, java.io.File.new(build))
|
83
|
+
|
84
|
+
# Turn ant tasks into rake tasks
|
85
|
+
ANT_TASKS.each do |name, description|
|
86
|
+
desc @ant.project.targets[name].description
|
87
|
+
task(name) { @ant.project.execute_target(name) }
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
data/lib/pindah_cli.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module PindahCLI
|
4
|
+
DEFAULT_TARGET = 'android-7'
|
5
|
+
DEFAULT_VERSION = 'android-2.1'
|
6
|
+
|
7
|
+
def self.log(msg)
|
8
|
+
STDERR.puts msg
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.create(namespace, location, activity_name=nil)
|
12
|
+
segments = namespace.split('.')
|
13
|
+
src_dir = File.join(location, 'src', *segments)
|
14
|
+
FileUtils.mkdir_p src_dir
|
15
|
+
log "Created '#{src_dir}'."
|
16
|
+
|
17
|
+
spec_location = File.join(location, 'Pindah.spec')
|
18
|
+
spec_template = File.read(File.join(File.dirname(__FILE__),
|
19
|
+
'..', 'templates',
|
20
|
+
'Pindah.spec'))
|
21
|
+
|
22
|
+
File.open(spec_location, 'w') do |f|
|
23
|
+
f.puts spec_template.gsub(/PROJECT_NAME/, segments[-1]).
|
24
|
+
gsub(/API_TARGET/, DEFAULT_TARGET).
|
25
|
+
gsub(/API_VERSION/, DEFAULT_VERSION)
|
26
|
+
end
|
27
|
+
log "Created Pindah spec file in '#{spec_location}'."
|
28
|
+
|
29
|
+
|
30
|
+
if activity_name
|
31
|
+
activity_location = File.join(src_dir, "#{activity_name}.mirah")
|
32
|
+
activity_template = File.read(File.join(File.dirname(__FILE__),
|
33
|
+
'..', 'templates',
|
34
|
+
'initial_activity.mirah'))
|
35
|
+
|
36
|
+
File.open(activity_location, 'w') do |f|
|
37
|
+
f.puts activity_template.gsub(/INITIAL_ACTIVITY/, activity_name)
|
38
|
+
end
|
39
|
+
log "Created Activity '#{activity_name}' in '#{activity_location}'."
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/templates/build.xml
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<project name="<%= @spec[:name] %>">
|
3
|
+
<path id="android.antlibs">
|
4
|
+
<pathelement path="${sdk.dir}/tools/lib/anttasks.jar" />
|
5
|
+
<pathelement path="${sdk.dir}/tools/lib/sdklib.jar" />
|
6
|
+
<pathelement path="${sdk.dir}/tools/lib/androidprefs.jar" />
|
7
|
+
</path>
|
8
|
+
|
9
|
+
<taskdef name="setup"
|
10
|
+
classname="com.android.ant.SetupTask"
|
11
|
+
classpathref="android.antlibs" />
|
12
|
+
|
13
|
+
<target name="javac" description="Compiles R.java and other gen/ files.">
|
14
|
+
<javac srcdir="gen" destdir="${classes}" includeantruntime="false" />
|
15
|
+
</target>
|
16
|
+
|
17
|
+
<target name="compile" depends="-resource-src, -aidl, javac"
|
18
|
+
description="Compiles project's .mirah files into .class files">
|
19
|
+
<exec executable="mirahc" dir="src">
|
20
|
+
<arg line="-c ${classpath}" />
|
21
|
+
<arg line="-d ${classes}" />
|
22
|
+
<arg value="." />
|
23
|
+
</exec>
|
24
|
+
</target>
|
25
|
+
|
26
|
+
<setup />
|
27
|
+
</project>
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'tempfile'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'rubygems'
|
5
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'pindah_cli'))
|
6
|
+
|
7
|
+
class PindahCLITest < Test::Unit::TestCase
|
8
|
+
def setup
|
9
|
+
$local_pwd ||= File.expand_path(File.dirname(__FILE__))
|
10
|
+
@project_path = File.expand_path(Tempfile.new('pindah').path + ".d")
|
11
|
+
FileUtils.mkdir_p @project_path
|
12
|
+
Dir.chdir @project_path
|
13
|
+
end
|
14
|
+
|
15
|
+
def teardown
|
16
|
+
FileUtils.rm_rf @project_path
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_create_should_create_basic_project_structure
|
20
|
+
PindahCLI.create('tld.pindah.testapp', '.')
|
21
|
+
assert File.directory?(File.join(@project_path, 'src', 'tld', 'pindah', 'testapp'))
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_create_should_create_pindah_spec_file
|
25
|
+
PindahCLI.create('tld.pindah.testapp', '.')
|
26
|
+
assert File.exists?(File.join(@project_path, 'Pindah.spec'))
|
27
|
+
|
28
|
+
expected = File.read(File.join($local_pwd,
|
29
|
+
'fixtures',
|
30
|
+
'Pindah.spec'))
|
31
|
+
actual = File.read(File.join(@project_path,
|
32
|
+
'Pindah.spec'))
|
33
|
+
assert_equal expected, actual
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_create_should_create_an_activity_if_desired
|
37
|
+
PindahCLI.create('tld.pindah.testapp', '.', 'HelloWorld')
|
38
|
+
|
39
|
+
expected = File.read(File.join($local_pwd,
|
40
|
+
'fixtures',
|
41
|
+
'HelloWorld.mirah'))
|
42
|
+
actual = File.read(File.join(@project_path,
|
43
|
+
'src',
|
44
|
+
'tld',
|
45
|
+
'pindah',
|
46
|
+
'testapp',
|
47
|
+
'HelloWorld.mirah'))
|
48
|
+
assert_equal expected, actual
|
49
|
+
end
|
50
|
+
end
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pindah
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: 6
|
5
|
+
version: 0.1.0.alpha
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Phil Hagelberg
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-02-02 00:00:00 -08:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: mirah
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 0.0.5
|
25
|
+
type: :runtime
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: hoe
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 2.8.0
|
36
|
+
type: :development
|
37
|
+
version_requirements: *id002
|
38
|
+
description: ""
|
39
|
+
email:
|
40
|
+
- technomancy@gmail.com
|
41
|
+
executables:
|
42
|
+
- pindah
|
43
|
+
extensions: []
|
44
|
+
|
45
|
+
extra_rdoc_files:
|
46
|
+
- History.txt
|
47
|
+
- Manifest.txt
|
48
|
+
files:
|
49
|
+
- History.txt
|
50
|
+
- Manifest.txt
|
51
|
+
- README.md
|
52
|
+
- Rakefile
|
53
|
+
- bin/pindah
|
54
|
+
- lib/pindah.rb
|
55
|
+
- lib/pindah_cli.rb
|
56
|
+
- templates/initial_activity.mirah
|
57
|
+
- templates/build.xml
|
58
|
+
- test/fixtures/HelloWorld.mirah
|
59
|
+
- test/pindah_cli_test.rb
|
60
|
+
has_rdoc: true
|
61
|
+
homepage: http://github.com/mirah/pindah
|
62
|
+
licenses: []
|
63
|
+
|
64
|
+
post_install_message:
|
65
|
+
rdoc_options:
|
66
|
+
- --main
|
67
|
+
- README.md
|
68
|
+
require_paths:
|
69
|
+
- lib
|
70
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: "0"
|
76
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
78
|
+
requirements:
|
79
|
+
- - ">"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 1.3.1
|
82
|
+
requirements: []
|
83
|
+
|
84
|
+
rubyforge_project: pindah
|
85
|
+
rubygems_version: 1.5.0
|
86
|
+
signing_key:
|
87
|
+
specification_version: 3
|
88
|
+
summary: A tool for writing Android applications in Mirah
|
89
|
+
test_files: []
|
90
|
+
|