sproutcore 0.9.10 → 0.9.11

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.
Files changed (42) hide show
  1. data/History.txt +25 -0
  2. data/Manifest.txt +2 -1
  3. data/bin/sc-server +4 -1
  4. data/frameworks/sproutcore/HISTORY +75 -3
  5. data/frameworks/sproutcore/{Core.js → core.js} +2 -3
  6. data/frameworks/sproutcore/drag/drag.js +1 -1
  7. data/frameworks/sproutcore/english.lproj/buttons.css +3 -2
  8. data/frameworks/sproutcore/english.lproj/detect-browser +44 -0
  9. data/frameworks/sproutcore/foundation/animator.js +40 -40
  10. data/frameworks/sproutcore/foundation/application.js +1 -1
  11. data/frameworks/sproutcore/foundation/benchmark.js +2 -2
  12. data/frameworks/sproutcore/foundation/error.js +61 -16
  13. data/frameworks/sproutcore/foundation/input_manager.js +1 -1
  14. data/frameworks/sproutcore/foundation/mock.js +1 -1
  15. data/frameworks/sproutcore/foundation/node_descriptor.js +2 -2
  16. data/frameworks/sproutcore/foundation/object.js +1 -1
  17. data/frameworks/sproutcore/foundation/path_module.js +1 -1
  18. data/frameworks/sproutcore/foundation/responder.js +1 -1
  19. data/frameworks/sproutcore/foundation/run_loop.js +1 -1
  20. data/frameworks/sproutcore/foundation/server.js +1 -1
  21. data/frameworks/sproutcore/foundation/string.js +32 -3
  22. data/frameworks/sproutcore/foundation/timer.js +1 -1
  23. data/frameworks/sproutcore/foundation/undo_manager.js +1 -1
  24. data/frameworks/sproutcore/globals/window.js +1 -1
  25. data/frameworks/sproutcore/lib/core_views.rb +1 -1
  26. data/frameworks/sproutcore/lib/index.rhtml +7 -1
  27. data/frameworks/sproutcore/mixins/observable.js +115 -7
  28. data/frameworks/sproutcore/models/record.js +1 -1
  29. data/frameworks/sproutcore/tests/views/view/innerFrame.rhtml +101 -99
  30. data/frameworks/sproutcore/views/collection/grid.js +1 -1
  31. data/frameworks/sproutcore/views/collection/table.js +1 -1
  32. data/frameworks/sproutcore/views/list_item.js +1 -1
  33. data/frameworks/sproutcore/views/progress.js +21 -11
  34. data/frameworks/sproutcore/views/segmented.js +40 -15
  35. data/lib/sproutcore/bundle.rb +3 -3
  36. data/lib/sproutcore/bundle_manifest.rb +7 -7
  37. data/lib/sproutcore/jsdoc.rb +4 -2
  38. data/lib/sproutcore/library.rb +112 -43
  39. data/lib/sproutcore/merb/bundle_controller.rb +77 -4
  40. data/lib/sproutcore/version.rb +1 -1
  41. data/sc_generators/client/templates/core.js +1 -4
  42. metadata +4 -3
@@ -33,9 +33,11 @@ module SproutCore
33
33
  runjs_path = File.join(jsdoc_root, 'app', 'run.js')
34
34
  template_path = File.join(jsdoc_root, 'templates', 'sproutcore')
35
35
 
36
- puts "GENERATING: java -Djsdoc.dir=#{jsdoc_root} -jar #{jar_path} #{runjs_path} -t=#{template_path} -d=#{build_path} #{files * ' '} -v"
36
+ puts %(GENERATING: java -Djsdoc.dir="#{jsdoc_root}" -jar "#{jar_path}" "#{runjs_path}" -t="#{template_path}" -d="#{build_path}" "#{ files * '" "' }" -v)
37
37
 
38
- SC.logger.debug `java -Djsdoc.dir=#{jsdoc_root} -jar #{jar_path} #{runjs_path} -t=#{template_path} -d=#{build_path} #{files * ' '} -v`
38
+ # wrap files in quotes...
39
+
40
+ SC.logger.debug `java -Djsdoc.dir="#{jsdoc_root}" -jar "#{jar_path}" "#{runjs_path}" -t="#{template_path}" -d="#{build_path}" "#{ files * '" "' }" -v`
39
41
 
40
42
  end
41
43
  end
@@ -64,6 +64,9 @@ module SproutCore
64
64
  # The parent library, used for load order dependency
65
65
  attr_accessor :next_library
66
66
 
67
+ # Any proxy info stored for development
68
+ attr_accessor :proxies
69
+
67
70
  # The client directories found in this library. This usually maps directly to a
68
71
  # client name but it may not if you have set up some other options.
69
72
  def client_directories
@@ -161,7 +164,6 @@ module SproutCore
161
164
  # way to get all of your code onto disk in a deployable state
162
165
  def build(*languages)
163
166
  (client_bundles + framework_bundles).each do |bundle|
164
- puts "building: #{bundle.bundle_name}"
165
167
  bundle.build(*languages)
166
168
  end
167
169
  end
@@ -170,57 +172,75 @@ module SproutCore
170
172
  # This will go up the chain of parent libraries, retrieving and merging
171
173
  # any known environment settings. The returned options are suitable for
172
174
  # passing to the ClientBuilder for registration.
175
+ #
176
+ # The process here is:
177
+ #
178
+ # 1. merge together the :all configs.
179
+ # 2. Find the deepest config for the bundle specifically and merge that.
180
+ #
173
181
  def environment_for(bundle_name)
174
182
 
175
- is_local_client = client_directories.include?(bundle_name.to_s)
176
- is_local_framework = framework_directories.include?(bundle_name.to_s)
177
- ret = nil
183
+ # Get the bundle location info. This will return nil if the bundle
184
+ # is not found anywhere. In that case, return nil to indicate bundle
185
+ # does not exist.
186
+ bundle_location = bundle_location_for(bundle_name)
187
+ return nil if bundle_location.nil?
188
+
189
+ # A bundle was found, so collect the base environment and any bundle-
190
+ # specific configs provided by the developer.
191
+ base_env = base_environment
192
+ config_env = bundle_environment_for(bundle_name)
193
+
194
+ # Now we have the relevant pieces. Join them together. Start with the
195
+ # base environment and fill in some useful defaults...
196
+ ret = base_env.dup.merge(config_env).merge(bundle_location)
197
+ ret[:required] = [:sproutcore] if ret[:required].nil?
178
198
 
179
- # CASE 1: If named client or framework is local, then use our local settings
180
- if (is_local_client || is_local_framework)
199
+ # Add local library so we get proper deployment paths, etc.
200
+ ret[:library] = self
201
+
202
+ # Done! return...
203
+ return ret
204
+ end
205
+
206
+ # Returns a re-written proxy URL for the passed URL or nil if no proxy
207
+ # is registered. The URL should NOT include a hostname.
208
+ #
209
+ # === Returns
210
+ # the converted proxy_url and the proxy options or nil if no match
211
+ #
212
+ def proxy_url_for(url)
213
+
214
+ # look for a matching proxy.
215
+ matched = nil
216
+ matched_url = nil
217
+
218
+ @proxies.each do |proxy_url, opts|
219
+ matched_url = proxy_url
220
+ matched = opts if url =~ /^#{proxy_url}/
221
+ break if matched
222
+ end
223
+
224
+ # If matched, rewrite the URL
225
+ if matched
181
226
 
182
- # start with local environment
183
- ret = (environment[:all] || {}).dup
227
+ # rewrite the matched_url if needed...
228
+ if matched[:url]
229
+ url = url.gsub(/^#{matched_url}/, matched[:url])
230
+ end
184
231
 
185
- # Now fill in some default values based on what we know
186
- # This should be enough to make the bundle load
187
- ret[:bundle_name] = bundle_name.to_sym
188
- ret[:bundle_type] = is_local_framework ? :framework : :client
189
- ret[:requires] = [:prototype, :sproutcore] if ret[:requires].nil?
232
+ # prepend the hostname and protocol
233
+ url = [(matched[:protocol] || 'http'), '://', matched[:to], url].join('')
190
234
 
191
- # Fill in the source_root since we know where this came from
192
- ret[:source_root] = File.join(root_path, ret[:bundle_type].to_s.pluralize, bundle_name.to_s)
193
-
194
- # CASE 2: Otherwise, if we have a next library, see if the next library has something
235
+ # otherwise nil
195
236
  else
196
- ret = next_library.nil? ? nil : next_library.environment_for(bundle_name)
197
- end
198
-
199
- # Final fixup
200
- unless ret.nil?
201
- # Always url_prefix & index_prefix are always used.
202
- all = environment[:all] || {}
203
- [:url_prefix, :all_prefix, :preferred_language].each do |key|
204
- ret[key] = all[key] if all.include?(key)
205
- end
206
-
207
- # Either way, if we have local settings for this specific client, they
208
- # override whatever we cooked up just now.
209
- local_settings = environment[bundle_name.to_sym]
210
- ret = ret.merge(local_settings) unless local_settings.nil?
211
-
212
- # Always replace the library with self so that we get the correct root location for
213
- # public paths, etc.
214
- ret[:library] = self
237
+ url = nil
215
238
  end
216
239
 
240
+ return [url, matched]
217
241
 
218
- # CASE 3: Next library doesn't know about this client. Neither do we. Even if the
219
- # user has provided some environmental options, there is no source content, so just
220
- # return nil
221
- return ret
222
242
  end
223
-
243
+
224
244
  protected
225
245
 
226
246
  # Load the library at the specified path. Loads the sc-config.rb if it
@@ -235,6 +255,7 @@ module SproutCore
235
255
  @root_path = rp
236
256
  @next_library = next_lib
237
257
  @load_opts = opts
258
+ @proxies = {}
238
259
  load_environment!(opts)
239
260
  end
240
261
 
@@ -269,9 +290,57 @@ module SproutCore
269
290
  env.merge!(opts) unless opts.nil?
270
291
  yield(env) if block_given?
271
292
  end
293
+
294
+ # Adds a proxy to the local library. This does NOT inherit from parent
295
+ # libraries.
296
+ #
297
+ # ==== Params
298
+ # url: the root URL to match
299
+ # opts: options.
300
+ #
301
+ # ==== Options
302
+ # :to: the new hostname
303
+ # :url: an optional rewriting of the URL path as well.
304
+ #
305
+ def proxy(url, opts={})
306
+ @proxies[url] = opts
307
+ end
308
+
309
+ # ==== Returns
310
+ # the first :all environment config...
311
+ def base_environment
312
+ environment[:all] || (next_library.nil? ? {} : next_library.base_environment)
313
+ end
314
+
315
+ # ==== Returns
316
+ # the first config found for the specified bundle
317
+ def bundle_environment_for(bundle_name)
318
+ bundle_name = bundle_name.to_sym
319
+ return environment[bundle_name] || (next_library.nil? ? {} : next_library.bundle_environment_for(bundle_name))
320
+ end
321
+
322
+ # ==== Returns
323
+ # path info for the bundle. Used by bundle object.
324
+ def bundle_location_for(bundle_name)
325
+ bundle_name = bundle_name.to_sym
326
+ is_local_client = client_directories.include?(bundle_name.to_s)
327
+ is_local_framework = framework_directories.include?(bundle_name.to_s)
272
328
 
329
+ ret = nil
330
+ if is_local_client || is_local_framework
331
+ bundle_type = is_local_framework ? :framework : :client
332
+ ret = {
333
+ :bundle_name => bundle_name,
334
+ :bundle_type => bundle_type,
335
+ :source_root => File.join(root_path, bundle_type.to_s.pluralize, bundle_name.to_s)
336
+ }
337
+ else
338
+ ret = next_library.nil? ? nil : next_library.bundle_location_for(bundle_name)
339
+ end
340
+
341
+ return ret
342
+ end
343
+
273
344
  end
274
345
 
275
346
  end
276
-
277
-
@@ -1,4 +1,6 @@
1
1
  require 'sproutcore/jsdoc'
2
+ require 'net/http'
3
+ require 'uri'
2
4
 
3
5
  module SproutCore
4
6
  module Merb
@@ -32,7 +34,17 @@ module SproutCore
32
34
  end
33
35
 
34
36
  # Make sure we can service this with a bundle
35
- raise(NotFound, "No SproutCore Bundle registered at this location.") if current_bundle.nil?
37
+ # If no bundle is found, try to proxy...
38
+ if current_bundle.nil?
39
+ # if proxy url, return proxy...
40
+ url = request.path
41
+ proxy_url, proxy_opts = library.proxy_url_for(url)
42
+ if proxy_url
43
+ return handle_proxy(url, proxy_url, proxy_opts)
44
+ else
45
+ raise(NotFound, "No SproutCore Bundle registered at this location.")
46
+ end
47
+ end
36
48
 
37
49
  # Check for a few special urls that need to be rewritten
38
50
  url = request.path
@@ -71,7 +83,6 @@ module SproutCore
71
83
  # Get the entry for the resource.
72
84
  entry = current_bundle.entry_for_url(url, :hidden => :include)
73
85
  raise(NotFound, "No matching entry in #{current_bundle.bundle_name} for #{url}") if entry.nil?
74
-
75
86
 
76
87
  build_path = entry.build_path
77
88
 
@@ -79,8 +90,17 @@ module SproutCore
79
90
  # been built, this will not do much. If this the resource is an
80
91
  # index.html file, force the build.
81
92
  is_index = /\/index\.html$/ =~ url
82
-
83
- current_bundle.build_entry(entry, :force => is_index, :hidden => :include)
93
+
94
+ # If we need to serve the source directly, then just set the
95
+ # build path to the source_path.
96
+ if entry.use_source_directly?
97
+ build_path = entry.source_path
98
+
99
+ # Otherwise, run the build command on the entry to make sure the
100
+ # file is up to date.
101
+ else
102
+ current_bundle.build_entry(entry, :force => is_index, :hidden => :include)
103
+ end
84
104
 
85
105
  # Move to final build path if necessary
86
106
  if (build_path != entry.build_path) && File.exists?(entry.build_path)
@@ -106,6 +126,59 @@ module SproutCore
106
126
  return ret
107
127
  end
108
128
 
129
+ # Proxy the request and return the result...
130
+ def handle_proxy(url, proxy_url, opts ={})
131
+
132
+ # collect the method
133
+ http_method = request.method
134
+
135
+ # capture the origin host for cookies. strip away any port.
136
+ origin_host = request.host.gsub(/:[0-9]+$/,'')
137
+
138
+ # collect the headers...
139
+ headers = {}
140
+ request.env.each do |key, value|
141
+ next unless key =~ /^HTTP_/
142
+ key = key.gsub(/^HTTP_/,'').titleize.gsub(' ','-')
143
+ headers[key] = value
144
+ end
145
+
146
+ uri = URI.parse(proxy_url)
147
+ http_host = uri.host
148
+ http_port = uri.port
149
+ http_path = [uri.path, uri.query].compact.join('?')
150
+ http_path = '/' if http_path.nil? || http_path.size <= 0
151
+
152
+ # now make the request...
153
+ response = nil
154
+ ::Net::HTTP.start(http_host, http_port) do |http|
155
+ response = http.send(http_method, http_path, headers)
156
+ end
157
+
158
+ # Now set the status, headers, and body.
159
+ @status = response.code
160
+
161
+ # Transfer response headers into reponse
162
+ ignore = ['transfer-encoding', 'keep-alive', 'connection']
163
+ response.each do | key, value |
164
+ next if ignore.include?(key.downcase)
165
+
166
+ # If this is a cookie, strip out the domain. This technically may
167
+ # break certain scenarios where services try to set cross-domain
168
+ # cookies, but those services should not be doing that anyway...
169
+ if key.downcase == 'set-cookie'
170
+ value.gsub!(/domain=[^\;]+\;? ?/,'')
171
+ end
172
+
173
+ # Prep key and set header.
174
+ key = key.split('-').map { |x| x.downcase.capitalize }.join('-')
175
+ @headers[key] = value
176
+ end
177
+
178
+ # Transfer response body
179
+ return response.body
180
+ end
181
+
109
182
  # Returns JSON containing all of the tests
110
183
  def handle_test(url)
111
184
  test_entries = current_bundle.entries_for(:test, :hidden => :include)
@@ -2,7 +2,7 @@ module SproutCore #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 9
5
- TINY = 10
5
+ TINY = 11
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -11,9 +11,6 @@
11
11
  // When you are in development mode, this array will be populated with
12
12
  // any fixtures you create for testing and loaded automatically in your
13
13
  // main method. When in production, this will be an empty array.
14
- FIXTURES: [],
15
-
16
- // Any keys in this array will be instantiated automatically from main.
17
- controllers: []
14
+ FIXTURES: []
18
15
 
19
16
  }) ;
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sproutcore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.10
4
+ version: 0.9.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Charles Jolley
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-06-17 00:00:00 -07:00
12
+ date: 2008-06-24 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -133,7 +133,7 @@ files:
133
133
  - frameworks/sproutcore/controllers/collection.js
134
134
  - frameworks/sproutcore/controllers/controller.js
135
135
  - frameworks/sproutcore/controllers/object.js
136
- - frameworks/sproutcore/Core.js
136
+ - frameworks/sproutcore/core.js
137
137
  - frameworks/sproutcore/drag/drag.js
138
138
  - frameworks/sproutcore/drag/drag_data_source.js
139
139
  - frameworks/sproutcore/drag/drag_source.js
@@ -141,6 +141,7 @@ files:
141
141
  - frameworks/sproutcore/english.lproj/blank.gif
142
142
  - frameworks/sproutcore/english.lproj/buttons.css
143
143
  - frameworks/sproutcore/english.lproj/core.css
144
+ - frameworks/sproutcore/english.lproj/detect-browser
144
145
  - frameworks/sproutcore/english.lproj/icons.css
145
146
  - frameworks/sproutcore/english.lproj/images/indicator.gif
146
147
  - frameworks/sproutcore/english.lproj/images/sc-theme-sprite.png