slinky 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -29,13 +29,14 @@ module Slinky
29
29
  def initialize dir, config, options = {}
30
30
  @dir = dir
31
31
  @build_to = if d = options[:build_to]
32
- File.absolute_path(d)
32
+ File.expand_path(d)
33
33
  else
34
34
  dir
35
35
  end
36
36
  @manifest_dir = ManifestDir.new dir, self, @build_to, self
37
37
  @devel = (options[:devel].nil?) ? true : options[:devel]
38
38
  @config = config
39
+ @no_minify = options[:no_minify] || config.dont_minify
39
40
  end
40
41
 
41
42
  # Returns a list of all files contained in this manifest
@@ -65,7 +66,11 @@ module Slinky
65
66
  def remove_all_by_path paths
66
67
  manifest_update paths do |path|
67
68
  mf = find_by_path(path).first()
68
- mf.parent.remove_file(mf)
69
+ begin
70
+ mf.parent.remove_file(mf)
71
+ rescue
72
+ puts "Failed to remove <#{path}>"
73
+ end
69
74
  end
70
75
  end
71
76
 
@@ -78,11 +83,11 @@ module Slinky
78
83
  def find_by_path path, allow_multiple = false
79
84
  @manifest_dir.find_by_path path, allow_multiple
80
85
  end
81
-
86
+
82
87
  def scripts_string
83
88
  if @devel
84
89
  dependency_list.reject{|x| x.output_path.extname != ".js"}.collect{|d|
85
- %Q\<script type="text/javascript" src="#{d.relative_output_path}"></script>\
90
+ %Q\<script type="text/javascript" src="/#{d.relative_output_path}"></script>\
86
91
  }.join("")
87
92
  else
88
93
  %Q\<script type="text/javascript" src="/scripts.js?#{rand(999999999)}"></script>\
@@ -99,7 +104,11 @@ module Slinky
99
104
  }.join("\n")
100
105
 
101
106
  File.open(output, "w+"){|f|
102
- f.write(compressor.compress(s))
107
+ unless @no_minify
108
+ f.write(compressor.compress(s))
109
+ else
110
+ f.write(s)
111
+ end
103
112
  }
104
113
  scripts.collect{|s| FileUtils.rm(s.build_to)}
105
114
  end
@@ -116,7 +125,7 @@ module Slinky
116
125
  compress(".css", "#{@build_to}/styles.css", compressor){|s, css|
117
126
  css.gsub(CSS_URL_MATCHER){|url|
118
127
  p = s.relative_output_path.dirname.to_s + "/#{$1}"
119
- "url('#{p}')"
128
+ "url('/#{p}')"
120
129
  }
121
130
  }
122
131
  end
@@ -124,7 +133,7 @@ module Slinky
124
133
  def styles_string
125
134
  if @devel
126
135
  dependency_list.reject{|x| x.output_path.extname != ".css"}.collect{|d|
127
- %Q\<link rel="stylesheet" href="#{d.relative_output_path}" />\
136
+ %Q\<link rel="stylesheet" href="/#{d.relative_output_path}" />\
128
137
  }.join("")
129
138
  else
130
139
  %Q\<link rel="stylesheet" href="/styles.css?#{rand(999999999)}" />\
@@ -235,7 +244,7 @@ module Slinky
235
244
 
236
245
  Dir.glob("#{dir}/*").each do |path|
237
246
  # skip the build dir
238
- next if Pathname.new(File.absolute_path(path)) == Pathname.new(build_dir)
247
+ next if Pathname.new(File.expand_path(path)) == Pathname.new(build_dir)
239
248
  if File.directory? path
240
249
  add_child(path)
241
250
  else
@@ -259,7 +268,7 @@ module Slinky
259
268
  [self]
260
269
  when 1
261
270
  path = [@dir, components[0]].join(File::SEPARATOR)
262
- if (Dir.exists?(path) rescue false)
271
+ if (File.directory?(path) rescue false)
263
272
  c = @children.find{|d|
264
273
  Pathname.new(d.dir).cleanpath == Pathname.new(path).cleanpath
265
274
  }
@@ -289,7 +298,7 @@ module Slinky
289
298
 
290
299
  # Adds a child directory
291
300
  def add_child path
292
- if Dir.exists? path
301
+ if File.directory? path
293
302
  build_dir = (@build_dir + File.basename(path)).cleanpath
294
303
  md = ManifestDir.new(path, self, build_dir, @manifest)
295
304
  @children << md
@@ -318,7 +327,7 @@ module Slinky
318
327
  end
319
328
 
320
329
  def build
321
- unless Dir.exists?(@build_dir.to_s)
330
+ unless File.directory?(@build_dir.to_s)
322
331
  FileUtils.mkdir(@build_dir.to_s)
323
332
  end
324
333
  (@files + @children).each{|m|
@@ -338,7 +347,7 @@ module Slinky
338
347
  def initialize source, build_path, manifest, parent = nil, options = {:devel => false}
339
348
  @parent = parent
340
349
  @source = source
341
- @last_built = Time.new(0)
350
+ @last_built = Time.at(0)
342
351
 
343
352
  @cfile = Compilers.cfile_for_file(@source)
344
353
 
@@ -349,7 +358,7 @@ module Slinky
349
358
  end
350
359
 
351
360
  def invalidate
352
- @last_built = Time.new(0)
361
+ @last_built = Time.at(0)
353
362
  @last_md5 = nil
354
363
  end
355
364
 
@@ -366,9 +375,18 @@ module Slinky
366
375
  name = Pathname.new(@source).basename.to_s
367
376
  output = output_path.basename.to_s
368
377
  # check for stars that are not escaped
369
- r = /(?<!\\)\*/
370
- if match_glob && s.match(r)
371
- a = s.split(r)
378
+ a = [""]
379
+ last = ""
380
+ s.each_char {|c|
381
+ if c != "*" || last == "\\"
382
+ a[-1] << c
383
+ else
384
+ a << ""
385
+ end
386
+ last = c
387
+ }
388
+
389
+ if match_glob && a.size > 1
372
390
  r2 = a.reduce{|a, x| /#{a}.*#{x}/}
373
391
  name.match(r2) || output.match(r2)
374
392
  else
@@ -393,7 +411,8 @@ module Slinky
393
411
  # @return Pathname the output path
394
412
  def output_path
395
413
  if @cfile
396
- Pathname.new(@source).sub_ext ".#{@cfile.output_ext}"
414
+ ext = /\.[^.]*$/
415
+ Pathname.new(@source.gsub(ext, ".#{@cfile.output_ext}"))
397
416
  else
398
417
  Pathname.new(@source)
399
418
  end
@@ -503,7 +522,7 @@ module Slinky
503
522
  @last_md5 = hash
504
523
  @updated = Time.now
505
524
  # mangle file appropriately
506
- @last_path = handle_directives (compile @source), to
525
+ @last_path = handle_directives((compile @source), to)
507
526
  end
508
527
  end
509
528
 
@@ -44,9 +44,6 @@ module Slinky
44
44
  proxy = nil
45
45
  start_time = nil
46
46
  conn.server :slinky, :host => "127.0.0.1", :port => slinky_port
47
- proxy_servers.each{|p|
48
- conn.server p, :host => p[0], :port => p[1]
49
- }
50
47
 
51
48
  conn.on_data do |data|
52
49
  begin
@@ -58,6 +55,8 @@ module Slinky
58
55
  data = ProxyServer.replace_path(data, path, new_path, proxy[1].path)
59
56
  new_host = proxy[1].select(:host, :port).join(":")
60
57
  data = ProxyServer.replace_host(data, new_host)
58
+ conn.server [proxy[1].host, proxy[1].port],
59
+ :host => proxy[1].host, :port => proxy[1].port
61
60
  [proxy[1].host, proxy[1].port]
62
61
  else :slinky
63
62
  end
@@ -75,7 +74,7 @@ module Slinky
75
74
  # take into account the lag from the backend server
76
75
  so_far = Time.now - start_time
77
76
  time = opt["lag"]/1000.0-so_far
78
- EM.add_timer (time > 0 ? time : 0) do
77
+ EM.add_timer(time > 0 ? time : 0) do
79
78
  conn.send_data resp
80
79
  end
81
80
  else
data/lib/slinky/runner.rb CHANGED
@@ -3,18 +3,22 @@ module Slinky
3
3
  COMMANDS = %w{start build}
4
4
 
5
5
  def initialize argv
6
+ # While slinky largely works in Ruby 1.8, the tests don't run
7
+ # properly and using 1.9 is highly recommended.
8
+ if RUBY_VERSION.start_with?("1.8")
9
+ $stderr.puts(("Slinky is unsupported on Ruby 1.8." + \
10
+ " Using 1.9 is highly recommended.").foreground(:red))
11
+
12
+ end
13
+
6
14
  @argv = argv
7
- @options = {
8
- :build_dir => "build",
9
- :port => 5323,
10
- :src_dir => "."
11
- }
15
+ @options = {}
12
16
 
13
17
  parser.parse! @argv
14
18
  @command = @argv.shift
15
19
  @arguments = @argv
16
20
 
17
- config_path = @options[:config] || "#{@options[:src_dir]}/slinky.yaml"
21
+ config_path = @options[:config] || "#{@options[:src_dir] || "."}/slinky.yaml"
18
22
  @config = if File.exist?(config_path)
19
23
  ConfigReader.from_file(config_path)
20
24
  else
@@ -38,7 +42,9 @@ module Slinky
38
42
  opts.on("-p PORT", "--port PORT", "Port to run on (default: #{@options[:port]})"){|p| @options[:port] = p.to_i}
39
43
  opts.on("-s DIR", "--src-dir DIR", "Directory containing project source"){|p| @options[:src_dir] = p}
40
44
  opts.on("-n", "--no-proxy", "Don't set up proxy server"){ @options[:no_proxy] = true }
45
+ opts.on("-r", "--no-livereload", "Don't start a livereload server"){ @options[:no_livereload] = true }
41
46
  opts.on("-c FILE", "--config FILE", "Path to configuration file"){|f| @options[:config] = f}
47
+ opts.on("-m", "--dont-minify", "Don't minify js/css"){ @options[:no_minify] = true }
42
48
  end
43
49
  end
44
50
 
@@ -57,26 +63,37 @@ module Slinky
57
63
  Signal.trap('INT') { puts "Slinky fading away ... "; exit(0); }
58
64
 
59
65
  EM::run {
66
+ @config ||= Config.empty
67
+
60
68
  Slinky::Server.dir = @options[:src_dir]
61
69
  Slinky::Server.config = @config
62
70
  manifest = Manifest.new(Slinky::Server.dir,
63
71
  Slinky::Server.config)
64
72
  Slinky::Server.manifest = manifest
65
73
 
66
- if @config && !@config.proxies.empty? && !@options[:no_proxy]
67
- server = EM::start_server "127.0.0.1", @options[:port]+1, Slinky::Server
68
- ProxyServer.run(@config.proxies, @options[:port], @options[:port]+1)
74
+ port = @options[:port] || @config.port
75
+
76
+ should_proxy = !(@config.no_proxy || @options[:no_proxy])
77
+ if !@config.proxies.empty? && should_proxy
78
+ server = EM::start_server "127.0.0.1", port+1, Slinky::Server
79
+ ProxyServer.run(@config.proxies, port, port+1)
69
80
  else
70
- EM::start_server "0.0.0.0", @options[:port], Slinky::Server
81
+ EM::start_server "127.0.0.1", port, Slinky::Server
82
+ end
83
+
84
+ if !@config.no_livereload && !@options[:no_livereload]
85
+ lr_port = @options[:livereload_port] || @config.livereload_port
86
+ livereload = LiveReload.new("127.0.0.1", lr_port)
87
+ livereload.run
71
88
  end
72
89
 
73
- Listener.new(manifest).run
74
- puts "Started static file server on port #{@options[:port]}"
90
+ Listener.new(manifest, livereload).run
91
+ puts "Started static file server on port #{port}"
75
92
  }
76
93
  end
77
94
 
78
95
  def command_build
79
- Builder.build(@options[:src_dir], @options[:build_dir], @config)
96
+ Builder.build(@options, @config)
80
97
  end
81
98
  end
82
99
  end
data/lib/slinky/server.rb CHANGED
@@ -8,7 +8,7 @@ module Slinky
8
8
  def self.dir; @dir || "."; end
9
9
 
10
10
  def self.config= _config; @config = _config; end
11
- def self.config; @config || {}; end
11
+ def self.config; @config || ConfigReader.empty; end
12
12
 
13
13
  def self.manifest= _manifest; @manifest = _manifest; end
14
14
  def self.manifest; @manifest; end
@@ -20,17 +20,47 @@ module Slinky
20
20
  path[1..-1] #get rid of the leading /
21
21
  end
22
22
 
23
+ # Method called for every HTTP request made
24
+ def process_http_request
25
+ resp = EventMachine::DelegatedHttpResponse.new(self)
26
+
27
+ begin
28
+ path = Server.path_for_uri(@http_request_uri)
29
+ rescue
30
+ resp.status = 500
31
+ resp.content = "Invalid request"
32
+ return
33
+ end
34
+
35
+ Server.process_path(resp, path).send_response
36
+ end
37
+
38
+ def self.process_path resp, path, pushstate = false
39
+ file = manifest.find_by_path(path).first
40
+ if file.is_a? ManifestDir
41
+ file = manifest.find_by_path(path+"/index.html").first
42
+ end
43
+
44
+ resp.content_type MIME::Types.type_for(path).first
45
+
46
+ if file
47
+ handle_file(resp, file)
48
+ elsif !pushstate && p = config.pushstate_for_path("/" + path)
49
+ path = p[0] == "/" ? p[1..-1] : p
50
+ self.process_path(resp, path, true)
51
+ else
52
+ not_found resp
53
+ end
54
+ resp
55
+ end
56
+
23
57
  # Takes a manifest file and produces a response for it
24
58
  def self.handle_file resp, mf
25
- if mf
26
- if path = mf.process
27
- serve_file resp, path.to_s
28
- else
29
- resp.status = 500
30
- resp.content = "Error compiling #{mf.source}\n"
31
- end
59
+ if path = mf.process
60
+ serve_file resp, path.to_s
32
61
  else
33
- not_found resp
62
+ resp.status = 500
63
+ resp.content = "Error compiling #{mf.source}\n"
34
64
  end
35
65
  resp
36
66
  end
@@ -60,26 +90,5 @@ module Slinky
60
90
  resp.status = 404
61
91
  resp.content = "File not found\n"
62
92
  end
63
-
64
- # Method called for every HTTP request made
65
- def process_http_request
66
- manifest = Server.manifest
67
- resp = EventMachine::DelegatedHttpResponse.new(self)
68
-
69
- begin
70
- path = Server.path_for_uri(@http_request_uri)
71
- rescue
72
- resp.status = 500
73
- resp.content = "Invalid request"
74
- return
75
- end
76
-
77
- file = manifest.find_by_path(path).first
78
- if file.is_a? ManifestDir
79
- file = manifest.find_by_path(path+"/index.html").first
80
- end
81
- resp.content_type MIME::Types.type_for(path).first
82
- Server.handle_file(resp, file).send_response
83
- end
84
93
  end
85
94
  end
data/lib/slinky.rb CHANGED
@@ -1,8 +1,8 @@
1
- ROOT = File.expand_path(File.dirname(__FILE__))
2
1
  require 'uri'
3
2
  require 'yaml'
4
3
  require 'eventmachine'
5
4
  require 'em-proxy'
5
+ require 'em-websocket'
6
6
  require 'evma_httpserver'
7
7
  require 'uri'
8
8
  require 'tempfile'
@@ -11,20 +11,23 @@ require 'optparse'
11
11
  require 'mime/types'
12
12
  require 'yui/compressor'
13
13
  require 'listen'
14
+ require 'multi_json'
14
15
 
15
- require "#{ROOT}/slinky/em-popen3"
16
- require "#{ROOT}/slinky/compilers"
17
- require "#{ROOT}/slinky/config_reader"
18
- require "#{ROOT}/slinky/manifest"
19
- require "#{ROOT}/slinky/compiled_file"
20
- require "#{ROOT}/slinky/proxy_server"
21
- require "#{ROOT}/slinky/server"
22
- require "#{ROOT}/slinky/runner"
23
- require "#{ROOT}/slinky/builder"
24
- require "#{ROOT}/slinky/listener"
16
+ require "slinky/em-popen3"
17
+ require "slinky/compilers"
18
+ require "slinky/config_reader"
19
+ require "slinky/manifest"
20
+ require "slinky/compiled_file"
21
+ require "slinky/proxy_server"
22
+ require "slinky/server"
23
+ require "slinky/runner"
24
+ require "slinky/builder"
25
+ require "slinky/listener"
26
+ require "slinky/live_reload"
25
27
 
26
28
  # load compilers
27
- Dir.glob("#{ROOT}/slinky/compilers/*.rb").each{|compiler|
29
+ root = File.expand_path(File.dirname(__FILE__))
30
+ Dir.glob("#{root}/slinky/compilers/*.rb").each{|compiler|
28
31
  begin
29
32
  require compiler
30
33
  rescue
data/slinky.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "slinky"
8
- s.version = "0.6.1"
8
+ s.version = "0.7.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Micah Wylde"]
12
- s.date = "2012-06-19"
12
+ s.date = "2012-12-21"
13
13
  s.description = "A static file server for rich web apps that automatically compiles SASS, HAML, CoffeeScript and more"
14
14
  s.email = "micah@micahw.com"
15
15
  s.executables = ["slinky"]
@@ -31,13 +31,15 @@ Gem::Specification.new do |s|
31
31
  "lib/slinky/builder.rb",
32
32
  "lib/slinky/compiled_file.rb",
33
33
  "lib/slinky/compilers.rb",
34
+ "lib/slinky/compilers/clojurescript-compiler.rb",
34
35
  "lib/slinky/compilers/coffee-compiler.rb",
35
- "lib/slinky/compilers/coffee-helper",
36
36
  "lib/slinky/compilers/haml-compiler.rb",
37
+ "lib/slinky/compilers/less-compiler.rb",
37
38
  "lib/slinky/compilers/sass-compiler.rb",
38
39
  "lib/slinky/config_reader.rb",
39
40
  "lib/slinky/em-popen3.rb",
40
41
  "lib/slinky/listener.rb",
42
+ "lib/slinky/live_reload.rb",
41
43
  "lib/slinky/manifest.rb",
42
44
  "lib/slinky/proxy_server.rb",
43
45
  "lib/slinky/runner.rb",
@@ -49,7 +51,7 @@ Gem::Specification.new do |s|
49
51
  s.homepage = "http://mwylde.github.com/slinky/"
50
52
  s.licenses = ["MIT"]
51
53
  s.require_paths = ["lib"]
52
- s.rubygems_version = "1.8.10"
54
+ s.rubygems_version = "1.8.24"
53
55
  s.summary = "Static file server for javascript apps"
54
56
 
55
57
  if s.respond_to? :specification_version then
@@ -58,56 +60,56 @@ Gem::Specification.new do |s|
58
60
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
59
61
  s.add_runtime_dependency(%q<eventmachine>, [">= 0.12.0"])
60
62
  s.add_runtime_dependency(%q<eventmachine_httpserver>, [">= 0.2.0"])
63
+ s.add_runtime_dependency(%q<em-websocket>, ["~> 0.3.8"])
61
64
  s.add_runtime_dependency(%q<em-proxy>, [">= 0.1.6"])
62
65
  s.add_runtime_dependency(%q<rainbow>, [">= 1.1.3"])
63
- s.add_runtime_dependency(%q<haml>, [">= 3.0.0"])
64
- s.add_runtime_dependency(%q<sass>, [">= 3.1.1"])
65
- s.add_runtime_dependency(%q<coffee-script>, [">= 2.2.0"])
66
66
  s.add_runtime_dependency(%q<mime-types>, [">= 1.16"])
67
67
  s.add_runtime_dependency(%q<yui-compressor>, [">= 0.9.6"])
68
68
  s.add_runtime_dependency(%q<listen>, [">= 0.4.5"])
69
+ s.add_runtime_dependency(%q<haml>, [">= 3.0.0"])
70
+ s.add_runtime_dependency(%q<sass>, [">= 3.1.1"])
71
+ s.add_runtime_dependency(%q<coffee-script>, [">= 2.2.0"])
69
72
  s.add_development_dependency(%q<rspec>, ["~> 2.10.0"])
70
73
  s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
71
- s.add_development_dependency(%q<bundler>, ["~> 1.1.0"])
74
+ s.add_development_dependency(%q<bundler>, [">= 1.1.0"])
72
75
  s.add_development_dependency(%q<jeweler>, ["~> 1.8.0"])
73
- s.add_development_dependency(%q<cover_me>, [">= 1.0.0.rc6"])
74
76
  s.add_development_dependency(%q<fakefs>, ["~> 0.4.0"])
75
77
  s.add_development_dependency(%q<em-http-request>, ["~> 1.0.0"])
76
78
  else
77
79
  s.add_dependency(%q<eventmachine>, [">= 0.12.0"])
78
80
  s.add_dependency(%q<eventmachine_httpserver>, [">= 0.2.0"])
81
+ s.add_dependency(%q<em-websocket>, ["~> 0.3.8"])
79
82
  s.add_dependency(%q<em-proxy>, [">= 0.1.6"])
80
83
  s.add_dependency(%q<rainbow>, [">= 1.1.3"])
81
- s.add_dependency(%q<haml>, [">= 3.0.0"])
82
- s.add_dependency(%q<sass>, [">= 3.1.1"])
83
- s.add_dependency(%q<coffee-script>, [">= 2.2.0"])
84
84
  s.add_dependency(%q<mime-types>, [">= 1.16"])
85
85
  s.add_dependency(%q<yui-compressor>, [">= 0.9.6"])
86
86
  s.add_dependency(%q<listen>, [">= 0.4.5"])
87
+ s.add_dependency(%q<haml>, [">= 3.0.0"])
88
+ s.add_dependency(%q<sass>, [">= 3.1.1"])
89
+ s.add_dependency(%q<coffee-script>, [">= 2.2.0"])
87
90
  s.add_dependency(%q<rspec>, ["~> 2.10.0"])
88
91
  s.add_dependency(%q<yard>, ["~> 0.6.0"])
89
- s.add_dependency(%q<bundler>, ["~> 1.1.0"])
92
+ s.add_dependency(%q<bundler>, [">= 1.1.0"])
90
93
  s.add_dependency(%q<jeweler>, ["~> 1.8.0"])
91
- s.add_dependency(%q<cover_me>, [">= 1.0.0.rc6"])
92
94
  s.add_dependency(%q<fakefs>, ["~> 0.4.0"])
93
95
  s.add_dependency(%q<em-http-request>, ["~> 1.0.0"])
94
96
  end
95
97
  else
96
98
  s.add_dependency(%q<eventmachine>, [">= 0.12.0"])
97
99
  s.add_dependency(%q<eventmachine_httpserver>, [">= 0.2.0"])
100
+ s.add_dependency(%q<em-websocket>, ["~> 0.3.8"])
98
101
  s.add_dependency(%q<em-proxy>, [">= 0.1.6"])
99
102
  s.add_dependency(%q<rainbow>, [">= 1.1.3"])
100
- s.add_dependency(%q<haml>, [">= 3.0.0"])
101
- s.add_dependency(%q<sass>, [">= 3.1.1"])
102
- s.add_dependency(%q<coffee-script>, [">= 2.2.0"])
103
103
  s.add_dependency(%q<mime-types>, [">= 1.16"])
104
104
  s.add_dependency(%q<yui-compressor>, [">= 0.9.6"])
105
105
  s.add_dependency(%q<listen>, [">= 0.4.5"])
106
+ s.add_dependency(%q<haml>, [">= 3.0.0"])
107
+ s.add_dependency(%q<sass>, [">= 3.1.1"])
108
+ s.add_dependency(%q<coffee-script>, [">= 2.2.0"])
106
109
  s.add_dependency(%q<rspec>, ["~> 2.10.0"])
107
110
  s.add_dependency(%q<yard>, ["~> 0.6.0"])
108
- s.add_dependency(%q<bundler>, ["~> 1.1.0"])
111
+ s.add_dependency(%q<bundler>, [">= 1.1.0"])
109
112
  s.add_dependency(%q<jeweler>, ["~> 1.8.0"])
110
- s.add_dependency(%q<cover_me>, [">= 1.0.0.rc6"])
111
113
  s.add_dependency(%q<fakefs>, ["~> 0.4.0"])
112
114
  s.add_dependency(%q<em-http-request>, ["~> 1.0.0"])
113
115
  end