strobe 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/strobe +2 -12
- data/lib/strobe.rb +35 -88
- data/lib/strobe/association.rb +86 -0
- data/lib/strobe/cli.rb +39 -53
- data/lib/strobe/cli/action.rb +131 -0
- data/lib/strobe/cli/actions.rb +103 -0
- data/lib/strobe/cli/settings.rb +62 -0
- data/lib/strobe/collection.rb +53 -0
- data/lib/strobe/connection.rb +91 -0
- data/lib/strobe/resource/base.rb +235 -0
- data/lib/strobe/resource/collection.rb +50 -0
- data/lib/strobe/resource/singleton.rb +18 -0
- data/lib/strobe/resources/account.rb +12 -0
- data/lib/strobe/resources/application.rb +129 -0
- data/lib/strobe/resources/me.rb +11 -0
- data/lib/strobe/resources/signup.rb +27 -0
- data/lib/strobe/resources/team.rb +13 -0
- data/lib/strobe/resources/user.rb +11 -0
- data/lib/strobe/validations.rb +118 -0
- metadata +50 -124
- data/.gitignore +0 -5
- data/Gemfile +0 -4
- data/Gemfile.lock +0 -69
- data/Rakefile +0 -36
- data/features/1_sign_up.feature +0 -16
- data/features/2_deploying.feature +0 -35
- data/features/3_deploying_sproutcore_apps.feature +0 -19
- data/features/step_definitions/cli_steps.rb +0 -8
- data/features/step_definitions/deploying_steps.rb +0 -58
- data/features/step_definitions/sign_up.rb +0 -74
- data/features/support/helpers.rb +0 -104
- data/features/support/strobe.rb +0 -57
- data/lib/strobe/account.rb +0 -67
- data/lib/strobe/deploy.rb +0 -131
- data/lib/strobe/errors.rb +0 -12
- data/lib/strobe/http.rb +0 -94
- data/lib/strobe/server.rb +0 -13
- data/lib/strobe/settings.rb +0 -56
- data/lib/strobe/ui.rb +0 -81
- data/lib/strobe/user.rb +0 -9
- data/lib/strobe/version.rb +0 -3
- data/strobe.gemspec +0 -35
@@ -0,0 +1,50 @@
|
|
1
|
+
module Strobe
|
2
|
+
module Resource
|
3
|
+
module Collection
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
include Base
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
include Enumerable
|
9
|
+
|
10
|
+
def each
|
11
|
+
collection.each { |r| yield r }
|
12
|
+
end
|
13
|
+
|
14
|
+
def singular_resource_name
|
15
|
+
base_const_name.underscore
|
16
|
+
end
|
17
|
+
|
18
|
+
def resource_name
|
19
|
+
singular_resource_name.pluralize
|
20
|
+
end
|
21
|
+
|
22
|
+
def resource_uri
|
23
|
+
uri_prefix
|
24
|
+
end
|
25
|
+
|
26
|
+
def collection
|
27
|
+
Strobe::Collection.new(self)
|
28
|
+
end
|
29
|
+
|
30
|
+
alias all collection
|
31
|
+
|
32
|
+
def get(id, opts = {})
|
33
|
+
inst = new :id => id
|
34
|
+
inst.reload unless opts[:lazy]
|
35
|
+
inst
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def id
|
40
|
+
self[:id]
|
41
|
+
end
|
42
|
+
|
43
|
+
def reload
|
44
|
+
resp = Strobe.connection.get "#{self.class.resource_uri}/#{id}"
|
45
|
+
self.params = resp.body[self.class.singular_resource_name]
|
46
|
+
self
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Strobe
|
2
|
+
module Resource
|
3
|
+
module Singleton
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
include Base
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
def resource_name
|
9
|
+
base_const_name.underscore
|
10
|
+
end
|
11
|
+
|
12
|
+
alias singular_resource_name resource_name
|
13
|
+
end
|
14
|
+
|
15
|
+
# stuff
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'mime/types'
|
2
|
+
|
3
|
+
module Strobe
|
4
|
+
module Resources
|
5
|
+
class Application
|
6
|
+
include Resource::Collection
|
7
|
+
|
8
|
+
has 1, :account
|
9
|
+
has n, :teams
|
10
|
+
has n, :users
|
11
|
+
|
12
|
+
filter :path
|
13
|
+
|
14
|
+
validates "account", "name", "url", :presence => true
|
15
|
+
validates "path", :presence => true, :with => :ensure_sane_application_path,
|
16
|
+
:skippable => false
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def ensure_sane_application_path
|
21
|
+
if self[:path] && Dir["#{self[:path]}/**/*"].empty?
|
22
|
+
errors.add('path', 'is not a sane application directory')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def create
|
27
|
+
multipart = build_multipart_request
|
28
|
+
connection.post http_uri, multipart.body, multipart.headers
|
29
|
+
end
|
30
|
+
|
31
|
+
def update
|
32
|
+
multipart = build_multipart_request
|
33
|
+
connection.put http_uri, multipart.body, multipart.headers
|
34
|
+
end
|
35
|
+
|
36
|
+
def build_multipart_request
|
37
|
+
Dir.chdir self[:path] do
|
38
|
+
Multipart.new request_params do |m|
|
39
|
+
Dir["**/*"].each do |filename|
|
40
|
+
next unless File.file?(filename)
|
41
|
+
|
42
|
+
mime_type = MIME::Types.type_for(filename).first
|
43
|
+
mime_type ||= "application/octet-stream"
|
44
|
+
|
45
|
+
m.file filename, mime_type.to_s, File.read(filename)
|
46
|
+
end
|
47
|
+
|
48
|
+
picked_root_app = false
|
49
|
+
|
50
|
+
Dir["static/*"].each do |appdir|
|
51
|
+
next if File.file?(appdir)
|
52
|
+
|
53
|
+
app_name = File.basename(appdir)
|
54
|
+
index = Dir["#{appdir}/*/*/index.html"].first
|
55
|
+
|
56
|
+
next unless index && File.file?(index)
|
57
|
+
|
58
|
+
manifest = "#{File.dirname(index)}/app.manifest"
|
59
|
+
manifest = File.read(manifest) if File.file?(manifest)
|
60
|
+
content = File.read(index)
|
61
|
+
|
62
|
+
m.file "#{app_name}/index.html", "text/html", content
|
63
|
+
m.file "#{app_name}/app.manifest", "text/cache-manifest", manifest if manifest
|
64
|
+
|
65
|
+
next if picked_root_app
|
66
|
+
|
67
|
+
m.file "index.html", "text/html", content
|
68
|
+
m.file "app.manifest", "text/cache-manifest", manifest
|
69
|
+
|
70
|
+
picked_root_app = true
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class Multipart
|
77
|
+
attr_reader :params
|
78
|
+
|
79
|
+
def initialize(params)
|
80
|
+
@params = params
|
81
|
+
@files = []
|
82
|
+
|
83
|
+
yield self if block_given?
|
84
|
+
end
|
85
|
+
|
86
|
+
def file(path, content_type, body)
|
87
|
+
@files << [path, content_type, body]
|
88
|
+
end
|
89
|
+
|
90
|
+
def headers
|
91
|
+
{ "Content-Type" => %[multipart/form-data; boundary="#{boundary}"] }
|
92
|
+
end
|
93
|
+
|
94
|
+
def body
|
95
|
+
b = "--#{boundary}\r\n"
|
96
|
+
b << part("metadata", "application/json", metadata)
|
97
|
+
b << "--#{boundary}\r\n"
|
98
|
+
|
99
|
+
@files.each do |path, type, body|
|
100
|
+
b << part("files[]", type, body)
|
101
|
+
b << "--#{boundary}\r\n"
|
102
|
+
end
|
103
|
+
|
104
|
+
b
|
105
|
+
end
|
106
|
+
|
107
|
+
private
|
108
|
+
|
109
|
+
def boundary
|
110
|
+
@boundary ||= ActiveSupport::SecureRandom.hex(25)
|
111
|
+
end
|
112
|
+
|
113
|
+
def metadata
|
114
|
+
params['application']['paths'] = @files.map { |parts| parts.first }
|
115
|
+
params.to_json
|
116
|
+
end
|
117
|
+
|
118
|
+
def part(name, type, body)
|
119
|
+
b = ""
|
120
|
+
b << %[Content-Disposition: form-data; name="#{name}"; filename="array"\r\n]
|
121
|
+
b << %[Content-Type: #{type}\r\n]
|
122
|
+
b << %[\r\n]
|
123
|
+
b << body
|
124
|
+
b << %[\r\n]
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Strobe
|
2
|
+
module Resources
|
3
|
+
class Signup
|
4
|
+
include Resource::Singleton
|
5
|
+
|
6
|
+
has 1, :user, :include => true, :autoload => false
|
7
|
+
has 1, :account, :include => true, :autoload => false
|
8
|
+
|
9
|
+
filter :password_confirmation
|
10
|
+
|
11
|
+
validates "user", "account", :presence => true
|
12
|
+
validates "user.password", :presence => true,
|
13
|
+
:length => { :minimum => 5 }, :with => :password_confirmation
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def password_confirmation
|
18
|
+
password = self["user.password"]
|
19
|
+
confirmation = self["password_confirmation"]
|
20
|
+
|
21
|
+
unless password == confirmation
|
22
|
+
errors.add "user.password", "and confirmation do not match"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
module Strobe
|
2
|
+
module ::ActiveModel
|
3
|
+
class Validator
|
4
|
+
def skippable?
|
5
|
+
!options.key?(:skippable) || options[:skippable]
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class Validations::WithValidator < EachValidator
|
10
|
+
def validate_each(record, attr, val)
|
11
|
+
record.send options[:method]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class Validations::EmailValidator < EachValidator
|
16
|
+
def validate_each(record, attr, val)
|
17
|
+
return if val.blank? || val =~ /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i
|
18
|
+
record.errors[attr] << "is not a valid email address"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module Validations
|
24
|
+
extend ActiveSupport::Concern
|
25
|
+
include ActiveModel::Validations
|
26
|
+
|
27
|
+
included do
|
28
|
+
alias valid_for_all_attributes? valid?
|
29
|
+
|
30
|
+
def valid?
|
31
|
+
return valid_for_given_attributes? if persisted?
|
32
|
+
valid_for_all_attributes?
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module ClassMethods
|
37
|
+
def validates(*attrs)
|
38
|
+
attrs.map! do |key|
|
39
|
+
key = key.to_sym if key.is_a?(String)
|
40
|
+
key
|
41
|
+
end
|
42
|
+
|
43
|
+
if Hash === attrs.last
|
44
|
+
defaults = attrs.pop
|
45
|
+
options = defaults.slice!(:skippable, :if, :unless, :on, :allow_blank, :allow_nil)
|
46
|
+
|
47
|
+
if Symbol === options[:with]
|
48
|
+
options[:with] = { :method => options[:with] }
|
49
|
+
end
|
50
|
+
|
51
|
+
if defaults.key?(:skippable)
|
52
|
+
options.keys.each do |key|
|
53
|
+
value = _parse_validates_options(options[key])
|
54
|
+
options[key] = value.merge(:skippable => defaults[:skippable])
|
55
|
+
end
|
56
|
+
|
57
|
+
defaults.delete(:skippable)
|
58
|
+
end
|
59
|
+
|
60
|
+
attrs << defaults.merge(options)
|
61
|
+
end
|
62
|
+
|
63
|
+
super
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def valid_for_given_attributes?
|
68
|
+
errors.clear
|
69
|
+
|
70
|
+
ran = []
|
71
|
+
|
72
|
+
_validators.each do |attr, validators|
|
73
|
+
validators.each do |v|
|
74
|
+
next if !key?(attr) && v.skippable?
|
75
|
+
next if ran.include?(v)
|
76
|
+
|
77
|
+
v.validate(self)
|
78
|
+
ran << v
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
errors.empty?
|
83
|
+
end
|
84
|
+
|
85
|
+
def valid_attribute?(key, clear = true)
|
86
|
+
first, rest = key.to_s.split('.', 2)
|
87
|
+
|
88
|
+
errors.clear if clear
|
89
|
+
|
90
|
+
if self.class.associations.key?(first.to_sym) && rest
|
91
|
+
if inst = send(first)
|
92
|
+
inst.valid_attribute?(rest)
|
93
|
+
|
94
|
+
inst.errors.each do |k, v|
|
95
|
+
errors.add("#{first}.#{k}", v)
|
96
|
+
end
|
97
|
+
else
|
98
|
+
valid_attribute?(first, false)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
validators = self.class.validators_on(key)
|
103
|
+
validators.each do |v|
|
104
|
+
v.validate(self)
|
105
|
+
end
|
106
|
+
|
107
|
+
errors.keys.each do |k|
|
108
|
+
errors.delete(k) unless k.to_s == key.to_s
|
109
|
+
end
|
110
|
+
|
111
|
+
errors.empty?
|
112
|
+
end
|
113
|
+
|
114
|
+
def read_attribute_for_validation(key)
|
115
|
+
self[key]
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Yehuda Katz
|
@@ -15,11 +15,11 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-12-14 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
name:
|
22
|
+
name: activesupport
|
23
23
|
prerelease: false
|
24
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
@@ -27,14 +27,14 @@ dependencies:
|
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
segments:
|
30
|
+
- 3
|
30
31
|
- 0
|
31
|
-
-
|
32
|
-
|
33
|
-
version: 0.14.1
|
32
|
+
- 0
|
33
|
+
version: 3.0.0
|
34
34
|
type: :runtime
|
35
35
|
version_requirements: *id001
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
37
|
+
name: activemodel
|
38
38
|
prerelease: false
|
39
39
|
requirement: &id002 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
@@ -42,14 +42,14 @@ dependencies:
|
|
42
42
|
- - ~>
|
43
43
|
- !ruby/object:Gem::Version
|
44
44
|
segments:
|
45
|
-
-
|
46
|
-
-
|
47
|
-
-
|
48
|
-
version:
|
45
|
+
- 3
|
46
|
+
- 0
|
47
|
+
- 0
|
48
|
+
version: 3.0.0
|
49
49
|
type: :runtime
|
50
50
|
version_requirements: *id002
|
51
51
|
- !ruby/object:Gem::Dependency
|
52
|
-
name:
|
52
|
+
name: faraday
|
53
53
|
prerelease: false
|
54
54
|
requirement: &id003 !ruby/object:Gem::Requirement
|
55
55
|
none: false
|
@@ -57,14 +57,14 @@ dependencies:
|
|
57
57
|
- - ~>
|
58
58
|
- !ruby/object:Gem::Version
|
59
59
|
segments:
|
60
|
-
-
|
61
|
-
-
|
62
|
-
-
|
63
|
-
version:
|
60
|
+
- 0
|
61
|
+
- 5
|
62
|
+
- 0
|
63
|
+
version: 0.5.0
|
64
64
|
type: :runtime
|
65
65
|
version_requirements: *id003
|
66
66
|
- !ruby/object:Gem::Dependency
|
67
|
-
name:
|
67
|
+
name: highline
|
68
68
|
prerelease: false
|
69
69
|
requirement: &id004 !ruby/object:Gem::Requirement
|
70
70
|
none: false
|
@@ -72,28 +72,29 @@ dependencies:
|
|
72
72
|
- - ~>
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
segments:
|
75
|
+
- 1
|
76
|
+
- 6
|
75
77
|
- 0
|
76
|
-
|
77
|
-
- 2
|
78
|
-
version: 0.2.2
|
78
|
+
version: 1.6.0
|
79
79
|
type: :runtime
|
80
80
|
version_requirements: *id004
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
|
-
name:
|
82
|
+
name: thor
|
83
83
|
prerelease: false
|
84
84
|
requirement: &id005 !ruby/object:Gem::Requirement
|
85
85
|
none: false
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ~>
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
segments:
|
90
|
-
-
|
91
|
-
-
|
92
|
-
|
90
|
+
- 0
|
91
|
+
- 14
|
92
|
+
- 0
|
93
|
+
version: 0.14.0
|
93
94
|
type: :runtime
|
94
95
|
version_requirements: *id005
|
95
96
|
- !ruby/object:Gem::Dependency
|
96
|
-
name:
|
97
|
+
name: mime-types
|
97
98
|
prerelease: false
|
98
99
|
requirement: &id006 !ruby/object:Gem::Requirement
|
99
100
|
none: false
|
@@ -101,85 +102,16 @@ dependencies:
|
|
101
102
|
- - ~>
|
102
103
|
- !ruby/object:Gem::Version
|
103
104
|
segments:
|
104
|
-
-
|
105
|
-
-
|
105
|
+
- 1
|
106
|
+
- 16
|
106
107
|
- 0
|
107
|
-
version:
|
108
|
+
version: 1.16.0
|
108
109
|
type: :runtime
|
109
110
|
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
111
|
description: The client library for deploying applications to Strobe's HTML5 deployment platform
|
180
112
|
email:
|
181
113
|
- wycats@strobecorp.com
|
182
|
-
-
|
114
|
+
- carl@strobecorp.com
|
183
115
|
executables:
|
184
116
|
- strobe
|
185
117
|
extensions: []
|
@@ -187,31 +119,25 @@ extensions: []
|
|
187
119
|
extra_rdoc_files: []
|
188
120
|
|
189
121
|
files:
|
190
|
-
- .
|
191
|
-
-
|
192
|
-
-
|
193
|
-
-
|
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
|
122
|
+
- lib/strobe/association.rb
|
123
|
+
- lib/strobe/cli/action.rb
|
124
|
+
- lib/strobe/cli/actions.rb
|
125
|
+
- lib/strobe/cli/settings.rb
|
205
126
|
- lib/strobe/cli.rb
|
206
|
-
- lib/strobe/
|
207
|
-
- lib/strobe/
|
208
|
-
- lib/strobe/
|
209
|
-
- lib/strobe/
|
210
|
-
- lib/strobe/
|
211
|
-
- lib/strobe/
|
212
|
-
- lib/strobe/
|
213
|
-
- lib/strobe/
|
214
|
-
- strobe.
|
127
|
+
- lib/strobe/collection.rb
|
128
|
+
- lib/strobe/connection.rb
|
129
|
+
- lib/strobe/resource/base.rb
|
130
|
+
- lib/strobe/resource/collection.rb
|
131
|
+
- lib/strobe/resource/singleton.rb
|
132
|
+
- lib/strobe/resources/account.rb
|
133
|
+
- lib/strobe/resources/application.rb
|
134
|
+
- lib/strobe/resources/me.rb
|
135
|
+
- lib/strobe/resources/signup.rb
|
136
|
+
- lib/strobe/resources/team.rb
|
137
|
+
- lib/strobe/resources/user.rb
|
138
|
+
- lib/strobe/validations.rb
|
139
|
+
- lib/strobe.rb
|
140
|
+
- bin/strobe
|
215
141
|
has_rdoc: true
|
216
142
|
homepage: http://rubygems.org/gems/strobe
|
217
143
|
licenses: []
|