confetti 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +48 -0
- data/README.md +46 -0
- data/Rakefile +19 -0
- data/bin/confetti +4 -0
- data/confetti.gemspec +29 -0
- data/features/android.feature +14 -0
- data/features/blackberry.feature +9 -0
- data/features/command_line.feature +12 -0
- data/features/ios.feature +9 -0
- data/features/step_definitions/aruba_ext_steps.rb +7 -0
- data/features/support/setup.rb +1 -0
- data/features/symbian.wrt.feature +9 -0
- data/features/webos.feature +9 -0
- data/lib/confetti.rb +31 -0
- data/lib/confetti/cli.rb +19 -0
- data/lib/confetti/config.rb +57 -0
- data/lib/confetti/config/feature.rb +13 -0
- data/lib/confetti/helpers.rb +7 -0
- data/lib/confetti/template.rb +4 -0
- data/lib/confetti/template_helper.rb +28 -0
- data/lib/confetti/templates/android_manifest.mustache +33 -0
- data/lib/confetti/templates/android_manifest.rb +27 -0
- data/lib/confetti/templates/android_strings.mustache +5 -0
- data/lib/confetti/templates/android_strings.rb +13 -0
- data/lib/confetti/templates/base.mustache +0 -0
- data/lib/confetti/templates/base.rb +13 -0
- data/lib/confetti/templates/blackberry_widgets_config.mustache +20 -0
- data/lib/confetti/templates/blackberry_widgets_config.rb +37 -0
- data/lib/confetti/templates/ios_info.mustache +48 -0
- data/lib/confetti/templates/ios_info.rb +21 -0
- data/lib/confetti/templates/java_checks.rb +18 -0
- data/lib/confetti/templates/symbian_wrt_info.mustache +17 -0
- data/lib/confetti/templates/symbian_wrt_info.rb +21 -0
- data/lib/confetti/templates/webos_appinfo.mustache +9 -0
- data/lib/confetti/templates/webos_appinfo.rb +49 -0
- data/lib/confetti/version.rb +3 -0
- data/lib/typedset.rb +23 -0
- data/spec/config/config_author_spec.rb +22 -0
- data/spec/config/config_content_spec.rb +22 -0
- data/spec/config/config_feature_spec.rb +33 -0
- data/spec/config/config_icon_spec.rb +22 -0
- data/spec/config/config_license_spec.rb +17 -0
- data/spec/config/config_name_spec.rb +17 -0
- data/spec/config/config_preference_spec.rb +22 -0
- data/spec/config_spec.rb +217 -0
- data/spec/fixtures/AndroidManifest_expected.xml +33 -0
- data/spec/fixtures/android_manifest_spec.xml +33 -0
- data/spec/fixtures/android_strings_expected.xml +5 -0
- data/spec/fixtures/android_strings_spec.xml +5 -0
- data/spec/fixtures/appinfo_expected.json +9 -0
- data/spec/fixtures/blackberry_widget_config_expected.xml +20 -0
- data/spec/fixtures/blackberry_widget_config_spec.xml +20 -0
- data/spec/fixtures/config.xml +21 -0
- data/spec/fixtures/ios_info_expected.plist +48 -0
- data/spec/fixtures/ios_info_spec.plist +48 -0
- data/spec/fixtures/symbian_wrt_info_expected.plist +17 -0
- data/spec/fixtures/symbian_wrt_info_spec.plist +17 -0
- data/spec/fixtures/webos_appinfo_spec.json +9 -0
- data/spec/helpers_spec.rb +21 -0
- data/spec/integration_spec.rb +66 -0
- data/spec/spec_helper.rb +83 -0
- data/spec/template_spec.rb +4 -0
- data/spec/templates/android_manifest_spec.rb +66 -0
- data/spec/templates/android_strings_spec.rb +56 -0
- data/spec/templates/base_spec.rb +25 -0
- data/spec/templates/blackberry_widget_config_spec.rb +94 -0
- data/spec/templates/ios_info_spec.rb +68 -0
- data/spec/templates/java_checks_spec.rb +59 -0
- data/spec/templates/symbian_wrt_info_spec.rb +68 -0
- data/spec/templates/webos_appinfo_spec.rb +101 -0
- data/spec/typedset_spec.rb +72 -0
- metadata +256 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
module Confetti
|
2
|
+
module Template
|
3
|
+
class AndroidManifest < Base
|
4
|
+
include JavaChecks
|
5
|
+
|
6
|
+
def package_name
|
7
|
+
if @config
|
8
|
+
if is_java_package_id(@config.package)
|
9
|
+
@config.package
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def class_name
|
15
|
+
convert_to_java_identifier(@config.name.name) if @config
|
16
|
+
end
|
17
|
+
|
18
|
+
def output_filename
|
19
|
+
"AndroidManifest.xml"
|
20
|
+
end
|
21
|
+
|
22
|
+
def version
|
23
|
+
@config.version || '0.0.1'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
File without changes
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!-- Widget Configuration Reference: http://docs.blackberry.com/en/developers/deliverables/15274/ -->
|
3
|
+
<widget xmlns="http://www.w3.org/ns/widgets" xmlns:rim="http://www.blackberry.com/ns/widgets"
|
4
|
+
version="{{ widget_version }}"
|
5
|
+
id="{{ widget_id }}">
|
6
|
+
<name>{{ widget_name }}</name>
|
7
|
+
<author href="{{ author_href }}" email="{{ author_email }}">{{ author_name }}</author>
|
8
|
+
<description>{{ widget_description }}</description>
|
9
|
+
<license></license>
|
10
|
+
<feature id="blackberry.system" required="true" version="1.0.0.0"/>
|
11
|
+
<feature id="phonegap" required="false" version="1.0.0"/>
|
12
|
+
<access subdomains="true" uri="file:///store/home"/>
|
13
|
+
<access subdomains="true" uri="file:///SDCard"/>
|
14
|
+
<icon rim:hover="false" src="resources/icon.png"/>
|
15
|
+
<icon rim:hover="true" src="resources/icon_hover.png"/>
|
16
|
+
<content src="index.html"/>
|
17
|
+
<rim:loadingScreen backgroundColor="#000000" foregroundImage="resources/loading_foreground.png" onFirstLaunch="true">
|
18
|
+
<rim:transitionEffect type="fadeOut"/>
|
19
|
+
</rim:loadingScreen>
|
20
|
+
</widget>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Confetti
|
2
|
+
module Template
|
3
|
+
class BlackberryWidgetsConfig < Base
|
4
|
+
def widget_version
|
5
|
+
@config.version
|
6
|
+
end
|
7
|
+
|
8
|
+
def widget_id
|
9
|
+
@config.package
|
10
|
+
end
|
11
|
+
|
12
|
+
def widget_name
|
13
|
+
@config.name.name
|
14
|
+
end
|
15
|
+
|
16
|
+
def author_href
|
17
|
+
@config.author.href
|
18
|
+
end
|
19
|
+
|
20
|
+
def author_email
|
21
|
+
@config.author.email
|
22
|
+
end
|
23
|
+
|
24
|
+
def author_name
|
25
|
+
@config.author.name
|
26
|
+
end
|
27
|
+
|
28
|
+
def widget_description
|
29
|
+
@config.description
|
30
|
+
end
|
31
|
+
|
32
|
+
def output_filename
|
33
|
+
"bb-config.xml"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>CFBundleIconFiles</key>
|
6
|
+
<array>
|
7
|
+
<string>icon.png</string>
|
8
|
+
<string>icon-72.png</string>
|
9
|
+
</array>
|
10
|
+
<key>UISupportedInterfaceOrientations~ipad</key>
|
11
|
+
<array>
|
12
|
+
<string>UIInterfaceOrientationPortrait</string>
|
13
|
+
<string>UIInterfaceOrientationLandscapeLeft</string>
|
14
|
+
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
15
|
+
<string>UIInterfaceOrientationLandscapeRight</string>
|
16
|
+
</array>
|
17
|
+
<key>UISupportedInterfaceOrientations</key>
|
18
|
+
<array>
|
19
|
+
<string>UIInterfaceOrientationPortrait</string>
|
20
|
+
</array>
|
21
|
+
<key>CFBundleDevelopmentRegion</key>
|
22
|
+
<string>English</string>
|
23
|
+
<key>CFBundleDisplayName</key>
|
24
|
+
<string>{{ product_name }}</string>
|
25
|
+
<key>CFBundleExecutable</key>
|
26
|
+
<string>${EXECUTABLE_NAME}</string>
|
27
|
+
<key>CFBundleIconFile</key>
|
28
|
+
<string>icon.png</string>
|
29
|
+
<key>CFBundleIdentifier</key>
|
30
|
+
<string>{{ bundle_identifier }}</string>
|
31
|
+
<key>CFBundleInfoDictionaryVersion</key>
|
32
|
+
<string>6.0</string>
|
33
|
+
<key>CFBundleName</key>
|
34
|
+
<string>{{ product_name }}</string>
|
35
|
+
<key>CFBundlePackageType</key>
|
36
|
+
<string>APPL</string>
|
37
|
+
<key>CFBundleSignature</key>
|
38
|
+
<string>????</string>
|
39
|
+
<key>CFBundleVersion</key>
|
40
|
+
<string>{{ bundle_version }}</string>
|
41
|
+
<key>LSRequiresIPhoneOS</key>
|
42
|
+
<true/>
|
43
|
+
<key>NSMainNibFile</key>
|
44
|
+
<string></string>
|
45
|
+
<key>NSMainNibFile~ipad</key>
|
46
|
+
<string>-iPad</string>
|
47
|
+
</dict>
|
48
|
+
</plist>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Confetti
|
2
|
+
module Template
|
3
|
+
class IosInfo < Base
|
4
|
+
def bundle_identifier
|
5
|
+
@config.package
|
6
|
+
end
|
7
|
+
|
8
|
+
def bundle_version
|
9
|
+
@config.version
|
10
|
+
end
|
11
|
+
|
12
|
+
def product_name
|
13
|
+
@config.name.name
|
14
|
+
end
|
15
|
+
|
16
|
+
def output_filename
|
17
|
+
"Info.plist"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Confetti
|
2
|
+
module Template
|
3
|
+
module JavaChecks
|
4
|
+
def is_java_identifier(str)
|
5
|
+
str.match(/^[a-zA-Z_][a-zA-Z0-9_]*$/)
|
6
|
+
end
|
7
|
+
|
8
|
+
def convert_to_java_identifier(str)
|
9
|
+
str.sub(/^\d/,"_").gsub(/\s/,"").gsub(/[^a-zA-Z0-9_]/,"_")
|
10
|
+
end
|
11
|
+
|
12
|
+
def is_java_package_id(str)
|
13
|
+
# second param to #split ensures can't be dot-terminated
|
14
|
+
str.split('.', -1).all? { |s| is_java_identifier(s) }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Nokia//DTD PLIST 1.0//EN" "http://www.nokia.com/DTDs/plist-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>DisplayName</key>
|
6
|
+
<string>{{ display_name }}</string>
|
7
|
+
<key>Identifier</key>
|
8
|
+
<string>{{ identifier }}</string>
|
9
|
+
<key>Version</key>
|
10
|
+
<string>{{ version }}</string>
|
11
|
+
<key>MainHTML</key>
|
12
|
+
<string>index.html</string>
|
13
|
+
<key>MiniViewEnabled</key>
|
14
|
+
<false/>
|
15
|
+
</dict>
|
16
|
+
</plist>
|
17
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Confetti
|
2
|
+
module Template
|
3
|
+
class SymbianWrtInfo < Base
|
4
|
+
def identifier
|
5
|
+
@config.package
|
6
|
+
end
|
7
|
+
|
8
|
+
def version
|
9
|
+
@config.version
|
10
|
+
end
|
11
|
+
|
12
|
+
def display_name
|
13
|
+
@config.name.name
|
14
|
+
end
|
15
|
+
|
16
|
+
def output_filename
|
17
|
+
"info.plist"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Confetti
|
2
|
+
module Template
|
3
|
+
class WebosAppinfo < Base
|
4
|
+
include JavaChecks
|
5
|
+
|
6
|
+
def app_id
|
7
|
+
if @config
|
8
|
+
if is_java_package_id(@config.package)
|
9
|
+
@config.package
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def app_name
|
15
|
+
@config.name.name
|
16
|
+
end
|
17
|
+
|
18
|
+
def output_filename
|
19
|
+
"appinfo.json"
|
20
|
+
end
|
21
|
+
|
22
|
+
def version
|
23
|
+
if @config.version.nil?
|
24
|
+
'0.0.1'
|
25
|
+
elsif @config.version.match /^(\d)+[.](\d)+[.](\d)+$/
|
26
|
+
@config.version
|
27
|
+
elsif @config.version.match /^((\d)+[.])*(\d)+$/
|
28
|
+
fix_version(@config.version)
|
29
|
+
else
|
30
|
+
fail "need a valid version number of the form 0.0.0"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def vendor
|
35
|
+
@config.author.name
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def fix_version(str)
|
40
|
+
segments = str.split('.')
|
41
|
+
|
42
|
+
segments << '0' if segments.length == 1
|
43
|
+
segments << '0' if segments.length == 2
|
44
|
+
|
45
|
+
segments[0,3].join '.'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/typedset.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require "set"
|
2
|
+
|
3
|
+
# based on RestricedSet from Ruby's stdlib, cf
|
4
|
+
# http://github.com/ruby/ruby/blob/72ef219804e5524848170a197887a95718334e2a/lib/set.rb#L627-717
|
5
|
+
# not sure why it's been commented out
|
6
|
+
# I should follow these things
|
7
|
+
|
8
|
+
class TypedSet < Set
|
9
|
+
attr_reader :klass
|
10
|
+
alias set_class klass
|
11
|
+
|
12
|
+
def initialize (klass, *args)
|
13
|
+
raise ArgumentError, "require a Class object" unless klass.class == Class
|
14
|
+
@klass = klass
|
15
|
+
super args
|
16
|
+
end
|
17
|
+
|
18
|
+
def add o
|
19
|
+
raise ArgumentError, "members must be of class #{@klass}" unless o.class == @klass
|
20
|
+
super o
|
21
|
+
end
|
22
|
+
alias << add
|
23
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Confetti::Config::Author do
|
4
|
+
before do
|
5
|
+
@author = Confetti::Config::Author.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should have a readable and writable name field" do
|
9
|
+
lambda { @author.name = "Andrew Lunny" }.should_not raise_error
|
10
|
+
@author.name.should == "Andrew Lunny"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should have a readable and writable href field" do
|
14
|
+
lambda { @author.href = "http://alunny.github.com" }.should_not raise_error
|
15
|
+
@author.href.should == "http://alunny.github.com"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should have a readable and writable email field" do
|
19
|
+
lambda { @author.email = "alunny@gmail.com" }.should_not raise_error
|
20
|
+
@author.email.should == "alunny@gmail.com"
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Confetti::Config::Content do
|
4
|
+
before do
|
5
|
+
@content = Confetti::Config::Content.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should have a readable and writable src field" do
|
9
|
+
lambda { @content.src = "content.html" }.should_not raise_error
|
10
|
+
@content.src.should == "content.html"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should have a readable and writable type field" do
|
14
|
+
lambda { @content.type = "text/html" }.should_not raise_error
|
15
|
+
@content.type.should == "text/html"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should have a readable and writable encoding field" do
|
19
|
+
lambda { @content.encoding = "GB2313" }.should_not raise_error
|
20
|
+
@content.encoding.should == "GB2313"
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Confetti::Config::Feature do
|
4
|
+
before do
|
5
|
+
@feature = Confetti::Config::Feature.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should have a readable and writable name field" do
|
9
|
+
lambda { @feature.name = "Geolocation" }.should_not raise_error
|
10
|
+
@feature.name.should == "Geolocation"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should have a readable and writable required field" do
|
14
|
+
lambda { @feature.required = true }.should_not raise_error
|
15
|
+
@feature.required.should be_true
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "parameter set" do
|
19
|
+
it "should have a param_set field, that is a TypedSet" do
|
20
|
+
@feature.param_set.should be_a TypedSet
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should make the param_set set typed to Confetti::Config::Feature::Param" do
|
24
|
+
@feature.param_set.set_class.should be Confetti::Config::Feature::Param
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should not allow the param_set to be clobbered" do
|
28
|
+
lambda {
|
29
|
+
@feature.param_set = { :accuracy => 2.0 }
|
30
|
+
}.should raise_error
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Confetti::Config::Icon do
|
4
|
+
before do
|
5
|
+
@icon = Confetti::Config::Icon.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should have a readable and writable src field" do
|
9
|
+
lambda { @icon.src = "icon.png" }.should_not raise_error
|
10
|
+
@icon.src.should == "icon.png"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should have a readable and writable width field" do
|
14
|
+
lambda { @icon.width = 50 }.should_not raise_error
|
15
|
+
@icon.width.should == 50
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should have a readable and writable height field" do
|
19
|
+
lambda { @icon.height = 50 }.should_not raise_error
|
20
|
+
@icon.height.should == 50
|
21
|
+
end
|
22
|
+
end
|