slinky 0.6.1 → 0.7.0

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.
@@ -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