slinky 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.0
1
+ 0.4.2
data/bin/slinky CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  root = File.expand_path(File.dirname(__FILE__))
4
4
 
5
- require "#{root}/../lib/slinky"
6
- #require 'slinky'
5
+ #require "#{root}/../lib/slinky"
6
+ require 'slinky'
7
7
 
8
8
  Slinky::Runner.new(ARGV).run
@@ -1,7 +1,7 @@
1
1
  module Slinky
2
2
  class Builder
3
- def self.build dir, build_dir
4
- manifest = Manifest.new(dir, :build_to => build_dir, :devel => false)
3
+ def self.build dir, build_dir, config
4
+ manifest = Manifest.new(dir, config, :build_to => build_dir, :devel => false)
5
5
  manifest.build
6
6
  end
7
7
  end
@@ -0,0 +1,23 @@
1
+ module Slinky
2
+ class ConfigReader
3
+ def self.from_file path
4
+ new File.open(path).read
5
+ end
6
+
7
+ def self.empty
8
+ new "{}"
9
+ end
10
+
11
+ def initialize string
12
+ @config = YAML::load(string)
13
+ end
14
+
15
+ def proxies
16
+ @config["proxies"]
17
+ end
18
+
19
+ def ignore
20
+ @config["ignore"] || []
21
+ end
22
+ end
23
+ end
@@ -21,24 +21,31 @@ module Slinky
21
21
  class Manifest
22
22
  attr_accessor :manifest_dir, :dir
23
23
 
24
- def initialize dir, options = {}
24
+ def initialize dir, config, options = {}
25
25
  @dir = dir
26
26
  @build_to = if d = options[:build_to]
27
27
  File.absolute_path(d)
28
28
  else
29
29
  dir
30
30
  end
31
- @manifest_dir = ManifestDir.new dir, @build_to, self
31
+ @manifest_dir = ManifestDir.new dir, self, @build_to, self
32
32
  @devel = (options[:devel].nil?) ? true : options[:devel]
33
+ @config = config
33
34
  end
34
35
 
35
36
  # Returns a list of all files contained in this manifest
36
37
  #
37
38
  # @return [ManifestFile] a list of manifest files
38
- def files
39
- @files = []
40
- files_rec @manifest_dir
41
- @files
39
+ def files include_ignores = true
40
+ unless @files
41
+ @files = []
42
+ files_rec @manifest_dir
43
+ end
44
+ if include_ignores
45
+ @files
46
+ else
47
+ @files.reject{|f| @config.ignore.any?{|p| f.in_tree? p}}
48
+ end
42
49
  end
43
50
 
44
51
  # Finds the file at the given path in the manifest if one exists,
@@ -109,7 +116,7 @@ module Slinky
109
116
  # @return [[ManifestFile, ManifestFile]] the graph
110
117
  def build_dependency_graph
111
118
  graph = []
112
- files.each{|mf|
119
+ files(false).each{|mf|
113
120
  mf.directives[:slinky_require].each{|rf|
114
121
  required = mf.parent.find_by_path(rf)
115
122
  if required
@@ -134,11 +141,11 @@ module Slinky
134
141
  # will contain sorted elements
135
142
  l = []
136
143
  # start nodes, those with no incoming edges
137
- s = @files.reject{|mf| mf.directives[:slinky_require]}
144
+ s = files(false).reject{|mf| mf.directives[:slinky_require]}
138
145
  while s.size > 0
139
146
  n = s.delete s.first
140
147
  l << n
141
- @files.each{|m|
148
+ files(false).each{|m|
142
149
  e = graph.find{|e| e[0] == n && e[1] == m}
143
150
  next unless e
144
151
  graph.delete e
@@ -171,9 +178,10 @@ module Slinky
171
178
  end
172
179
 
173
180
  class ManifestDir
174
- attr_accessor :dir, :files, :children
175
- def initialize dir, build_dir, manifest
181
+ attr_accessor :dir, :parent, :files, :children
182
+ def initialize dir, parent, build_dir, manifest
176
183
  @dir = dir
184
+ @parent = parent
177
185
  @files = []
178
186
  @children = []
179
187
  @build_dir = Pathname.new(build_dir)
@@ -184,7 +192,7 @@ module Slinky
184
192
  next if Pathname.new(File.absolute_path(path)) == Pathname.new(build_dir)
185
193
  if File.directory? path
186
194
  build_dir = (@build_dir + File.basename(path)).cleanpath
187
- @children << ManifestDir.new(path, build_dir, manifest)
195
+ @children << ManifestDir.new(path, self, build_dir, manifest)
188
196
  else
189
197
  @files << ManifestFile.new(path, @build_dir, manifest, self)
190
198
  end
@@ -205,10 +213,14 @@ module Slinky
205
213
  when 1
206
214
  @files.find{|f| f.matches? components[0]}
207
215
  else
208
- child = @children.find{|d|
209
- Pathname.new(d.dir).basename.to_s == components[0]
210
- }
211
- child ? child.find_by_path(components[1..-1].join(File::SEPARATOR)) : nil
216
+ if components[0] == ".."
217
+ @parent.find_by_path components[1..-1].join(File::SEPARATOR)
218
+ else
219
+ child = @children.find{|d|
220
+ Pathname.new(d.dir).basename.to_s == components[0]
221
+ }
222
+ child ? child.find_by_path(components[1..-1].join(File::SEPARATOR)) : nil
223
+ end
212
224
  end
213
225
  end
214
226
 
@@ -252,6 +264,16 @@ module Slinky
252
264
  name == s || output_path.basename.to_s == s
253
265
  end
254
266
 
267
+ # Predicate which determines whether the file is the supplied path
268
+ # or lies on supplied tree
269
+ def in_tree? path
270
+ return true if matches? path
271
+ abs_path = Pathname.new(path).expand_path.to_s
272
+ asdf = Pathname.new(@source).dirname.expand_path.to_s
273
+ # puts [abs_path, asdf, asdf.start_with?(abs_path), abs_path == asdf].inspect
274
+ asdf.start_with?(abs_path)
275
+ end
276
+
255
277
  # Returns the path to which this file should be output. This is
256
278
  # equal to the source path unless the file needs to be compiled,
257
279
  # in which case the extension returned is the output extension
@@ -0,0 +1,74 @@
1
+ module Slinky
2
+ module ProxyServer
3
+ HTTP_MATCHER = /(GET|POST|PUT|DELETE|HEAD) (.+?)(?= HTTP)/
4
+ HOST_MATCHER = /Host: (.+)/
5
+
6
+ def self.process_proxies proxy_hash
7
+ proxy_hash.map{|from, to|
8
+ begin
9
+ [from, URI::parse(to)]
10
+ rescue
11
+ $stderr.puts "Invalid proxy setting: #{from} => #{to}".foreground(:red)
12
+ end
13
+ }.compact
14
+ end
15
+
16
+ def self.process_proxy_servers proxies
17
+ proxies_servers = proxies.map{|p| [p[1].host, p[1].port]}
18
+ end
19
+
20
+ def self.find_matcher proxies, path
21
+ proxies.find{|p| path.start_with?(p[0])}
22
+ end
23
+
24
+ def self.replace_path http, old_path, new_path, addition
25
+ # TODO: This may fail in certain, rare cases
26
+ addition = addition[0..-2] if addition[-1] == "/"
27
+ http.gsub(old_path, addition + new_path)
28
+ end
29
+
30
+ def self.replace_host http, host
31
+ http.gsub(HOST_MATCHER, "Host: #{host}")
32
+ end
33
+
34
+ def self.run proxy_hash, port, slinky_port
35
+ proxies = process_proxies proxy_hash
36
+ proxy_servers = process_proxy_servers proxies
37
+
38
+ Proxy.start(:host => "0.0.0.0", :port => port){|conn|
39
+ conn.server :slinky, :host => "127.0.0.1", :port => slinky_port
40
+ proxy_servers.each{|p|
41
+ conn.server p, :host => p[0], :port => p[1]
42
+ }
43
+
44
+ conn.on_data do |data|
45
+ begin
46
+ _, path = data.match(ProxyServer::HTTP_MATCHER)[1..2]
47
+ proxy = ProxyServer.find_matcher(proxies, path)
48
+ server = if proxy
49
+ new_path = path.gsub(/^#{proxy[0]}/, "")
50
+ data = ProxyServer.replace_path(data, path, new_path, proxy[1].path)
51
+ new_host = proxy[1].select(:host, :port).join(":")
52
+ data = ProxyServer.replace_host(data, new_host)
53
+ puts [data, [proxy[1].host, proxy[1].port]].inspect
54
+ [proxy[1].host, proxy[1].port]
55
+ else :slinky
56
+ end
57
+ [data, [server]]
58
+ rescue
59
+ $stderr.puts "Got error: #{$!}".foreground(:red)
60
+ conn.send_data "HTTP/1.1 500 Ooops...something went wrong\r\n"
61
+ end
62
+ end
63
+
64
+ conn.on_response do |server, resp|
65
+ resp
66
+ end
67
+
68
+ conn.on_finish do |name|
69
+ unbind
70
+ end
71
+ }
72
+ end
73
+ end
74
+ end
data/lib/slinky/runner.rb CHANGED
@@ -15,7 +15,11 @@ module Slinky
15
15
  @arguments = @argv
16
16
 
17
17
  config_path = "#{@options[:src_dir]}/slinky.yaml"
18
- @config = ConfigReader.from_file(config_path) if File.exist?(config_path)
18
+ @config = if File.exist?(config_path)
19
+ ConfigReader.from_file(config_path)
20
+ else
21
+ ConfigReader.empty
22
+ end
19
23
  end
20
24
 
21
25
  def version
@@ -53,6 +57,7 @@ module Slinky
53
57
 
54
58
  EM::run {
55
59
  Slinky::Server.dir = @options[:src_dir]
60
+ Slinky::Server.config = @config
56
61
  if @config && @config.proxies && !@options[:no_proxy]
57
62
  server = EM::start_server "127.0.0.1", 5324, Slinky::Server
58
63
  ProxyServer.run(@config.proxies, @options[:port], 5324)
@@ -64,7 +69,7 @@ module Slinky
64
69
  end
65
70
 
66
71
  def command_build
67
- Builder.build(@options[:src_dir], @options[:build_dir])
72
+ Builder.build(@options[:src_dir], @options[:build_dir], @config)
68
73
  end
69
74
  end
70
75
  end
data/lib/slinky/server.rb CHANGED
@@ -7,6 +7,9 @@ module Slinky
7
7
  # Gets the root directory from which files should be served
8
8
  def self.dir; @dir || "."; end
9
9
 
10
+ def self.config= _config; @config = _config; end
11
+ def self.config; @config || {}; end
12
+
10
13
  # Splits a uri into its components, returning only the path sans
11
14
  # initial forward slash.
12
15
  def self.path_for_uri uri
@@ -21,7 +24,7 @@ module Slinky
21
24
  serve_file resp, path.to_s
22
25
  else
23
26
  resp.status = 500
24
- resp.content = "Error compiling #{mf.source}"
27
+ resp.content = "Error compiling #{mf.source}\n"
25
28
  end
26
29
  else
27
30
  not_found resp
@@ -52,12 +55,12 @@ module Slinky
52
55
  # Returns the proper response for files that do not exist
53
56
  def self.not_found resp
54
57
  resp.status = 404
55
- resp.content = "File not found"
58
+ resp.content = "File not found\n"
56
59
  end
57
60
 
58
61
  # Method called for every HTTP request made
59
62
  def process_http_request
60
- @manifest = Manifest.new(Server.dir)
63
+ @manifest = Manifest.new(Server.dir, Server.config)
61
64
 
62
65
  path = Server.path_for_uri(@http_request_uri)
63
66
  file = @manifest.find_by_path(path)
data/lib/slinky.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  ROOT = File.expand_path(File.dirname(__FILE__))
2
-
2
+ require "bundler/setup"
3
3
  require 'uri'
4
4
  require 'yaml'
5
5
  require 'eventmachine'
data/slinky.gemspec CHANGED
@@ -5,15 +5,14 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{slinky}
8
- s.version = "0.4.1"
8
+ s.version = "0.4.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["mwylde"]
12
- s.date = %q{2011-08-19}
13
- s.default_executable = %q{slinky}
11
+ s.authors = [%q{mwylde}]
12
+ s.date = %q{2011-09-15}
14
13
  s.description = %q{A static file server for rich javascript apps that automatically compiles SASS, HAML, CoffeeScript and more}
15
14
  s.email = %q{mwylde@wesleyan.edu}
16
- s.executables = ["slinky"]
15
+ s.executables = [%q{slinky}]
17
16
  s.extra_rdoc_files = [
18
17
  "LICENSE.txt",
19
18
  "README.md"
@@ -35,8 +34,10 @@ Gem::Specification.new do |s|
35
34
  "lib/slinky/compilers/coffee-helper",
36
35
  "lib/slinky/compilers/haml-compiler.rb",
37
36
  "lib/slinky/compilers/sass-compiler.rb",
37
+ "lib/slinky/config_reader.rb",
38
38
  "lib/slinky/em-popen3.rb",
39
39
  "lib/slinky/manifest.rb",
40
+ "lib/slinky/proxy_server.rb",
40
41
  "lib/slinky/runner.rb",
41
42
  "lib/slinky/server.rb",
42
43
  "slinky.gemspec",
@@ -44,9 +45,9 @@ Gem::Specification.new do |s|
44
45
  "spec/spec_helper.rb"
45
46
  ]
46
47
  s.homepage = %q{http://github.com/mwylde/slinky}
47
- s.licenses = ["MIT"]
48
- s.require_paths = ["lib"]
49
- s.rubygems_version = %q{1.6.2}
48
+ s.licenses = [%q{MIT}]
49
+ s.require_paths = [%q{lib}]
50
+ s.rubygems_version = %q{1.8.6}
50
51
  s.summary = %q{Static file server for javascript apps}
51
52
  s.test_files = [
52
53
  "spec/slinky_spec.rb",
@@ -59,6 +60,7 @@ Gem::Specification.new do |s|
59
60
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
60
61
  s.add_runtime_dependency(%q<eventmachine>, [">= 0.12.0"])
61
62
  s.add_runtime_dependency(%q<eventmachine_httpserver>, [">= 0.2.0"])
63
+ s.add_runtime_dependency(%q<em-proxy>, [">= 0.1.5"])
62
64
  s.add_runtime_dependency(%q<rainbow>, [">= 1.1.1"])
63
65
  s.add_runtime_dependency(%q<haml>, [">= 3.0.0"])
64
66
  s.add_runtime_dependency(%q<sass>, [">= 3.1.1"])
@@ -75,6 +77,7 @@ Gem::Specification.new do |s|
75
77
  else
76
78
  s.add_dependency(%q<eventmachine>, [">= 0.12.0"])
77
79
  s.add_dependency(%q<eventmachine_httpserver>, [">= 0.2.0"])
80
+ s.add_dependency(%q<em-proxy>, [">= 0.1.5"])
78
81
  s.add_dependency(%q<rainbow>, [">= 1.1.1"])
79
82
  s.add_dependency(%q<haml>, [">= 3.0.0"])
80
83
  s.add_dependency(%q<sass>, [">= 3.1.1"])
@@ -92,6 +95,7 @@ Gem::Specification.new do |s|
92
95
  else
93
96
  s.add_dependency(%q<eventmachine>, [">= 0.12.0"])
94
97
  s.add_dependency(%q<eventmachine_httpserver>, [">= 0.2.0"])
98
+ s.add_dependency(%q<em-proxy>, [">= 0.1.5"])
95
99
  s.add_dependency(%q<rainbow>, [">= 1.1.1"])
96
100
  s.add_dependency(%q<haml>, [">= 3.0.0"])
97
101
  s.add_dependency(%q<sass>, [">= 3.1.1"])
data/spec/slinky_spec.rb CHANGED
@@ -18,8 +18,8 @@ describe "Slinky" do
18
18
 
19
19
  context "Manifest" do
20
20
  before :each do
21
- @mprod = Slinky::Manifest.new("/src", :devel => false, :build_to => "/build")
22
- @mdevel = Slinky::Manifest.new("/src")
21
+ @mprod = Slinky::Manifest.new("/src", @config, :devel => false, :build_to => "/build")
22
+ @mdevel = Slinky::Manifest.new("/src", @config)
23
23
  @md_prod = @mprod.manifest_dir
24
24
  @md_devel = @mdevel.manifest_dir
25
25
  end
@@ -43,6 +43,8 @@ describe "Slinky" do
43
43
  @mdevel.find_by_path("asdf.haml").should == nil
44
44
  @mdevel.find_by_path("l1/l2/test.txt").source.should == "/src/l1/l2/test.txt"
45
45
  @mdevel.find_by_path("l1/test.css").source.should == "/src/l1/test.sass"
46
+ l1 = @mdevel.manifest_dir.children.find{|c| c.dir == "/src/l1"}
47
+ l1.find_by_path("../test.haml").source.should == "/src/test.haml"
46
48
  end
47
49
 
48
50
  it "should produce the correct scripts string for production" do
@@ -61,7 +63,7 @@ describe "Slinky" do
61
63
  File.open("/src/l1/l2/bad.sass", "w+"){|f|
62
64
  f.write "require('../test.sass')\ncolor: red;"
63
65
  }
64
- manifest = Slinky::Manifest.new("/src")
66
+ manifest = Slinky::Manifest.new("/src", @config)
65
67
  @mdevel.styles_string.should == '<link rel="stylesheet" href="l1/test.css" /><link rel="stylesheet" href="l1/l2/test2.css" />'
66
68
  end
67
69
 
@@ -172,7 +174,7 @@ describe "Slinky" do
172
174
 
173
175
  it "should fail if a required file isn't in the manifest" do
174
176
  FileUtils.rm("/src/l1/test2.js")
175
- manifest = Slinky::Manifest.new("/src", :devel => false, :build_to => "/build")
177
+ manifest = Slinky::Manifest.new("/src", @config, :devel => false, :build_to => "/build")
176
178
  $stderr.should_receive(:puts).with("Could not find file test2.js required by /src/l1/test.js".foreground(:red))
177
179
  proc {
178
180
  manifest.build_dependency_graph
@@ -185,17 +187,17 @@ describe "Slinky" do
185
187
 
186
188
  it "should fail if there is a cycle in the dependency graph" do
187
189
  File.open("/src/l1/test5.js", "w+"){|f| f.write("slinky_require('test.js')")}
188
- manifest = Slinky::Manifest.new("/src", :devel => false, :build_to => "/build")
190
+ manifest = Slinky::Manifest.new("/src", @config, :devel => false, :build_to => "/build")
189
191
  $stderr.should_receive(:puts).with("Dependencies /src/l1/test2.js -> /src/l1/test.js, /src/l1/test5.js -> /src/l1/test2.js, /src/l1/test.js -> /src/l1/test5.js could not be satisfied".foreground(:red))
190
192
  proc { manifest.dependency_list }.should raise_error Slinky::DependencyError
191
193
  end
192
194
 
193
195
  it "should ignore the build directory" do
194
196
  $stdout.should_receive(:puts).with(/Compiled \/src\/.+/).exactly(6).times
195
- Slinky::Builder.build("/src", "/src/build")
197
+ Slinky::Builder.build("/src", "/src/build", @config)
196
198
  File.exists?("/src/build/build").should_not == true
197
199
  File.exists?("/src/build/test.html").should == true
198
- Slinky::Builder.build("/src", "/src/build")
200
+ Slinky::Builder.build("/src", "/src/build", @config)
199
201
  File.exists?("/src/build/build").should_not == true
200
202
  end
201
203
 
@@ -246,7 +248,7 @@ describe "Slinky" do
246
248
  it "should serve 404s" do
247
249
  @resp.should_receive(:status=).with(404)
248
250
  Slinky::Server.serve_file @resp, "/src/asdf/faljshd"
249
- @resp.content.should == "File not found"
251
+ @resp.content.should == "File not found\n"
250
252
  end
251
253
 
252
254
  it "should handle static files" do
@@ -266,7 +268,7 @@ describe "Slinky" do
266
268
  mf = Slinky::ManifestFile.new("/src/l1/asdf.txt", nil, @mdevel)
267
269
  @resp.should_receive(:status=).with(404)
268
270
  Slinky::Server.handle_file @resp, mf
269
- @resp.content.should == "File not found"
271
+ @resp.content.should == "File not found\n"
270
272
  end
271
273
 
272
274
  it "should accept a port option" do
@@ -306,7 +308,7 @@ describe "Slinky" do
306
308
  end
307
309
  it "should build manifest to build directory" do
308
310
  $stdout.should_receive(:puts).with(/Compiled \/src\/.+/).exactly(3).times
309
- Slinky::Builder.build("/src", "/build")
311
+ Slinky::Builder.build("/src", "/build", @config)
310
312
  File.exists?("/build").should == true
311
313
  File.exists?("/build/scripts.js").should == true
312
314
  File.exists?("/build/l1/l2/test.txt").should == true
data/spec/spec_helper.rb CHANGED
@@ -35,6 +35,7 @@ RSpec.configure do |config|
35
35
  config.before :all do
36
36
  FakeFS.activate!
37
37
  FileUtils.mkdir("/tmp")
38
+ @config = Slinky::ConfigReader.empty
38
39
  end
39
40
  config.before :each do
40
41
  FileUtils.rm_rf("/src") rescue nil
metadata CHANGED
@@ -1,193 +1,202 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: slinky
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.2
4
5
  prerelease:
5
- version: 0.4.1
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - mwylde
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-08-19 00:00:00 -07:00
14
- default_executable: slinky
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
12
+ date: 2011-09-15 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
17
15
  name: eventmachine
18
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &70247105720180 !ruby/object:Gem::Requirement
19
17
  none: false
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
23
21
  version: 0.12.0
24
22
  type: :runtime
25
23
  prerelease: false
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
24
+ version_requirements: *70247105720180
25
+ - !ruby/object:Gem::Dependency
28
26
  name: eventmachine_httpserver
29
- requirement: &id002 !ruby/object:Gem::Requirement
27
+ requirement: &70247105719700 !ruby/object:Gem::Requirement
30
28
  none: false
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
34
32
  version: 0.2.0
35
33
  type: :runtime
36
34
  prerelease: false
37
- version_requirements: *id002
38
- - !ruby/object:Gem::Dependency
35
+ version_requirements: *70247105719700
36
+ - !ruby/object:Gem::Dependency
37
+ name: em-proxy
38
+ requirement: &70247105719220 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: 0.1.5
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70247105719220
47
+ - !ruby/object:Gem::Dependency
39
48
  name: rainbow
40
- requirement: &id003 !ruby/object:Gem::Requirement
49
+ requirement: &70247105718740 !ruby/object:Gem::Requirement
41
50
  none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
45
54
  version: 1.1.1
46
55
  type: :runtime
47
56
  prerelease: false
48
- version_requirements: *id003
49
- - !ruby/object:Gem::Dependency
57
+ version_requirements: *70247105718740
58
+ - !ruby/object:Gem::Dependency
50
59
  name: haml
51
- requirement: &id004 !ruby/object:Gem::Requirement
60
+ requirement: &70247105718260 !ruby/object:Gem::Requirement
52
61
  none: false
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
56
65
  version: 3.0.0
57
66
  type: :runtime
58
67
  prerelease: false
59
- version_requirements: *id004
60
- - !ruby/object:Gem::Dependency
68
+ version_requirements: *70247105718260
69
+ - !ruby/object:Gem::Dependency
61
70
  name: sass
62
- requirement: &id005 !ruby/object:Gem::Requirement
71
+ requirement: &70247105717780 !ruby/object:Gem::Requirement
63
72
  none: false
64
- requirements:
65
- - - ">="
66
- - !ruby/object:Gem::Version
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
67
76
  version: 3.1.1
68
77
  type: :runtime
69
78
  prerelease: false
70
- version_requirements: *id005
71
- - !ruby/object:Gem::Dependency
79
+ version_requirements: *70247105717780
80
+ - !ruby/object:Gem::Dependency
72
81
  name: coffee-script
73
- requirement: &id006 !ruby/object:Gem::Requirement
82
+ requirement: &70247105717300 !ruby/object:Gem::Requirement
74
83
  none: false
75
- requirements:
76
- - - ">="
77
- - !ruby/object:Gem::Version
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
78
87
  version: 2.2.0
79
88
  type: :runtime
80
89
  prerelease: false
81
- version_requirements: *id006
82
- - !ruby/object:Gem::Dependency
90
+ version_requirements: *70247105717300
91
+ - !ruby/object:Gem::Dependency
83
92
  name: mime-types
84
- requirement: &id007 !ruby/object:Gem::Requirement
93
+ requirement: &70247105733180 !ruby/object:Gem::Requirement
85
94
  none: false
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: "1.16"
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '1.16'
90
99
  type: :runtime
91
100
  prerelease: false
92
- version_requirements: *id007
93
- - !ruby/object:Gem::Dependency
101
+ version_requirements: *70247105733180
102
+ - !ruby/object:Gem::Dependency
94
103
  name: yui-compressor
95
- requirement: &id008 !ruby/object:Gem::Requirement
104
+ requirement: &70247105732700 !ruby/object:Gem::Requirement
96
105
  none: false
97
- requirements:
98
- - - ">="
99
- - !ruby/object:Gem::Version
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
100
109
  version: 0.9.6
101
110
  type: :runtime
102
111
  prerelease: false
103
- version_requirements: *id008
104
- - !ruby/object:Gem::Dependency
112
+ version_requirements: *70247105732700
113
+ - !ruby/object:Gem::Dependency
105
114
  name: rspec
106
- requirement: &id009 !ruby/object:Gem::Requirement
115
+ requirement: &70247105732220 !ruby/object:Gem::Requirement
107
116
  none: false
108
- requirements:
117
+ requirements:
109
118
  - - ~>
110
- - !ruby/object:Gem::Version
119
+ - !ruby/object:Gem::Version
111
120
  version: 2.3.0
112
121
  type: :development
113
122
  prerelease: false
114
- version_requirements: *id009
115
- - !ruby/object:Gem::Dependency
123
+ version_requirements: *70247105732220
124
+ - !ruby/object:Gem::Dependency
116
125
  name: yard
117
- requirement: &id010 !ruby/object:Gem::Requirement
126
+ requirement: &70247105731740 !ruby/object:Gem::Requirement
118
127
  none: false
119
- requirements:
128
+ requirements:
120
129
  - - ~>
121
- - !ruby/object:Gem::Version
130
+ - !ruby/object:Gem::Version
122
131
  version: 0.6.0
123
132
  type: :development
124
133
  prerelease: false
125
- version_requirements: *id010
126
- - !ruby/object:Gem::Dependency
134
+ version_requirements: *70247105731740
135
+ - !ruby/object:Gem::Dependency
127
136
  name: bundler
128
- requirement: &id011 !ruby/object:Gem::Requirement
137
+ requirement: &70247105731260 !ruby/object:Gem::Requirement
129
138
  none: false
130
- requirements:
139
+ requirements:
131
140
  - - ~>
132
- - !ruby/object:Gem::Version
141
+ - !ruby/object:Gem::Version
133
142
  version: 1.0.0
134
143
  type: :development
135
144
  prerelease: false
136
- version_requirements: *id011
137
- - !ruby/object:Gem::Dependency
145
+ version_requirements: *70247105731260
146
+ - !ruby/object:Gem::Dependency
138
147
  name: jeweler
139
- requirement: &id012 !ruby/object:Gem::Requirement
148
+ requirement: &70247105730780 !ruby/object:Gem::Requirement
140
149
  none: false
141
- requirements:
150
+ requirements:
142
151
  - - ~>
143
- - !ruby/object:Gem::Version
152
+ - !ruby/object:Gem::Version
144
153
  version: 1.5.2
145
154
  type: :development
146
155
  prerelease: false
147
- version_requirements: *id012
148
- - !ruby/object:Gem::Dependency
156
+ version_requirements: *70247105730780
157
+ - !ruby/object:Gem::Dependency
149
158
  name: cover_me
150
- requirement: &id013 !ruby/object:Gem::Requirement
159
+ requirement: &70247105730300 !ruby/object:Gem::Requirement
151
160
  none: false
152
- requirements:
153
- - - ">="
154
- - !ruby/object:Gem::Version
161
+ requirements:
162
+ - - ! '>='
163
+ - !ruby/object:Gem::Version
155
164
  version: 1.0.0.rc6
156
165
  type: :development
157
166
  prerelease: false
158
- version_requirements: *id013
159
- - !ruby/object:Gem::Dependency
167
+ version_requirements: *70247105730300
168
+ - !ruby/object:Gem::Dependency
160
169
  name: fakefs
161
- requirement: &id014 !ruby/object:Gem::Requirement
170
+ requirement: &70247105729820 !ruby/object:Gem::Requirement
162
171
  none: false
163
- requirements:
164
- - - ">="
165
- - !ruby/object:Gem::Version
166
- version: "0"
172
+ requirements:
173
+ - - ! '>='
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
167
176
  type: :development
168
177
  prerelease: false
169
- version_requirements: *id014
170
- - !ruby/object:Gem::Dependency
178
+ version_requirements: *70247105729820
179
+ - !ruby/object:Gem::Dependency
171
180
  name: em-http-request
172
- requirement: &id015 !ruby/object:Gem::Requirement
181
+ requirement: &70247105729340 !ruby/object:Gem::Requirement
173
182
  none: false
174
- requirements:
175
- - - ">="
176
- - !ruby/object:Gem::Version
177
- version: "0"
183
+ requirements:
184
+ - - ! '>='
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
178
187
  type: :development
179
188
  prerelease: false
180
- version_requirements: *id015
181
- description: A static file server for rich javascript apps that automatically compiles SASS, HAML, CoffeeScript and more
189
+ version_requirements: *70247105729340
190
+ description: A static file server for rich javascript apps that automatically compiles
191
+ SASS, HAML, CoffeeScript and more
182
192
  email: mwylde@wesleyan.edu
183
- executables:
193
+ executables:
184
194
  - slinky
185
195
  extensions: []
186
-
187
- extra_rdoc_files:
196
+ extra_rdoc_files:
188
197
  - LICENSE.txt
189
198
  - README.md
190
- files:
199
+ files:
191
200
  - .document
192
201
  - .rspec
193
202
  - Gemfile
@@ -204,44 +213,43 @@ files:
204
213
  - lib/slinky/compilers/coffee-helper
205
214
  - lib/slinky/compilers/haml-compiler.rb
206
215
  - lib/slinky/compilers/sass-compiler.rb
216
+ - lib/slinky/config_reader.rb
207
217
  - lib/slinky/em-popen3.rb
208
218
  - lib/slinky/manifest.rb
219
+ - lib/slinky/proxy_server.rb
209
220
  - lib/slinky/runner.rb
210
221
  - lib/slinky/server.rb
211
222
  - slinky.gemspec
212
223
  - spec/slinky_spec.rb
213
224
  - spec/spec_helper.rb
214
- has_rdoc: true
215
225
  homepage: http://github.com/mwylde/slinky
216
- licenses:
226
+ licenses:
217
227
  - MIT
218
228
  post_install_message:
219
229
  rdoc_options: []
220
-
221
- require_paths:
230
+ require_paths:
222
231
  - lib
223
- required_ruby_version: !ruby/object:Gem::Requirement
232
+ required_ruby_version: !ruby/object:Gem::Requirement
224
233
  none: false
225
- requirements:
226
- - - ">="
227
- - !ruby/object:Gem::Version
228
- hash: 1095209777694119011
229
- segments:
234
+ requirements:
235
+ - - ! '>='
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
238
+ segments:
230
239
  - 0
231
- version: "0"
232
- required_rubygems_version: !ruby/object:Gem::Requirement
240
+ hash: -2066251034160361517
241
+ required_rubygems_version: !ruby/object:Gem::Requirement
233
242
  none: false
234
- requirements:
235
- - - ">="
236
- - !ruby/object:Gem::Version
237
- version: "0"
243
+ requirements:
244
+ - - ! '>='
245
+ - !ruby/object:Gem::Version
246
+ version: '0'
238
247
  requirements: []
239
-
240
248
  rubyforge_project:
241
- rubygems_version: 1.6.2
249
+ rubygems_version: 1.8.6
242
250
  signing_key:
243
251
  specification_version: 3
244
252
  summary: Static file server for javascript apps
245
- test_files:
253
+ test_files:
246
254
  - spec/slinky_spec.rb
247
255
  - spec/spec_helper.rb