strobe 0.2.0.beta.1 → 0.2.0.beta.2

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.
@@ -13,6 +13,10 @@ module Strobe
13
13
  'Strobe::Resources::' + name.to_s.classify
14
14
  end
15
15
 
16
+ def target_pluralized
17
+ name.to_s.pluralize
18
+ end
19
+
16
20
  def target
17
21
  @target ||= target_name.constantize
18
22
  end
@@ -25,10 +29,28 @@ module Strobe
25
29
  !options.key?(:autoload) || options[:autoload]
26
30
  end
27
31
 
32
+ def nested?
33
+ options[:nested]
34
+ end
35
+
28
36
  def include?
29
37
  options[:include]
30
38
  end
31
39
 
40
+ def denormalize_params(item, params)
41
+ return item unless targets = params[target_pluralized]
42
+
43
+ if collection?
44
+ raise NotImplemented
45
+ else
46
+ if id = item["#{name}_id"]
47
+ return item.merge(name.to_s => targets.find { |t| t["id"] == id })
48
+ end
49
+ end
50
+
51
+ item
52
+ end
53
+
32
54
  def reader
33
55
  ruby = []
34
56
  ruby << "def #{name}"
@@ -1,3 +1,5 @@
1
+ require "bpm"
2
+
1
3
  module Strobe
2
4
  class CLI::Main < CLI
3
5
  include CLI::Preview
@@ -159,7 +161,8 @@ module Strobe
159
161
 
160
162
  host = resource.deploy! :environment => options[:staging] && 'staging',
161
163
  :callback => CLI::DeployProgress.new,
162
- :sproutcore => is_sproutcore?
164
+ :sproutcore => is_sproutcore?,
165
+ :bpm_project => bpm_project
163
166
 
164
167
  say "The application has successfully been deployed and is available at #{host}"
165
168
  end
@@ -257,6 +260,10 @@ module Strobe
257
260
  File.exist?("#{path}/Buildfile")
258
261
  end
259
262
 
263
+ def bpm_project
264
+ BPM::Project.nearest_project Dir.pwd
265
+ end
266
+
260
267
  def determine_application_root
261
268
  if is_sproutcore?
262
269
  return "#{path}/tmp/build"
@@ -1,4 +1,5 @@
1
1
  require 'rack'
2
+ require 'bpm'
2
3
 
3
4
  module Strobe
4
5
  module CLI::Preview
@@ -16,11 +17,29 @@ module Strobe
16
17
  is_sproutcore?? preview_sproutcore_application : preview_html_application
17
18
  end
18
19
 
20
+ def bpm_project
21
+ @bpm_project ||= BPM::Project.nearest_project(Dir.pwd)
22
+ end
23
+
19
24
  def preview_html_application
20
- app = Rack::Static.new lambda { |e| [] }, :urls => [ '/' ], :root => '.'
21
- app = Middleware::Rewrite.new(app)
22
- app = Middleware::Addons.new(app, :settings => settings, :config => config)
23
- app = Middleware::Proxy.new(app)
25
+ project = bpm_project
26
+
27
+ app = Rack::Builder.new do
28
+ use Middleware::Proxy
29
+ use Middleware::Addons
30
+ use Middleware::Rewrite
31
+
32
+ if project
33
+ map "/assets" do
34
+ run BPM::Pipeline.new project
35
+ end
36
+ end
37
+
38
+ map "/" do
39
+ run Rack::Static.new lambda { |e| [] }, :urls => [ '/' ], :root => '.'
40
+ end
41
+ end.to_app
42
+
24
43
  Server.start :app => app, :host => '0.0.0.0', :server => "thin", :Port => 9292
25
44
  end
26
45
 
@@ -14,11 +14,13 @@ module Strobe
14
14
 
15
15
  def to_a
16
16
  @to_a ||= begin
17
- resp = Strobe.connection.get klass.resource_uri, params
17
+ resp = Strobe.connection.get klass.collection_uri, params
18
18
  resp.validate!
19
19
 
20
20
  if resp.status == 200
21
- resp.body[klass.pluralized_root].map do |hash|
21
+ denormalized = klass.denormalize_params(resp.body)
22
+
23
+ denormalized.map do |hash|
22
24
  klass.new(hash)
23
25
  end
24
26
  else
@@ -117,7 +117,7 @@ module Strobe
117
117
 
118
118
  def initialize(connection, method, path, body, headers)
119
119
  @connection, @path, @body, @headers = connection, path, body, headers
120
- @method = method.to_s.upcase
120
+ @method = method
121
121
  end
122
122
 
123
123
  def host; connection.host end
@@ -157,6 +157,9 @@ module Strobe
157
157
  end
158
158
 
159
159
  def request(method, path, body = nil, headers = {})
160
+ path = path.dup
161
+ method = method.to_s.upcase
162
+
160
163
  headers.keys.each do |key|
161
164
  headers[key.to_s.downcase] = headers.delete(key)
162
165
  end
@@ -169,6 +172,22 @@ module Strobe
169
172
 
170
173
  headers['authorization'] ||= authorization_header
171
174
 
175
+ if method == "GET" || method == "HEAD"
176
+
177
+ case body
178
+ when Hash
179
+ qs = body.map { |k,v| "#{k}=#{v}" }.join('&')
180
+
181
+ if path.include?('?')
182
+ path << "&#{qs}"
183
+ else
184
+ path << "?#{qs}"
185
+ end
186
+ end
187
+
188
+ body = nil
189
+ end
190
+
172
191
  if body
173
192
  headers['content-type'] ||= 'application/json'
174
193
 
@@ -31,7 +31,7 @@ module Strobe
31
31
  class_eval(assoc.reader)
32
32
  class_eval(assoc.writer)
33
33
 
34
- if assoc.include?
34
+ if assoc.nested?
35
35
  validates_with AssociationValidator, :attributes => [name]
36
36
  end
37
37
 
@@ -71,6 +71,16 @@ module Strobe
71
71
  @root = root if root
72
72
  @root
73
73
  end
74
+
75
+ def include_query_string
76
+ to_include = associations.map do |n, assoc|
77
+ assoc.target_pluralized if assoc.include?
78
+ end.compact
79
+
80
+ if to_include.any?
81
+ "include=#{to_include.join(',')}"
82
+ end
83
+ end
74
84
  end
75
85
 
76
86
  attr_reader :response
@@ -93,7 +103,7 @@ module Strobe
93
103
  def params
94
104
  @params.dup.tap do |params|
95
105
  self.class.associations.each do |name, assoc|
96
- next unless assoc.include? and inst = send(name)
106
+ next unless assoc.nested? and inst = send(name)
97
107
  params.deep_merge! name => inst.params
98
108
  end
99
109
  end
@@ -31,8 +31,12 @@ module Strobe
31
31
  root.pluralize
32
32
  end
33
33
 
34
- def resource_uri
35
- uri_prefix
34
+ def collection_uri
35
+ [ uri_prefix, include_query_string ].compact.join('?')
36
+ end
37
+
38
+ def resource_uri(id)
39
+ [ "#{uri_prefix}/#{id}", include_query_string ].compact.join('?')
36
40
  end
37
41
 
38
42
  def collection
@@ -80,6 +84,22 @@ module Strobe
80
84
  inst
81
85
  end
82
86
  end
87
+
88
+ def denormalize_params(params)
89
+ if coll = params[pluralized_root]
90
+ coll.map do |item|
91
+ associations.each do |n, assoc|
92
+ item = assoc.denormalize_params(item, params)
93
+ end
94
+ item
95
+ end
96
+ elsif item = params[root]
97
+ associations.each do |n, assoc|
98
+ item = assoc.denormalize_params(item, params)
99
+ end
100
+ item
101
+ end
102
+ end
83
103
  end
84
104
 
85
105
  def id
@@ -95,11 +115,11 @@ module Strobe
95
115
  end
96
116
 
97
117
  def reload(opts = {})
98
- resp = Strobe.connection.get "#{self.class.resource_uri}/#{key}"
118
+ resp = Strobe.connection.get self.class.resource_uri(key)
99
119
  resp.validate! if opts[:validate]
100
120
 
101
121
  if resp.success?
102
- self.params = resp.body[self.class.root]
122
+ self.params = self.class.denormalize_params(resp.body)
103
123
  self
104
124
  end
105
125
  end
@@ -10,6 +10,11 @@ module Strobe
10
10
  end
11
11
 
12
12
  alias singular_resource_name resource_name
13
+
14
+ def denormalize_params(params)
15
+ # Nothing fancy implemented yet
16
+ params[pluralized_root]
17
+ end
13
18
  end
14
19
 
15
20
  # stuff
@@ -68,6 +68,11 @@ module Strobe
68
68
 
69
69
  picked_root_app = false
70
70
 
71
+ if project = opts[:bpm_project]
72
+ project.rebuild_dependency_list(nil, false)
73
+ project.build :production, true
74
+ end
75
+
71
76
  if opts[:sproutcore]
72
77
  Dir["static/*"].each do |appdir|
73
78
  next if File.file?(appdir)
@@ -3,7 +3,7 @@ module Strobe
3
3
  class Me
4
4
  include Resource::Singleton
5
5
 
6
- has 1, :user, :include => true, :autoload => false
6
+ has 1, :user, :nested => true, :autoload => false
7
7
 
8
8
  validates "user.password", :presence => true
9
9
  end
@@ -3,8 +3,8 @@ module Strobe
3
3
  class Membership
4
4
  include Resource::Collection
5
5
 
6
- has 1, :team
7
- has 1, :user
6
+ has 1, :team, :include => true
7
+ has 1, :user, :include => true
8
8
 
9
9
  validates :team, :presence => true
10
10
  validates :email, :presence => true, :email => true
@@ -3,8 +3,8 @@ module Strobe
3
3
  class Signup
4
4
  include Resource::Singleton
5
5
 
6
- has 1, :user, :include => true, :autoload => false
7
- has 1, :account, :include => true, :autoload => false
6
+ has 1, :user, :nested => true, :autoload => false
7
+ has 1, :account, :nested => true, :autoload => false
8
8
 
9
9
  filter :password_confirmation
10
10
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: strobe
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: 6
5
- version: 0.2.0.beta.1
5
+ version: 0.2.0.beta.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Carl Lerche
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-07-16 00:00:00 +09:00
13
+ date: 2011-07-18 00:00:00 +09:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -25,29 +25,29 @@ dependencies:
25
25
  type: :runtime
26
26
  version_requirements: *id001
27
27
  - !ruby/object:Gem::Dependency
28
- name: mime-types
28
+ name: bpm
29
29
  prerelease: false
30
30
  requirement: &id002 !ruby/object:Gem::Requirement
31
31
  none: false
32
32
  requirements:
33
33
  - - ~>
34
34
  - !ruby/object:Gem::Version
35
- version: 1.16.0
35
+ version: 1.0.0.beta.3.pre
36
36
  type: :runtime
37
37
  version_requirements: *id002
38
38
  - !ruby/object:Gem::Dependency
39
- name: rack
39
+ name: mime-types
40
40
  prerelease: false
41
41
  requirement: &id003 !ruby/object:Gem::Requirement
42
42
  none: false
43
43
  requirements:
44
44
  - - ~>
45
45
  - !ruby/object:Gem::Version
46
- version: 1.2.0
46
+ version: 1.16.0
47
47
  type: :runtime
48
48
  version_requirements: *id003
49
49
  - !ruby/object:Gem::Dependency
50
- name: thin
50
+ name: rack
51
51
  prerelease: false
52
52
  requirement: &id004 !ruby/object:Gem::Requirement
53
53
  none: false
@@ -58,49 +58,60 @@ dependencies:
58
58
  type: :runtime
59
59
  version_requirements: *id004
60
60
  - !ruby/object:Gem::Dependency
61
- name: em-http-request
61
+ name: thin
62
62
  prerelease: false
63
63
  requirement: &id005 !ruby/object:Gem::Requirement
64
64
  none: false
65
65
  requirements:
66
66
  - - ~>
67
67
  - !ruby/object:Gem::Version
68
- version: 1.0.0.beta
68
+ version: 1.2.0
69
69
  type: :runtime
70
70
  version_requirements: *id005
71
71
  - !ruby/object:Gem::Dependency
72
- name: thor
72
+ name: em-http-request
73
73
  prerelease: false
74
74
  requirement: &id006 !ruby/object:Gem::Requirement
75
75
  none: false
76
76
  requirements:
77
77
  - - ~>
78
78
  - !ruby/object:Gem::Version
79
- version: 0.14.0
79
+ version: 1.0.0.beta
80
80
  type: :runtime
81
81
  version_requirements: *id006
82
82
  - !ruby/object:Gem::Dependency
83
- name: oauth
83
+ name: thor
84
84
  prerelease: false
85
85
  requirement: &id007 !ruby/object:Gem::Requirement
86
86
  none: false
87
87
  requirements:
88
88
  - - ~>
89
89
  - !ruby/object:Gem::Version
90
- version: 0.4.4
90
+ version: 0.14.0
91
91
  type: :runtime
92
92
  version_requirements: *id007
93
93
  - !ruby/object:Gem::Dependency
94
- name: launchy
94
+ name: oauth
95
95
  prerelease: false
96
96
  requirement: &id008 !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 0.4.4
102
+ type: :runtime
103
+ version_requirements: *id008
104
+ - !ruby/object:Gem::Dependency
105
+ name: launchy
106
+ prerelease: false
107
+ requirement: &id009 !ruby/object:Gem::Requirement
97
108
  none: false
98
109
  requirements:
99
110
  - - ">="
100
111
  - !ruby/object:Gem::Version
101
112
  version: "0"
102
113
  type: :runtime
103
- version_requirements: *id008
114
+ version_requirements: *id009
104
115
  description: The client library for deploying applications to Strobe's HTML5 deployment platform
105
116
  email:
106
117
  - carl@strobecorp.com