strobe 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.
@@ -0,0 +1,12 @@
1
+ class Strobe
2
+ class Error < StandardError; end
3
+
4
+ def self.Error(code)
5
+ Class.new(Error) do
6
+ define_method(:status_code) { code }
7
+ end
8
+ end
9
+
10
+ class AccountError < Error(2); end
11
+ class ApplicationError < Error(3); end
12
+ end
@@ -0,0 +1,94 @@
1
+ class Strobe
2
+ class HTTP
3
+ def signup(email, pass)
4
+ body = {
5
+ :account => {:name => "default"},
6
+ :user => {:email => email, :password => pass}
7
+ }.to_json
8
+
9
+ response = http_request(
10
+ "POST",
11
+ Strobe.settings.url("accounts"),
12
+ {"Content-Type" => "application/json"},
13
+ body
14
+ )
15
+
16
+ # user, account, error
17
+
18
+ json = JSON.parse(response.body)
19
+
20
+ if error = json["error"]
21
+ return nil, nil, error_messages(error)
22
+ else
23
+ user = json["user"] && User.new(json["user"])
24
+ account = json["account"] ? Account.new(json["account"]) : true
25
+ errors = json["errors"] && error_messages(json["errors"])
26
+ return user, account, errors
27
+ end
28
+ end
29
+
30
+ def login(email, pass)
31
+ response = http_request(
32
+ "GET",
33
+ Strobe.settings.url("account"),
34
+ {"Content-Type" => "application/json"}.merge(auth_header(email, pass))
35
+ )
36
+
37
+ json = JSON.parse(response.body)
38
+
39
+ if error = json["error"]
40
+ return nil, nil, "The email and password were invalid"
41
+ else
42
+ user = json["user"] && User.new(json["user"])
43
+ errors = json["errors"] && error_messages(json["errors"])
44
+ return user, nil, errors
45
+ end
46
+ end
47
+
48
+ def deploy(deployment)
49
+ connection, method = Strobe.settings.app_connection_and_method
50
+
51
+ response = connection.request(
52
+ :method => method,
53
+ :headers => auth_header.merge(deployment.headers),
54
+ :body => deployment.body.force_encoding("BINARY")
55
+ )
56
+
57
+ json = JSON.parse(response.body)
58
+
59
+ if error = json["error"]
60
+ return nil, error
61
+ else
62
+ application = json["application"]
63
+ errors = json["errors"] && error_messages(json["errors"])
64
+ return application, errors
65
+ end
66
+ end
67
+
68
+ private
69
+ def http_request(method, uri, headers = {}, body = nil)
70
+ connection = Excon::Connection.new(uri)
71
+ connection.request(:method => method, :headers => headers, :body => body)
72
+ end
73
+
74
+ def auth_header(username=Strobe.settings[:token], password=nil)
75
+ header = "Basic " << ["#{username}:#{password}"].pack("m")
76
+ header.gsub!(/\n/, '')
77
+ {"Authorization" => header}
78
+ end
79
+
80
+ def error_messages(errors)
81
+ messages = []
82
+ errors.each do |k, v|
83
+ if v
84
+ v.each do |field, error|
85
+ messages << " * #{field} #{error}"
86
+ end
87
+ else
88
+ messages << " * #{k}"
89
+ end
90
+ end
91
+ messages.join("\n")
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,13 @@
1
+ require "rack"
2
+
3
+ class Strobe
4
+ class Server < ::Rack::Server
5
+ def initialize(path = nil)
6
+ @path = path
7
+ end
8
+
9
+ def app
10
+ Rack::Directory.new(@path)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,56 @@
1
+ require "excon"
2
+
3
+ class Strobe
4
+ class Settings
5
+ def initialize
6
+ @location = ENV["STROBE_SETTINGS"] || Strobe.config_dir.join("config")
7
+ @local = ENV["STROBE_APP_CONFIG"] || Strobe.local_config_dir.join("config")
8
+ @hash = File.file?(@location) ? YAML.load(@location) : {}
9
+ @local_hash = File.file?(@local) ? YAML.load(@local) : {}
10
+ end
11
+
12
+ def [](key)
13
+ ENV[key_for(key)] || @local_hash[key_for(key)] || @hash[key_for(key)]
14
+ end
15
+
16
+ def []=(key, value)
17
+ @hash[key_for(key)] = value
18
+ File.open(@location, "wb") { |file| file.puts @hash.to_yaml }
19
+ value
20
+ end
21
+
22
+ def set_local(key, value)
23
+ @local_hash[key_for(key)] = value
24
+ File.open(@local, "wb") { |file| file.puts @local_hash.to_yaml }
25
+ end
26
+
27
+ def url(path)
28
+ self["url"] ||= "http://api.strobeapp.com/"
29
+ self["url"] + path
30
+ end
31
+
32
+ def auth_header(username=self[:token], password=nil)
33
+ header = "Basic " << ["#{username}:#{password}"].pack("m")
34
+ header.gsub!(/\n/, '')
35
+ {"Authorization" => header}
36
+ end
37
+
38
+ def app_connection_and_method
39
+ app_url = url("applications")
40
+
41
+ if application = self[:application]
42
+ app_url << "/#{application["id"]}"
43
+ method = "PUT"
44
+ else
45
+ method = "POST"
46
+ end
47
+
48
+ return Excon::Connection.new(app_url), method
49
+ end
50
+
51
+ private
52
+ def key_for(key)
53
+ "STROBE_#{key.to_s.upcase}"
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,81 @@
1
+ require "highline"
2
+
3
+ class Strobe
4
+ module UI
5
+ class Basic
6
+ def debug(msg)
7
+ puts msg
8
+ end
9
+
10
+ def info(msg)
11
+ puts msg
12
+ end
13
+
14
+ def confirm(msg)
15
+ puts msg
16
+ end
17
+
18
+ def warn(msg)
19
+ puts msg
20
+ end
21
+
22
+ def error(msg)
23
+ puts msg
24
+ end
25
+
26
+ def highline
27
+ @highline ||= HighLine.new
28
+ end
29
+
30
+ def password(message)
31
+ highline.ask(message) do |q|
32
+ next unless STDIN.tty?
33
+ q.echo = "*"
34
+ end
35
+ rescue EOFError
36
+ ''
37
+ end
38
+
39
+ def ask(message)
40
+ highline.ask(message) do |q|
41
+ next unless STDIN.tty?
42
+ q.readline = true
43
+ end
44
+ rescue EOFError
45
+ ''
46
+ end
47
+ end
48
+
49
+ class Shell < Basic
50
+ def initialize(shell)
51
+ @shell = shell
52
+ @quiet = false
53
+ end
54
+
55
+ def debug(msg)
56
+ @shell.say(msg) if ENV['DEBUG'] && !@quiet
57
+ end
58
+
59
+ def info(msg)
60
+ @shell.say(msg) if !@quiet
61
+ end
62
+
63
+ def confirm(msg)
64
+ @shell.say(msg, :green) if !@quiet
65
+ end
66
+
67
+ def warn(msg)
68
+ @shell.say(msg, :yellow)
69
+ end
70
+
71
+ def error(msg)
72
+ @shell.say(msg, :red)
73
+ end
74
+
75
+ def be_quiet!
76
+ @quiet = true
77
+ end
78
+ end
79
+ end
80
+ end
81
+
@@ -0,0 +1,9 @@
1
+ class Strobe
2
+ class User
3
+ attr_reader :token
4
+
5
+ def initialize(json)
6
+ @token = json["authentication_token"]
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ class Strobe
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,35 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "strobe/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "strobe"
7
+ s.version = Strobe::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Yehuda Katz", "Carl Lerche"]
10
+ s.email = ["wycats@strobecorp.com", "carllerche@strobecorp.com"]
11
+ s.homepage = "http://rubygems.org/gems/strobe"
12
+ s.summary = "A deployment tool for HTML5 applications"
13
+ s.description = "The client library for deploying applications to Strobe's HTML5 deployment platform"
14
+
15
+ s.required_rubygems_version = ">= 1.3.6"
16
+ s.rubyforge_project = "strobe"
17
+
18
+ s.add_runtime_dependency "thor", "~> 0.14.1"
19
+ s.add_runtime_dependency "rack", "~> 1.2.1"
20
+ s.add_runtime_dependency "highline", "~> 1.6.1"
21
+ s.add_runtime_dependency "excon", "~> 0.2.2"
22
+ s.add_runtime_dependency "mime-types", "= 1.16"
23
+ s.add_runtime_dependency "activesupport", "~> 3.0.0"
24
+
25
+ s.add_development_dependency "rake"
26
+ s.add_development_dependency "rspec", "~> 2.0.0"
27
+ s.add_development_dependency "childlabor", "0.0.3"
28
+ s.add_development_dependency "cucumber"
29
+ s.add_development_dependency "prawn"
30
+
31
+ s.files = `git ls-files`.split("\n")
32
+ s.executables = `git ls-files bin`.split("\n").map{ |file| File.basename(file) }
33
+ s.require_path = 'lib'
34
+ end
35
+
metadata ADDED
@@ -0,0 +1,250 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: strobe
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Yehuda Katz
13
+ - Carl Lerche
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-10-14 00:00:00 -07:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: thor
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ segments:
30
+ - 0
31
+ - 14
32
+ - 1
33
+ version: 0.14.1
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: rack
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ segments:
45
+ - 1
46
+ - 2
47
+ - 1
48
+ version: 1.2.1
49
+ type: :runtime
50
+ version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ name: highline
53
+ prerelease: false
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ~>
58
+ - !ruby/object:Gem::Version
59
+ segments:
60
+ - 1
61
+ - 6
62
+ - 1
63
+ version: 1.6.1
64
+ type: :runtime
65
+ version_requirements: *id003
66
+ - !ruby/object:Gem::Dependency
67
+ name: excon
68
+ prerelease: false
69
+ requirement: &id004 !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ~>
73
+ - !ruby/object:Gem::Version
74
+ segments:
75
+ - 0
76
+ - 2
77
+ - 2
78
+ version: 0.2.2
79
+ type: :runtime
80
+ version_requirements: *id004
81
+ - !ruby/object:Gem::Dependency
82
+ name: mime-types
83
+ prerelease: false
84
+ requirement: &id005 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - "="
88
+ - !ruby/object:Gem::Version
89
+ segments:
90
+ - 1
91
+ - 16
92
+ version: "1.16"
93
+ type: :runtime
94
+ version_requirements: *id005
95
+ - !ruby/object:Gem::Dependency
96
+ name: activesupport
97
+ prerelease: false
98
+ requirement: &id006 !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ segments:
104
+ - 3
105
+ - 0
106
+ - 0
107
+ version: 3.0.0
108
+ type: :runtime
109
+ version_requirements: *id006
110
+ - !ruby/object:Gem::Dependency
111
+ name: rake
112
+ prerelease: false
113
+ requirement: &id007 !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ segments:
119
+ - 0
120
+ version: "0"
121
+ type: :development
122
+ version_requirements: *id007
123
+ - !ruby/object:Gem::Dependency
124
+ name: rspec
125
+ prerelease: false
126
+ requirement: &id008 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ segments:
132
+ - 2
133
+ - 0
134
+ - 0
135
+ version: 2.0.0
136
+ type: :development
137
+ version_requirements: *id008
138
+ - !ruby/object:Gem::Dependency
139
+ name: childlabor
140
+ prerelease: false
141
+ requirement: &id009 !ruby/object:Gem::Requirement
142
+ none: false
143
+ requirements:
144
+ - - "="
145
+ - !ruby/object:Gem::Version
146
+ segments:
147
+ - 0
148
+ - 0
149
+ - 3
150
+ version: 0.0.3
151
+ type: :development
152
+ version_requirements: *id009
153
+ - !ruby/object:Gem::Dependency
154
+ name: cucumber
155
+ prerelease: false
156
+ requirement: &id010 !ruby/object:Gem::Requirement
157
+ none: false
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ segments:
162
+ - 0
163
+ version: "0"
164
+ type: :development
165
+ version_requirements: *id010
166
+ - !ruby/object:Gem::Dependency
167
+ name: prawn
168
+ prerelease: false
169
+ requirement: &id011 !ruby/object:Gem::Requirement
170
+ none: false
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ segments:
175
+ - 0
176
+ version: "0"
177
+ type: :development
178
+ version_requirements: *id011
179
+ description: The client library for deploying applications to Strobe's HTML5 deployment platform
180
+ email:
181
+ - wycats@strobecorp.com
182
+ - carllerche@strobecorp.com
183
+ executables:
184
+ - strobe
185
+ extensions: []
186
+
187
+ extra_rdoc_files: []
188
+
189
+ files:
190
+ - .gitignore
191
+ - Gemfile
192
+ - Gemfile.lock
193
+ - Rakefile
194
+ - bin/strobe
195
+ - features/1_sign_up.feature
196
+ - features/2_deploying.feature
197
+ - features/3_deploying_sproutcore_apps.feature
198
+ - features/step_definitions/cli_steps.rb
199
+ - features/step_definitions/deploying_steps.rb
200
+ - features/step_definitions/sign_up.rb
201
+ - features/support/helpers.rb
202
+ - features/support/strobe.rb
203
+ - lib/strobe.rb
204
+ - lib/strobe/account.rb
205
+ - lib/strobe/cli.rb
206
+ - lib/strobe/deploy.rb
207
+ - lib/strobe/errors.rb
208
+ - lib/strobe/http.rb
209
+ - lib/strobe/server.rb
210
+ - lib/strobe/settings.rb
211
+ - lib/strobe/ui.rb
212
+ - lib/strobe/user.rb
213
+ - lib/strobe/version.rb
214
+ - strobe.gemspec
215
+ has_rdoc: true
216
+ homepage: http://rubygems.org/gems/strobe
217
+ licenses: []
218
+
219
+ post_install_message:
220
+ rdoc_options: []
221
+
222
+ require_paths:
223
+ - lib
224
+ required_ruby_version: !ruby/object:Gem::Requirement
225
+ none: false
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ segments:
230
+ - 0
231
+ version: "0"
232
+ required_rubygems_version: !ruby/object:Gem::Requirement
233
+ none: false
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ segments:
238
+ - 1
239
+ - 3
240
+ - 6
241
+ version: 1.3.6
242
+ requirements: []
243
+
244
+ rubyforge_project: strobe
245
+ rubygems_version: 1.3.7
246
+ signing_key:
247
+ specification_version: 3
248
+ summary: A deployment tool for HTML5 applications
249
+ test_files: []
250
+