seaweed 0.1.0 → 0.1.1

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.
@@ -10,12 +10,13 @@ class RequiredFiles < Hash
10
10
  def add name
11
11
  file_name = full_path name
12
12
  if file_name && !self[name.to_sym]
13
- requirements = find_requirements file_name
13
+ directives = parse_directives file_name
14
14
  self[name.to_sym] = {
15
15
  :file_name => file_name,
16
- :requires => requirements
16
+ :requires => directives['require']
17
17
  }
18
- requirements.each { |requirement| add requirement }
18
+ requested = (directives['require'] | directives['request'])
19
+ requested.each{ |file| add file }
19
20
  end
20
21
  end
21
22
 
@@ -33,21 +34,24 @@ class RequiredFiles < Hash
33
34
  file_path && "#{file_path}/#{name}.coffee"
34
35
  end
35
36
 
36
- # Scans a coffeescript file for requirement directives.
37
+ # Scans a coffeescript file for #require and #request directives.
37
38
  #
38
39
  # Example requirement directives:
39
40
  # #require ST
40
41
  # #require ST/Model/Index
41
- def find_requirements name
42
- requirements = []
42
+ def parse_directives name
43
+ directives = {
44
+ 'require' => [],
45
+ 'request' => []
46
+ }
43
47
  File.open name do |file|
44
48
  file.each do |line|
45
- if line.match /^#require\s+(\S+)\s*$/
46
- requirements << $1
49
+ if line.match /^#(require|request)\s+(\S+)\s*$/
50
+ directives[$1] << $2
47
51
  end
48
52
  end
49
53
  end
50
- requirements
54
+ directives
51
55
  end
52
56
 
53
57
  # Callback functions for tsort
data/server/server.rb CHANGED
@@ -3,6 +3,7 @@ require 'sinatra'
3
3
  require 'slim'
4
4
  require 'coffee-script'
5
5
 
6
+ # Patch in Sinatra support for Slim
6
7
  module Sinatra
7
8
  module Templates
8
9
  def slim(template, options={}, locals={})
@@ -11,23 +12,38 @@ module Sinatra
11
12
  end
12
13
  end
13
14
 
15
+ # Configure slim for prettier code formatting
14
16
  Slim::Engine.set_default_options :pretty => true
15
17
 
18
+ # Hide redundant log messages
19
+ disable :logging
20
+
21
+ # Dynamically compiles coffeescript, first checking to see if it has changed
16
22
  def compile source, target
17
23
  begin
24
+ # Get modified time of source file
18
25
  mtime = File.mtime source
19
-
26
+
27
+ # If compled JavaScript file already exists and is up to date, return the
28
+ # existing file instead of compiling again
20
29
  return File.read target if File.exists?(target) && File.mtime(target) == mtime
21
30
 
31
+ # Create base dir for compiled file
22
32
  dir = target.sub /\/[^\/]+$/, ''
23
33
  Dir.mkdir dir unless File.exists? dir
34
+
35
+ # Compile CoffeeScript to JavaScript file
24
36
  File.open target, 'w' do |f|
25
37
  f.write CoffeeScript.compile(File.read source)
26
38
  end
39
+
40
+ # Mark compiled file with same modified date as source
27
41
  File.utime mtime, mtime, target
28
42
 
43
+ # Return our newly compiled JavaScript
29
44
  File.read target
30
45
  rescue CoffeeScript::CompilationError => e
46
+ # Display CoffeeScript compilation error in a prettier format
31
47
  message = if e.message.match /^SyntaxError: (.*) on line (\d+)\D*$/
32
48
  "#{source}:#{$2}".ljust(40) + " #{$1}"
33
49
  elsif e.message.match /^Parse error on line (\d+): (.*)$/
@@ -36,24 +52,31 @@ def compile source, target
36
52
  "#{source} - #{e.message}"
37
53
  end
38
54
  puts "\e[31m#{message}\e[0m"
55
+
56
+ # Generate JS to display compilation error on HTML page
39
57
  html = "<pre class=\"failed\">#{message}</pre>"
40
58
  "$(function(){$(document.body).prepend(#{html.to_json});});"
41
59
  end
42
60
  end
43
61
 
62
+ # Processes request for seaweed Spec library
44
63
  get "/Spec.js" do
45
64
  compile File.expand_path('../../lib/Spec.coffee', __FILE__), "compiled/spec.js"
46
65
  end
47
66
 
67
+ # Processes request for project lib files
48
68
  get %r{^/lib/(.+)\.js$} do |file|
49
69
  compile "lib/#{file}.coffee", "compiled/#{file}.js"
50
70
  end
51
71
 
72
+ # Processes request for project spec files
52
73
  get %r{^/spec/(.+)\.js$} do |file|
53
74
  compile "spec/#{file}.coffee", "compiled/#{file}.js"
54
75
  end
55
76
 
77
+ # Processes request for page index
56
78
  get "/" do
79
+ # Build ordered list of required files to run all specs
57
80
  requirements = RequiredFiles.new
58
81
  requirements.paths = ['spec', 'lib']
59
82
  Dir['spec/**/*.spec.coffee'].each do |file|
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: seaweed
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 0
10
- version: 0.1.0
9
+ - 1
10
+ version: 0.1.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Tobias Cohen
@@ -118,7 +118,6 @@ files:
118
118
  - server/views/index.slim
119
119
  - lib/required_files.rb
120
120
  - lib/Spec.coffee
121
- - lib/spec.rb
122
121
  has_rdoc: true
123
122
  homepage: https://github.com/tobico/seaweed
124
123
  licenses:
data/lib/spec.rb DELETED
@@ -1,42 +0,0 @@
1
- #!/usr/bin/env jruby
2
- require "rubygems"
3
- require "bundler/setup"
4
- require "coffee-script"
5
- require "celerity"
6
-
7
- Dir.mkdir 'compiled' unless File.exists? 'compiled'
8
- raise "Can't create compile directory" unless File.directory? 'compiled'
9
-
10
- # Compile coffee scripts
11
- files = Dir['lib/**/*.coffee', 'spec/**/*.coffee']
12
- longest_name = files.map(&:length).max
13
- for file in files
14
- begin
15
- mtime = File.mtime file
16
-
17
- outfile = file.sub /^(lib|spec)/, 'compiled'
18
- outfile = outfile.sub /\.coffee$/, '.js'
19
-
20
- next if File.exists?(outfile) && File.mtime(outfile) == mtime
21
-
22
- dir = outfile.sub /\/[^\/]+$/, ''
23
- Dir.mkdir dir unless File.exists? dir
24
- File.open outfile, 'w' do |f|
25
- f.write CoffeeScript.compile(File.read(file))
26
- end
27
- File.utime mtime, mtime, outfile
28
- puts outfile
29
- rescue CoffeeScript::CompilationError => e
30
- if e.message.match /^SyntaxError: (.*) on line (\d+)\D*$/
31
- puts "\e[31m#{file}:#{$2}".ljust(longest_name + 6) + " #{$1}\e[0m"
32
- elsif e.message.match /^Parse error on line (\d+): (.*)$/
33
- puts "\e[31m#{file}:#{$1}".ljust(longest_name + 6) + " #{$2}\e[0m"
34
- else
35
- puts "#{file} - #{e.message}"
36
- end
37
- end
38
- end
39
-
40
- browser = Celerity::Browser.new
41
- browser.goto 'http://localhost/~tobico/SeaTurtle/spec/spec.html#terminal'
42
- puts browser.text