confetti 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +4 -0
  3. data/Gemfile.lock +48 -0
  4. data/README.md +46 -0
  5. data/Rakefile +19 -0
  6. data/bin/confetti +4 -0
  7. data/confetti.gemspec +29 -0
  8. data/features/android.feature +14 -0
  9. data/features/blackberry.feature +9 -0
  10. data/features/command_line.feature +12 -0
  11. data/features/ios.feature +9 -0
  12. data/features/step_definitions/aruba_ext_steps.rb +7 -0
  13. data/features/support/setup.rb +1 -0
  14. data/features/symbian.wrt.feature +9 -0
  15. data/features/webos.feature +9 -0
  16. data/lib/confetti.rb +31 -0
  17. data/lib/confetti/cli.rb +19 -0
  18. data/lib/confetti/config.rb +57 -0
  19. data/lib/confetti/config/feature.rb +13 -0
  20. data/lib/confetti/helpers.rb +7 -0
  21. data/lib/confetti/template.rb +4 -0
  22. data/lib/confetti/template_helper.rb +28 -0
  23. data/lib/confetti/templates/android_manifest.mustache +33 -0
  24. data/lib/confetti/templates/android_manifest.rb +27 -0
  25. data/lib/confetti/templates/android_strings.mustache +5 -0
  26. data/lib/confetti/templates/android_strings.rb +13 -0
  27. data/lib/confetti/templates/base.mustache +0 -0
  28. data/lib/confetti/templates/base.rb +13 -0
  29. data/lib/confetti/templates/blackberry_widgets_config.mustache +20 -0
  30. data/lib/confetti/templates/blackberry_widgets_config.rb +37 -0
  31. data/lib/confetti/templates/ios_info.mustache +48 -0
  32. data/lib/confetti/templates/ios_info.rb +21 -0
  33. data/lib/confetti/templates/java_checks.rb +18 -0
  34. data/lib/confetti/templates/symbian_wrt_info.mustache +17 -0
  35. data/lib/confetti/templates/symbian_wrt_info.rb +21 -0
  36. data/lib/confetti/templates/webos_appinfo.mustache +9 -0
  37. data/lib/confetti/templates/webos_appinfo.rb +49 -0
  38. data/lib/confetti/version.rb +3 -0
  39. data/lib/typedset.rb +23 -0
  40. data/spec/config/config_author_spec.rb +22 -0
  41. data/spec/config/config_content_spec.rb +22 -0
  42. data/spec/config/config_feature_spec.rb +33 -0
  43. data/spec/config/config_icon_spec.rb +22 -0
  44. data/spec/config/config_license_spec.rb +17 -0
  45. data/spec/config/config_name_spec.rb +17 -0
  46. data/spec/config/config_preference_spec.rb +22 -0
  47. data/spec/config_spec.rb +217 -0
  48. data/spec/fixtures/AndroidManifest_expected.xml +33 -0
  49. data/spec/fixtures/android_manifest_spec.xml +33 -0
  50. data/spec/fixtures/android_strings_expected.xml +5 -0
  51. data/spec/fixtures/android_strings_spec.xml +5 -0
  52. data/spec/fixtures/appinfo_expected.json +9 -0
  53. data/spec/fixtures/blackberry_widget_config_expected.xml +20 -0
  54. data/spec/fixtures/blackberry_widget_config_spec.xml +20 -0
  55. data/spec/fixtures/config.xml +21 -0
  56. data/spec/fixtures/ios_info_expected.plist +48 -0
  57. data/spec/fixtures/ios_info_spec.plist +48 -0
  58. data/spec/fixtures/symbian_wrt_info_expected.plist +17 -0
  59. data/spec/fixtures/symbian_wrt_info_spec.plist +17 -0
  60. data/spec/fixtures/webos_appinfo_spec.json +9 -0
  61. data/spec/helpers_spec.rb +21 -0
  62. data/spec/integration_spec.rb +66 -0
  63. data/spec/spec_helper.rb +83 -0
  64. data/spec/template_spec.rb +4 -0
  65. data/spec/templates/android_manifest_spec.rb +66 -0
  66. data/spec/templates/android_strings_spec.rb +56 -0
  67. data/spec/templates/base_spec.rb +25 -0
  68. data/spec/templates/blackberry_widget_config_spec.rb +94 -0
  69. data/spec/templates/ios_info_spec.rb +68 -0
  70. data/spec/templates/java_checks_spec.rb +59 -0
  71. data/spec/templates/symbian_wrt_info_spec.rb +68 -0
  72. data/spec/templates/webos_appinfo_spec.rb +101 -0
  73. data/spec/typedset_spec.rb +72 -0
  74. 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
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <resources>
3
+ <string name="app_name">{{ app_name }}</string>
4
+ <string name="go">Snap</string>
5
+ </resources>
@@ -0,0 +1,13 @@
1
+ module Confetti
2
+ module Template
3
+ class AndroidStrings < Base
4
+ def app_name
5
+ @config.name.name if @config && @config.name
6
+ end
7
+
8
+ def output_filename
9
+ "strings.xml"
10
+ end
11
+ end
12
+ end
13
+ end
File without changes
@@ -0,0 +1,13 @@
1
+ module Confetti
2
+ module Template
3
+ class Base < Mustache
4
+ self.template_path = File.dirname(__FILE__)
5
+
6
+ def initialize (*args)
7
+ @config = args.pop
8
+
9
+ super *args
10
+ end
11
+ end
12
+ end
13
+ end
@@ -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,9 @@
1
+ {
2
+ "id": "{{ app_id }}",
3
+ "version": "{{ version }}",
4
+ "vendor": "{{ vendor }}",
5
+ "type": "web",
6
+ "main": "index.html",
7
+ "title": "{{ app_name }}",
8
+ "icon": "icon.png"
9
+ }
@@ -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
@@ -0,0 +1,3 @@
1
+ module Confetti
2
+ VERSION = "0.1.0"
3
+ 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