eris 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/.rspec +2 -0
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/README.md +2 -0
- data/Rakefile +2 -0
- data/bin/eris +5 -0
- data/eris.gemspec +36 -0
- data/js_helpers/ErisHelpers.js +84 -0
- data/lib/eris.rb +22 -0
- data/lib/eris/eris.ru +3 -0
- data/lib/eris/lib/eris_config.rb +17 -0
- data/lib/eris/lib/jasmine_config_overrides.rb +43 -0
- data/lib/eris/lib/jasmine_rspec_runner.rb +34 -0
- data/lib/eris/lib/luna_request.rb +51 -0
- data/lib/eris/lib/proxied_request.rb +18 -0
- data/lib/eris/lib/server.rb +75 -0
- data/lib/eris/tasks/generate.rb +19 -0
- data/lib/eris/tasks/server.rb +14 -0
- data/lib/eris/templates/Gemfile +5 -0
- data/lib/eris/templates/Rakefile +32 -0
- data/lib/eris/templates/ci_build.sh +16 -0
- data/lib/eris/templates/eris_config.json +3 -0
- data/lib/eris/templates/jasmine.yml +77 -0
- data/lib/eris/templates/sampleSpec.js +13 -0
- data/lib/eris/templates/specHelper.js +3 -0
- data/lib/eris/version.rb +3 -0
- data/spec/fixtures/enyo/0.10/framework/enyo.js +1 -0
- data/spec/fixtures/sample_app/app/models/foo.js +1 -0
- data/spec/fixtures/sample_app/appinfo.json +10 -0
- data/spec/fixtures/sample_app/eris_config.json +3 -0
- data/spec/fixtures/sample_app/index.html.erb +20 -0
- data/spec/fixtures/sample_app/spec/acceptance/helpers/AppHelper.js +0 -0
- data/spec/fixtures/vcr_cassettes/failure.yml +34 -0
- data/spec/fixtures/vcr_cassettes/success.yml +62 -0
- data/spec/lib/eris/lib/eris_config_spec.rb +25 -0
- data/spec/lib/eris/lib/eris_spec.rb +7 -0
- data/spec/lib/eris/lib/luna_request_spec.rb +27 -0
- data/spec/lib/eris/lib/proxied_request_spec.rb +19 -0
- data/spec/lib/eris/lib/server_spec.rb +175 -0
- data/spec/lib/eris/tasks/generator_integration_spec.rb +38 -0
- data/spec/lib/eris/tasks/generator_spec.rb +90 -0
- data/spec/lib/eris/tasks/server_spec.rb +44 -0
- data/spec/spec_helper.rb +41 -0
- metadata +309 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use ruby-1.8.7-p174@eris --create
|
data/Gemfile
ADDED
data/README.md
ADDED
data/Rakefile
ADDED
data/bin/eris
ADDED
data/eris.gemspec
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require File.dirname(__FILE__) + "/lib/eris/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "eris"
|
7
|
+
s.version = Eris::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["HP webOS", "Pivotal Labs"]
|
10
|
+
s.email = ["pair@pivotallabs.com"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = %q{Eris is a gem to help test driving webOS Enyo application development}
|
13
|
+
s.description = %q{}
|
14
|
+
|
15
|
+
s.rubyforge_project = "eris"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_dependency "rack"
|
23
|
+
s.add_dependency "json"
|
24
|
+
s.add_dependency "sinatra"
|
25
|
+
s.add_dependency "erubis"
|
26
|
+
s.add_dependency "thor"
|
27
|
+
s.add_dependency "curb"
|
28
|
+
|
29
|
+
s.add_development_dependency "rspec"
|
30
|
+
s.add_development_dependency "rack-test"
|
31
|
+
s.add_development_dependency "fuubar"
|
32
|
+
s.add_development_dependency "nokogiri"
|
33
|
+
s.add_development_dependency "vcr"
|
34
|
+
s.add_development_dependency "webmock"
|
35
|
+
s.add_development_dependency "rake"
|
36
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
// simulates an application relaunch
|
2
|
+
var relaunchWithParams = function(launchParams) {
|
3
|
+
// stubs for what Enyo expects when running in browser
|
4
|
+
window.PalmSystem = {
|
5
|
+
stageReady: function() {
|
6
|
+
},
|
7
|
+
setWindowOrientation: function() {
|
8
|
+
}
|
9
|
+
};
|
10
|
+
|
11
|
+
PalmSystem.launchParams = decodeURIComponent(launchParams);
|
12
|
+
Mojo.relaunch();
|
13
|
+
};
|
14
|
+
|
15
|
+
// Proxy all calls to palm:// and luna:// via novacom
|
16
|
+
|
17
|
+
var NovacomRequest = enyo.kind({
|
18
|
+
name: NovacomRequest,
|
19
|
+
kind: enyo.PalmService.Request,
|
20
|
+
|
21
|
+
call: function() {
|
22
|
+
var p = this.params || {};
|
23
|
+
console.log("==> CALLING AJAX <== " + JSON.stringify(p));
|
24
|
+
|
25
|
+
var lunaRequest = encodeURIComponent(enyo.json.stringify({
|
26
|
+
url: this.service + this.method,
|
27
|
+
body: p
|
28
|
+
}));
|
29
|
+
|
30
|
+
enyo.xhr.request({
|
31
|
+
url: '/luna?req=' + lunaRequest,
|
32
|
+
callback: enyo.hitch(this, "receive")
|
33
|
+
});
|
34
|
+
},
|
35
|
+
|
36
|
+
setResponse: function(a) {
|
37
|
+
console.error(a);
|
38
|
+
this.inherited(arguments);
|
39
|
+
},
|
40
|
+
|
41
|
+
createBridge: enyo.nop,
|
42
|
+
destroy: enyo.nop
|
43
|
+
|
44
|
+
});
|
45
|
+
|
46
|
+
if (!window.PalmSystem) {
|
47
|
+
enyo.PalmService.prototype.requestKind = "NovacomRequest";
|
48
|
+
enyo.DbService.prototype.requestKind = "NovacomRequest";
|
49
|
+
}
|
50
|
+
var logApiFailures = false;
|
51
|
+
|
52
|
+
|
53
|
+
// Proxy all XHRs to external APIs
|
54
|
+
|
55
|
+
var ProxiedRequest = enyo.kind({
|
56
|
+
name: ProxiedRequest,
|
57
|
+
kind: enyo.PalmService.Request,
|
58
|
+
|
59
|
+
call: function() {
|
60
|
+
var p = this.params || {};
|
61
|
+
console.log("==> PROXYING AJAX to " + this.url + " <== " + JSON.stringify(p));
|
62
|
+
|
63
|
+
var newRequest = encodeURIComponent(enyo.json.stringify({
|
64
|
+
url: this.url,
|
65
|
+
body: p
|
66
|
+
}));
|
67
|
+
|
68
|
+
enyo.xhr.request({
|
69
|
+
url: '/xhrproxy?req=' + newRequest,
|
70
|
+
callback: enyo.hitch(this, "receive")
|
71
|
+
});
|
72
|
+
},
|
73
|
+
|
74
|
+
setResponse: function(a) {
|
75
|
+
console.error(a);
|
76
|
+
this.inherited(arguments);
|
77
|
+
},
|
78
|
+
|
79
|
+
createBridge: enyo.nop,
|
80
|
+
destroy: enyo.nop
|
81
|
+
});
|
82
|
+
|
83
|
+
// For Test: inject test-only state before Enyo loads
|
84
|
+
window.development = true;
|
data/lib/eris.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
excluded_files = [
|
2
|
+
"/eris/lib/jasmine_config_overrides.rb",
|
3
|
+
"/eris/lib/jasmine_rspec_runner.rb"
|
4
|
+
].map { |file| File.dirname(__FILE__) + file }
|
5
|
+
|
6
|
+
Dir[File.dirname(__FILE__) + "/eris/**/*.rb"].each do |file|
|
7
|
+
require file[0..-4] unless excluded_files.include?(file)
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'thor'
|
11
|
+
require 'curb'
|
12
|
+
require 'pathname'
|
13
|
+
|
14
|
+
module Eris
|
15
|
+
class Tasks < Thor
|
16
|
+
include Thor::Actions
|
17
|
+
@@source_root = File.join(File.dirname(__FILE__), '..')
|
18
|
+
source_root File.join(File.dirname(__FILE__), '..')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
Eris::FILE_PATH = File.expand_path(File.dirname(__FILE__))
|
data/lib/eris/eris.ru
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'pathname'
|
3
|
+
|
4
|
+
class ErisConfig
|
5
|
+
def initialize(opts)
|
6
|
+
@config_hash = JSON.parse(File.read(opts[:config_path]))
|
7
|
+
@app_root = opts[:app_root]
|
8
|
+
end
|
9
|
+
|
10
|
+
def enyo_root
|
11
|
+
if Pathname.new(@config_hash['enyoRoot']).absolute?
|
12
|
+
@config_hash['enyoRoot']
|
13
|
+
else
|
14
|
+
File.join(@app_root, @config_hash['enyoRoot'])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'eris/lib/eris_config'
|
2
|
+
|
3
|
+
module Jasmine
|
4
|
+
class Config
|
5
|
+
def src_files
|
6
|
+
if simple_config['src_files']
|
7
|
+
p match_files(src_dir, simple_config['src_files']) + ["usr/palm/frameworks/enyo/0.10/framework/enyo.js"]
|
8
|
+
match_files(src_dir, simple_config['src_files']) + ["usr/palm/frameworks/enyo/0.10/framework/enyo.js"]
|
9
|
+
else
|
10
|
+
[]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def simple_config_file
|
15
|
+
File.join(project_root, 'spec/unit/support/jasmine.yml')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
module Jasmine
|
21
|
+
def self.app(config)
|
22
|
+
Rack::Builder.app do
|
23
|
+
use Rack::Head
|
24
|
+
|
25
|
+
map('/run.html') { run Jasmine::Redirect.new('/') }
|
26
|
+
map('/__suite__') { run Jasmine::FocusedSuite.new(config) }
|
27
|
+
|
28
|
+
map('/__JASMINE_ROOT__') { run Rack::File.new(Jasmine.root) }
|
29
|
+
map(config.spec_path) { run Rack::File.new(config.spec_dir) }
|
30
|
+
map(config.root_path) { run Rack::File.new(config.project_root) }
|
31
|
+
eris_config = ErisConfig.new(:config_path => 'eris_config.json', :app_root => config.project_root)
|
32
|
+
|
33
|
+
map("/usr/palm/frameworks") { run Rack::File.new(eris_config.enyo_root) }
|
34
|
+
|
35
|
+
map('/') do
|
36
|
+
run Rack::Cascade.new([
|
37
|
+
Rack::URLMap.new('/' => Rack::File.new(config.src_dir)),
|
38
|
+
Jasmine::RunAdapter.new(config)
|
39
|
+
])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
$:.unshift(ENV['JASMINE_GEM_PATH']) if ENV['JASMINE_GEM_PATH'] # for gem testing purposes
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'jasmine'
|
5
|
+
require 'eris/lib/jasmine_config_overrides'
|
6
|
+
if Jasmine::rspec2?
|
7
|
+
require 'rspec'
|
8
|
+
else
|
9
|
+
require 'spec'
|
10
|
+
end
|
11
|
+
|
12
|
+
jasmine_config = Jasmine::Config.new
|
13
|
+
|
14
|
+
|
15
|
+
spec_builder = Jasmine::SpecBuilder.new(jasmine_config)
|
16
|
+
|
17
|
+
should_stop = false
|
18
|
+
|
19
|
+
if Jasmine::rspec2?
|
20
|
+
RSpec.configuration.after(:suite) do
|
21
|
+
spec_builder.stop if should_stop
|
22
|
+
end
|
23
|
+
else
|
24
|
+
Spec::Runner.configure do |config|
|
25
|
+
config.after(:suite) do
|
26
|
+
spec_builder.stop if should_stop
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
spec_builder.start
|
33
|
+
should_stop = true
|
34
|
+
spec_builder.declare_suites
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Eris
|
4
|
+
class LunaRequest
|
5
|
+
|
6
|
+
attr_reader :service
|
7
|
+
|
8
|
+
def initialize(options)
|
9
|
+
@service = options["url"]
|
10
|
+
@body = JSON.generate(options["body"])
|
11
|
+
end
|
12
|
+
|
13
|
+
def params
|
14
|
+
param_str = @body.dup
|
15
|
+
param_str.gsub!('\\n') { '\\\\\\n' } # Yes, this escapes NEWLINES (block form needed)
|
16
|
+
param_str.gsub!(' ', '\\ ') # escape spaces
|
17
|
+
param_str.gsub!(/'/) { %q('\\\\\'') } # escape single quotes (block form needed)
|
18
|
+
param_str
|
19
|
+
end
|
20
|
+
|
21
|
+
def url
|
22
|
+
"novacom run file://usr/bin/luna-send -- -n 1 -a com.palm.configurator -i #{@service} '#{params}'"
|
23
|
+
end
|
24
|
+
|
25
|
+
def execute
|
26
|
+
@luna_response = `#{url}`
|
27
|
+
# log_request
|
28
|
+
log_bad_json
|
29
|
+
@luna_response
|
30
|
+
end
|
31
|
+
|
32
|
+
def log_request
|
33
|
+
puts "\n\n====> BODY PARAMS <===="
|
34
|
+
pp @body
|
35
|
+
puts "\n\n====> NOVACOM REQUEST <===="
|
36
|
+
puts "Sending #{url}"
|
37
|
+
puts "\n\n====> NOVACOM RESPONSE <===="
|
38
|
+
puts @luna_response
|
39
|
+
end
|
40
|
+
|
41
|
+
def log_bad_json
|
42
|
+
begin
|
43
|
+
JSON.parse(@luna_response)
|
44
|
+
rescue
|
45
|
+
puts "BAD JSON FROM LUNA"
|
46
|
+
puts "Request: #{url}"
|
47
|
+
puts "Respose: #{@luna_response}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Eris
|
2
|
+
class ProxiedRequest
|
3
|
+
def initialize(params)
|
4
|
+
@url = params["url"]
|
5
|
+
@body = params["body"]
|
6
|
+
end
|
7
|
+
|
8
|
+
def url
|
9
|
+
query_params = @body.collect {|k,v| "#{URI.encode(k.to_s)}=#{URI.encode(v.to_s)}" }.join('&')
|
10
|
+
"#{@url}?#{query_params}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute
|
14
|
+
response = Curl::Easy.perform(url)
|
15
|
+
[response.body_str, response.response_code]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'sinatra'
|
3
|
+
require 'erb'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
module Eris
|
7
|
+
class Server < Sinatra::Base
|
8
|
+
JS_HELPER_PATH = File.dirname(__FILE__) + '/../../../js_helpers/'
|
9
|
+
|
10
|
+
def initialize(path=Dir.pwd)
|
11
|
+
@path = path
|
12
|
+
settings.views = path
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
Tilt.register :erb, Tilt[:erubis]
|
17
|
+
enable :raise_errors
|
18
|
+
disable :show_exceptions
|
19
|
+
|
20
|
+
['/', '/index.html'].each do |route|
|
21
|
+
get route do
|
22
|
+
app_info = JSON.parse(File.read(File.join(@path, 'appinfo.json')))
|
23
|
+
|
24
|
+
locals = {
|
25
|
+
:app_title => app_info["title"],
|
26
|
+
:eris_helper_tags => '<script src="eris-helpers/ErisHelpers.js" type="text/javascript" eris-helpers=true></script>',
|
27
|
+
:app_helper_tag => nil,
|
28
|
+
:launch_params => params['launchParams']
|
29
|
+
}
|
30
|
+
|
31
|
+
app_helper = File.join('spec', 'acceptance', 'helpers', 'AppHelper.js')
|
32
|
+
if File.exist?(File.join(@path, app_helper))
|
33
|
+
locals[:app_helper_tag] = %Q{<script src="#{app_helper}" type="text/javascript" app-helper=true></script>}
|
34
|
+
end
|
35
|
+
|
36
|
+
erb :'index.html', :locals => locals
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
get '/luna*' do
|
41
|
+
req = JSON.parse(params[:req])
|
42
|
+
if req["url"] =~ /getCurrentPosition/
|
43
|
+
'{"altitude":-10000000,"errorCode":0,"heading":0,"horizAccuracy":-1,"latitude":37.392809,"longitude":-122.040461,"returnValue":true,"timestamp":1307557148000,"velocity":-1,"vertAccuracy":-1}'
|
44
|
+
else
|
45
|
+
LunaRequest.new(req).execute
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
get '/xhrproxy*' do
|
50
|
+
response, status_code = ProxiedRequest.new(JSON.parse(params[:req])).execute
|
51
|
+
status status_code
|
52
|
+
response
|
53
|
+
end
|
54
|
+
|
55
|
+
get '/eris-helpers/*' do
|
56
|
+
serve_static_files_from(JS_HELPER_PATH, params[:splat].first)
|
57
|
+
end
|
58
|
+
|
59
|
+
get '/usr/palm/frameworks/*' do
|
60
|
+
config = ErisConfig.new(:config_path => File.join(@path, 'eris_config.json'), :app_root => @path)
|
61
|
+
serve_static_files_from(config.enyo_root, params[:splat].first)
|
62
|
+
end
|
63
|
+
|
64
|
+
get '*' do
|
65
|
+
serve_static_files_from(@path, params[:splat].first)
|
66
|
+
end
|
67
|
+
|
68
|
+
def serve_static_files_from(path, filename)
|
69
|
+
path_to_static_file = File.expand_path(path + unescape(filename))
|
70
|
+
|
71
|
+
env['sinatra.static_file'] = path_to_static_file
|
72
|
+
send_file path_to_static_file, :disposition => nil
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'thor'
|
2
|
+
|
3
|
+
module Eris
|
4
|
+
class Tasks < Thor
|
5
|
+
desc "generate", "generate an enyo application"
|
6
|
+
def generate
|
7
|
+
template "lib/eris/templates/Gemfile",'Gemfile'
|
8
|
+
template "lib/eris/templates/Rakefile",'Rakefile'
|
9
|
+
template "lib/eris/templates/jasmine.yml", "spec/unit/support/jasmine.yml"
|
10
|
+
template "lib/eris/templates/sampleSpec.js", "spec/unit/source/sampleSpec.js"
|
11
|
+
create_file ".rvmrc", "rvm use ruby-1.9.2-p180@palm"
|
12
|
+
template "lib/eris/templates/ci_build.sh", "ci_build.sh"
|
13
|
+
chmod "ci_build.sh", 0755
|
14
|
+
template "lib/eris/templates/eris_config.json", "eris_config.json"
|
15
|
+
empty_directory "spec/unit/source/mock"
|
16
|
+
template "lib/eris/templates/specHelper.js", "spec/unit/specHelper.js"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|