polygon 0.0.3 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/CHANGELOG.md +0 -12
  2. data/Gemfile +5 -2
  3. data/Gemfile.lock +25 -10
  4. data/lib/polygon/base.rb +10 -8
  5. data/lib/polygon/core_ext/path.rb +24 -0
  6. data/lib/polygon/core_ext/rack/nocache.rb +27 -0
  7. data/lib/polygon/core_ext.rb +2 -0
  8. data/lib/polygon/database.rb +57 -0
  9. data/lib/polygon/dialect.rb +13 -0
  10. data/lib/polygon/entry.rb +101 -0
  11. data/lib/polygon/helpers.rb +43 -10
  12. data/lib/polygon/loader.rb +4 -2
  13. data/lib/polygon/script/gsub.rb +59 -0
  14. data/lib/polygon/script/launch.rb +75 -0
  15. data/lib/polygon/script.rb +38 -0
  16. data/lib/polygon/version.rb +2 -2
  17. data/lib/polygon.rb +4 -13
  18. data/polygon.gemspec +5 -3
  19. data/polygon.noespec +6 -4
  20. data/spec/core_ext/test_epath.rb +34 -0
  21. data/spec/database/test_entries.rb +30 -0
  22. data/spec/database/test_sitemap.rb +31 -0
  23. data/spec/entry/test_ancestors_or_self.rb +43 -0
  24. data/spec/entry/test_divide.rb +27 -0
  25. data/spec/entry/test_equality.rb +26 -0
  26. data/spec/entry/test_exist.rb +18 -0
  27. data/spec/entry/test_extensions.rb +29 -0
  28. data/spec/entry/test_hash.rb +14 -0
  29. data/spec/entry/test_index.rb +18 -0
  30. data/spec/entry/test_index_files.rb +29 -0
  31. data/spec/entry/test_parent.rb +40 -0
  32. data/spec/entry/test_path.rb +19 -0
  33. data/spec/entry/test_to_hash.rb +22 -0
  34. data/{test → spec}/fixtures/data/data.json +0 -0
  35. data/{test → spec}/fixtures/data/data.md +0 -0
  36. data/{test → spec}/fixtures/data/data.rb +0 -0
  37. data/{test → spec}/fixtures/data/data.ruby +0 -0
  38. data/{test → spec}/fixtures/data/data.yaml +0 -0
  39. data/{test → spec}/fixtures/data/data.yml +0 -0
  40. data/spec/fixtures/data/empty.md +3 -0
  41. data/{test → spec}/fixtures/data/text.md +0 -0
  42. data/{test → spec}/fixtures/index.yml +0 -0
  43. data/{test → spec}/fixtures/with_index_md/index.md +0 -0
  44. data/{test → spec}/fixtures/with_index_yml/index.yml +0 -0
  45. data/{test → spec}/fixtures/with_index_yml/say-hello.md +0 -0
  46. data/{test → spec}/fixtures/without_index/hello.md +0 -0
  47. data/spec/spec_helper.rb +16 -0
  48. data/spec/test_polygon.rb +10 -0
  49. data/tasks/yard.rake +51 -0
  50. metadata +161 -78
  51. checksums.yaml +0 -7
  52. data/lib/polygon/content.rb +0 -131
  53. data/lib/polygon/content_loader.rb +0 -78
  54. data/test/content/test_entry.rb +0 -99
  55. data/test/helper.rb +0 -5
  56. data/test/runall.rb +0 -1
  57. data/test/test_content.rb +0 -45
  58. data/test/test_content_loader.rb +0 -39
data/CHANGELOG.md CHANGED
@@ -1,15 +1,3 @@
1
- # 0.0.3 / 2018-03-21
2
-
3
- * Fix Encoing => Encoding
4
-
5
- * Removed yard rake task, that fails under modern ruby
6
-
7
- # 0.0.2 / 2018-03-21
8
-
9
- * Force UTF8 encoding on content
10
-
11
- * Remove json dependency
12
-
13
1
  # 0.0.1 / FIX ME
14
2
 
15
3
  * Enhancements
data/Gemfile CHANGED
@@ -1,9 +1,12 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
3
  group :runtime do
4
+ gem "json", ">= 0"
4
5
  gem "sinatra", "~> 1.3"
5
- gem "epath", "~> 0.2.0"
6
- gem "wlang", "~> 0.10.2"
6
+ gem "wlang", "~> 2.1.1"
7
+ gem "alf", "~> 0.12.2"
8
+ gem "quickl", "~> 0.4.2"
9
+ gem "path", "~> 1.3.1"
7
10
  end
8
11
 
9
12
  group :development do
data/Gemfile.lock CHANGED
@@ -1,11 +1,20 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
+ alf (0.12.2)
5
+ backports (~> 2.6)
6
+ myrrha (~> 1.2.1)
7
+ quickl (~> 0.4.2)
8
+ backports (2.6.1)
4
9
  bluecloth (2.2.0)
10
+ citrus (2.4.1)
5
11
  diff-lcs (1.1.3)
6
- epath (0.2.0)
7
- rack (1.4.1)
8
- rack-protection (1.2.0)
12
+ json (1.7.3)
13
+ myrrha (1.2.2)
14
+ path (1.3.1)
15
+ quickl (0.4.3)
16
+ rack (1.4.4)
17
+ rack-protection (1.3.2)
9
18
  rack
10
19
  rake (0.9.2.2)
11
20
  rspec (2.10.0)
@@ -16,26 +25,32 @@ GEM
16
25
  rspec-expectations (2.10.0)
17
26
  diff-lcs (~> 1.1.3)
18
27
  rspec-mocks (2.10.1)
19
- sinatra (1.3.2)
28
+ sinatra (1.3.3)
20
29
  rack (~> 1.3, >= 1.3.6)
21
30
  rack-protection (~> 1.2)
22
31
  tilt (~> 1.3, >= 1.3.3)
32
+ temple (0.4.1)
23
33
  tilt (1.3.3)
24
- wlang (0.10.2)
34
+ wlang (2.1.1)
35
+ backports (~> 2.6)
36
+ citrus (~> 2.4.1)
37
+ path (~> 1.3)
38
+ quickl (~> 0.4.3)
39
+ temple (~> 0.4.0)
25
40
  yard (0.7.5)
26
41
 
27
42
  PLATFORMS
28
43
  ruby
29
44
 
30
45
  DEPENDENCIES
46
+ alf (~> 0.12.2)
31
47
  bluecloth (~> 2.2)
32
48
  bundler (~> 1.0)
33
- epath (~> 0.2.0)
49
+ json
50
+ path (~> 1.3.1)
51
+ quickl (~> 0.4.2)
34
52
  rake (~> 0.9.2)
35
53
  rspec (~> 2.10)
36
54
  sinatra (~> 1.3)
37
- wlang (~> 0.10.2)
55
+ wlang (~> 2.1.1)
38
56
  yard (~> 0.7.2)
39
-
40
- BUNDLED WITH
41
- 1.16.0
data/lib/polygon/base.rb CHANGED
@@ -2,19 +2,21 @@ module Polygon
2
2
  class Base < Sinatra::Base
3
3
 
4
4
  configure do
5
- set :static, Proc.new { root && root/:content/:static }
6
- set :public_folder, Proc.new { root && root/:content/:static }
7
- set :dynamic, Proc.new { root && root/:content/:dynamic }
8
- set :templates, Proc.new { root && root/:design/:templates }
9
- set :views, Proc.new { root && root/:design/:templates }
5
+ set :public_folder, Proc.new { 'content/static' }
6
+ set :views, Proc.new { 'design/views' }
7
+ set :database, Proc.new { Database.new('content/dynamic') }
8
+ set :wlang, :layout => :"layouts/html5"
10
9
  enable :logging
11
10
  enable :raise_errors
12
11
  disable :show_exceptions
13
12
  end
14
13
 
15
- get '/sitemap.xml' do
16
- content_type "application/xml"
17
- wlang :sitemap
14
+ not_found do
15
+ send_file settings.public_folder + '/404.html', :status => 404
16
+ end
17
+
18
+ error do
19
+ send_file settings.public_folder + '/500.html', :status => 500
18
20
  end
19
21
 
20
22
  helpers Polygon::Helpers
@@ -0,0 +1,24 @@
1
+ class Path
2
+
3
+ register_loader '.rb', '.ruby' do |path|
4
+ ::Kernel.eval(path.read, TOPLEVEL_BINDING, path.to_s)
5
+ end
6
+
7
+ register_loader '.md' do |path|
8
+ require 'yaml'
9
+ content = path.read
10
+ if content =~ /^(---\s*\n.*?\n?)^(---\s*$\n?)/m
11
+ (YAML::load($1) || {}).merge("content" => $')
12
+ else
13
+ {"content" => content}
14
+ end
15
+ end
16
+
17
+ def to_url
18
+ path = self.rm_ext
19
+ path = path.dir if path.basename.to_s == 'index'
20
+ path = path == Path('.') ? Path("") : path
21
+ path.to_s
22
+ end
23
+
24
+ end
@@ -0,0 +1,27 @@
1
+ module Rack
2
+ class Nocache
3
+ def initialize(app)
4
+ @app = app
5
+ end
6
+
7
+ def call(env)
8
+ status, headers, body = @app.call(patch_request_headers(env))
9
+ [status, patch_response_headers(headers), body]
10
+ end
11
+
12
+ protected
13
+ CACHE_BUSTER = {
14
+ "Cache-Control" => "no-cache, no-store, max-age=0, must-revalidate",
15
+ "Pragma" => "no-cache",
16
+ "Expires" => "Fri, 29 Aug 1997 02:14:00 EST"
17
+ }
18
+
19
+ def patch_request_headers(env)
20
+ env.reject{|k,v| k =~ /^HTTP_IF/i }
21
+ end
22
+
23
+ def patch_response_headers(env)
24
+ env.reject{|k,v| k =~ /^ETag$/i }.merge(CACHE_BUSTER)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,2 @@
1
+ require 'polygon/core_ext/path'
2
+ require 'polygon/core_ext/rack/nocache'
@@ -0,0 +1,57 @@
1
+ module Polygon
2
+ class Database < Alf::Environment
3
+
4
+ attr_reader :root, :options
5
+
6
+ def initialize(root, options = {})
7
+ @root = Path(root)
8
+ @options = default_options.merge(options)
9
+ end
10
+
11
+ def default_options
12
+ { :extensions => ["yml", "md"] }
13
+ end
14
+
15
+ def dataset(name)
16
+ if self.respond_to?(name)
17
+ send(name)
18
+ else
19
+ raise Alf::NoSuchDatasetError, "No such dataset `#{name}`"
20
+ end
21
+ end
22
+
23
+ def entries
24
+ @entries ||= Entries.new(root, options)
25
+ end
26
+
27
+ def sitemap
28
+ @sitemap ||= begin
29
+ Alf.lispy(self).compile do
30
+ (extend :entries,
31
+ :path => lambda{ entry.relative_path.to_url },
32
+ :lastmod => lambda{ entry.path.mtime.strftime("%Y-%m-%d") })
33
+ end
34
+ end
35
+ end
36
+
37
+ class Entries
38
+ include Alf::Iterator
39
+
40
+ def initialize(root, options)
41
+ @root = root
42
+ @options = options
43
+ end
44
+
45
+ def each
46
+ extensions = @options[:extensions]
47
+ @root.glob("**/*").each do |file|
48
+ next unless file.file? and extensions.include?(file.ext)
49
+ entry = Entry.new(@root, file % @root)
50
+ yield(:entry => entry)
51
+ end
52
+ end
53
+
54
+ end # class Entries
55
+
56
+ end # class Database
57
+ end # class Polygon
@@ -0,0 +1,13 @@
1
+ module Polygon
2
+ class Dialect < WLang::Html
3
+
4
+ def tilde(buf, fn)
5
+ text = evaluate(fn)
6
+ buf << context.markdown(text)
7
+ end
8
+
9
+ tag '~', :tilde
10
+
11
+ Tilt.prefer Tilt::WLangTemplate.with_options(:dialect => Dialect), 'wlang'
12
+ end
13
+ end
@@ -0,0 +1,101 @@
1
+ module Polygon
2
+ class Entry
3
+
4
+ attr_reader :root, :relative_path, :options
5
+
6
+ def initialize(root, relative_path, options = {})
7
+ @root = Path(root)
8
+ @relative_path = Path(relative_path)
9
+ @options = options
10
+ end
11
+
12
+ def path
13
+ root / relative_path
14
+ end
15
+
16
+ def exist?
17
+ path.exist?
18
+ end
19
+
20
+ def index?
21
+ path.basename.rm_ext.to_s == "index"
22
+ end
23
+
24
+ def /(path)
25
+ entry = Entry.new(root, self.relative_path / path, options)
26
+ if entry.path.inside?(root)
27
+ entry
28
+ else
29
+ nil
30
+ end
31
+ end
32
+
33
+ def parent
34
+ @parent ||= begin
35
+ return nil unless base = self/".."
36
+ idx = -1
37
+ if index?
38
+ idx = index_files.index(path.basename.to_s) - 1
39
+ base = base/".." if idx == -1
40
+ end
41
+ base ? base/index_files[idx] : nil
42
+ end
43
+ end
44
+
45
+ def ancestors_or_self(filter_unexisting = false)
46
+ res = _ancestors_or_self
47
+ filter_unexisting ? res.select{|f| f.path.exist?} : res
48
+ end
49
+
50
+ def to_hash
51
+ ancestors_or_self(true).inject({}) do |h,entry|
52
+ merge(h, entry.data)
53
+ end
54
+ end
55
+
56
+ def ==(other)
57
+ other.is_a?(Entry) and other.path == path
58
+ end
59
+
60
+ def hash
61
+ path.hash
62
+ end
63
+
64
+ protected
65
+
66
+ def merge(left, right)
67
+ raise "Unexpected #{left.class} vs. #{right.class}" \
68
+ unless left.class == right.class
69
+ case left
70
+ when Array
71
+ (right | left).uniq
72
+ when Hash
73
+ left.merge(right){|k,l,r| merge(l,r)}
74
+ else
75
+ right
76
+ end
77
+ end
78
+
79
+ def extensions
80
+ options[:extensions] || ["yml", "md"]
81
+ end
82
+
83
+ def index_files
84
+ extensions.map{|ext| "index.#{ext}"}
85
+ end
86
+
87
+ def index_file(i = 0)
88
+ index_files[i]
89
+ end
90
+
91
+ def data
92
+ path.load
93
+ end
94
+
95
+ def _ancestors_or_self
96
+ return [ self ] unless parent
97
+ parent.ancestors_or_self + [ self ]
98
+ end
99
+
100
+ end # class Entry
101
+ end # module Polygon
@@ -1,20 +1,53 @@
1
1
  module Polygon
2
2
  module Helpers
3
3
 
4
- def static; settings.static; end
5
- def dynamic; settings.dynamic; end
6
- def templates; settings.templates; end
4
+ def static
5
+ settings.static
6
+ end
7
+
8
+ def dynamic
9
+ settings.dynamic
10
+ end
11
+
12
+ def templates
13
+ settings.templates
14
+ end
15
+
16
+ def database
17
+ settings.database
18
+ end
19
+
20
+ def lispy(&bl)
21
+ @lispy ||= Alf.lispy(database)
22
+ bl ? @lispy.evaluate(&bl) : @lispy
23
+ end
24
+
25
+ def in_production
26
+ settings.environment == :production
27
+ end
28
+
29
+ def in_test
30
+ settings.environment == :test
31
+ end
32
+
33
+ def in_development
34
+ settings.environment == :development
35
+ end
7
36
 
8
- def default_wlang_context
9
- { "environment" => settings.environment }
37
+ def sitemap_locals
38
+ { :urls => database.sitemap }
10
39
  end
11
40
 
12
- def wlang(tpl, ctx = {})
13
- tpl = templates/"#{tpl}.whtml" if tpl.is_a?(Symbol)
14
- ctx = (ctx && ctx.to_hash) || {}
15
- ctx = default_wlang_context.to_hash.merge(ctx)
16
- WLang::file_instantiate tpl, ctx
41
+ def page_locals(path = "")
42
+ rel = lispy do
43
+ (unwrap \
44
+ (extend (restrict :sitemap, :path => path),
45
+ :data => lambda{ entry.to_hash }),
46
+ :data)
47
+ end
48
+ rel && rel.to_a.first
17
49
  end
50
+ alias :index_locals :page_locals
18
51
 
19
52
  end # module Helpers
20
53
  end # module Polygon
@@ -1,4 +1,6 @@
1
- require "sinatra"
2
- require "epath"
3
1
  require "json"
2
+ require "sinatra"
4
3
  require "wlang"
4
+ require "alf"
5
+ require "quickl"
6
+ require "path"
@@ -0,0 +1,59 @@
1
+ module Polygon
2
+ module Script
3
+ class Gsub < Polygon::Script(__FILE__, __LINE__)
4
+
5
+ attr_accessor :dry_run, :regexp, :folder, :pattern
6
+
7
+ options do |opt|
8
+ self.enable_logging = false
9
+ opt.on('--[no-]log', "Properly log in a file?") do |value|
10
+ self.enable_logging = value
11
+ end
12
+ self.dry_run = false
13
+ opt.on('-d', '--dry-run', "Dry-run mode, do not touch files") do
14
+ self.dry_run = true
15
+ end
16
+ self.regexp = false
17
+ opt.on('-r', '--regexp', "Use `from` as a regular expression") do
18
+ self.regexp = true
19
+ end
20
+ self.pattern = "**/*.*"
21
+ opt.on('-g', '--glob=PATTERN', "File pattern to use for Path.glob") do |pattern|
22
+ self.pattern = pattern
23
+ end
24
+ self.folder = Path.pwd
25
+ end
26
+
27
+ # Stolen from ptools (https://github.com/djberg96/ptools)
28
+ def binary?(file)
29
+ s = (File.read(file, File.stat(file).blksize) || "").split(//)
30
+ ((s.size - s.grep(" ".."~").size) / s.size.to_f) > 0.30
31
+ end
32
+
33
+ def gsub(file, from, to)
34
+ gsubbed = file.read.gsub!(from){|m|
35
+ msg = "gsub #{m[0, (50 - to.length)]} -> #{to}"
36
+ msg += " "*(60 - msg.length) + " (#{file})"
37
+ info msg
38
+ to
39
+ }
40
+ file.write(gsubbed) if gsubbed && !dry_run
41
+ rescue ArgumentError => ex
42
+ error "Skipping #{file}: #{ex.message}"
43
+ end
44
+
45
+ def execute(args)
46
+ abort options.to_s unless args.size >= 2
47
+ from = args.shift
48
+ from = Regexp.compile(regexp ? from : Regexp.escape(from))
49
+ to = args.shift
50
+ files = args.empty? ? folder.glob(pattern) : args.map(&Path)
51
+ files.each do |file|
52
+ next if file.directory? or binary?(file)
53
+ gsub(file, from, to)
54
+ end
55
+ end
56
+
57
+ end # class Gsub
58
+ end # module Script
59
+ end # module Polygon
@@ -0,0 +1,75 @@
1
+ module Polygon
2
+ module Script
3
+ class Launch < Polygon::Script(__FILE__, __LINE__)
4
+
5
+ attr_accessor :mode, :refresh_repo, :open_browser, :try, :max
6
+
7
+ def config_ru
8
+ root/:config/"#{mode}.ru"
9
+ end
10
+
11
+ # Install the options
12
+ options do |opt|
13
+ self.enable_logging = true
14
+ opt.on('--[no-]log', "Properly log in a file?") do |value|
15
+ self.enable_logging = value
16
+ end
17
+ self.refresh_repo = true
18
+ opt.on('--[no-]refresh', "Issues a 'git remote update' first?") do |value|
19
+ self.refresh_repo = value
20
+ end
21
+ self.open_browser = true
22
+ opt.on('--[no-]browser', "Open the browser automatically?") do |value|
23
+ self.open_browser = value
24
+ end
25
+ self.try = 0
26
+ self.max = 500
27
+ opt.on('--max=MAX', Integer, "Number of connection attempts") do |value|
28
+ self.max = Integer(value)
29
+ end
30
+ end
31
+
32
+ # Tries to access the website
33
+ def wait_and_open
34
+ info "Attempting to connect to the web site..."
35
+ Http.head "http://127.0.0.1:3000/"
36
+ rescue Errno::ECONNREFUSED
37
+ sleep(0.5)
38
+ retry if (self.try += 1) < max
39
+ info "Server not found, sorry."
40
+ raise
41
+ else
42
+ Launchy.open("http://127.0.0.1:3000/")
43
+ end
44
+
45
+ def execute(argv)
46
+ abort options.to_s unless argv.size <= 1
47
+ self.mode = (argv.first || "development").to_sym
48
+ abort "Invalid mode #{mode}" unless config_ru.exist?
49
+
50
+ info "Refreshing repository info..." do
51
+ Process.wait spawn("git remote update")
52
+ end if refresh_repo
53
+
54
+ thinpid = nil
55
+ info "Starting the web server..." do
56
+ thinpid = spawn("thin -R #{config_ru} start")
57
+ end
58
+
59
+ info "Waiting for the server to start" do
60
+ require 'launchy'
61
+ require 'http'
62
+ wait_and_open
63
+ end if open_browser
64
+
65
+ rescue => ex
66
+ info "Lauching failed: #{ex.message}"
67
+ info ex.backtrace.join("\n")
68
+ Process.kill("SIGHUP", thinpid) if thinpid
69
+ ensure
70
+ Process.wait(thinpid) if thinpid
71
+ end
72
+
73
+ end # class Launch
74
+ end # module Script
75
+ end # module Polygon
@@ -0,0 +1,38 @@
1
+ require 'polygon'
2
+ require 'quickl'
3
+ require 'logger'
4
+ module Polygon
5
+ module Script
6
+
7
+ attr_accessor :enable_logging
8
+
9
+ def root
10
+ Path($0).backfind('.[config.ru]') || Path.pwd.backfind('.[config.ru]')
11
+ end
12
+
13
+ def logger
14
+ @logger ||= Logger.new(root/:logs/"#{Quickl.command_name(self)}.log") if enable_logging
15
+ end
16
+
17
+ def log(message, severity)
18
+ puts message
19
+ logger.send(severity, message) if enable_logging
20
+ yield if block_given?
21
+ end
22
+ def debug(message, &block); log(message, :debug, &block); end
23
+ def info(message, &block); log(message, :info, &block); end
24
+ def warn(message, &block); log(message, :warn, &block); end
25
+ def error(message, &block); log(message, :error, &block); end
26
+ def fatal(message, &block); log(message, :fatal, &block); end
27
+
28
+ end
29
+
30
+ def self.Script(*args)
31
+ Quickl::Command(*args) do |builder|
32
+ builder.instance_module Script
33
+ end
34
+ end
35
+
36
+ end
37
+ require 'polygon/script/launch'
38
+ require 'polygon/script/gsub'
@@ -2,8 +2,8 @@ module Polygon
2
2
  module Version
3
3
 
4
4
  MAJOR = 0
5
- MINOR = 0
6
- TINY = 3
5
+ MINOR = 9
6
+ TINY = 1
7
7
 
8
8
  def self.to_s
9
9
  [ MAJOR, MINOR, TINY ].join('.')
data/lib/polygon.rb CHANGED
@@ -1,23 +1,14 @@
1
1
  require "polygon/version"
2
2
  require "polygon/loader"
3
+ require "polygon/core_ext"
3
4
  #
4
5
  # A web framework powered by sinatra for mostly static websites
5
6
  #
6
7
  module Polygon
7
8
 
8
- def default_loader
9
- @default_loader ||= ContentLoader.new.enable_all!
10
- end
11
- module_function :default_loader
12
-
13
- def default_loader=(loader)
14
- @default_loader = loader
15
- end
16
- module_function :default_loader=
17
-
18
9
  end # module Polygon
19
- require 'polygon/content_loader'
20
- require 'polygon/content'
10
+ require 'polygon/entry'
11
+ require 'polygon/database'
21
12
  require 'polygon/helpers'
22
13
  require 'polygon/base'
23
-
14
+ require 'polygon/dialect'
data/polygon.gemspec CHANGED
@@ -128,10 +128,12 @@ Gem::Specification.new do |s|
128
128
  s.add_development_dependency("rspec", "~> 2.10")
129
129
  s.add_development_dependency("yard", "~> 0.7.2")
130
130
  s.add_development_dependency("bluecloth", "~> 2.2")
131
- s.add_dependency("sinatra", "~> 1.3")
132
- s.add_dependency("epath", "~> 0.2.0")
133
131
  s.add_dependency("json", ">= 0")
134
- s.add_dependency("wlang", "~> 0.10.2")
132
+ s.add_dependency("sinatra", "~> 1.3")
133
+ s.add_dependency("wlang", "~> 2.1.1")
134
+ s.add_dependency("alf", "~> 0.12.2")
135
+ s.add_dependency("quickl", "~> 0.4.2")
136
+ s.add_dependency("path", "~> 1.3.1")
135
137
 
136
138
  # The version of ruby required by this gem
137
139
  #
data/polygon.noespec CHANGED
@@ -7,7 +7,7 @@ variables:
7
7
  upper:
8
8
  Polygon
9
9
  version:
10
- 0.0.1
10
+ 0.9.1
11
11
  summary: |-
12
12
  A web framework powered by sinatra for mostly static websites
13
13
  description: |-
@@ -18,10 +18,12 @@ variables:
18
18
  links:
19
19
  - http://github.com/blambeau/polygon
20
20
  dependencies:
21
- - {name: sinatra, version: "~> 1.3", groups: [runtime]}
22
- - {name: epath, version: "~> 0.2.0", groups: [runtime]}
23
21
  - {name: json, version: ">= 0", groups: [runtime]}
24
- - {name: wlang, version: "~> 0.10.2", groups: [runtime]}
22
+ - {name: sinatra, version: "~> 1.3", groups: [runtime]}
23
+ - {name: wlang, version: "~> 2.1.1", groups: [runtime]}
24
+ - {name: alf, version: "~> 0.12.2", groups: [runtime]}
25
+ - {name: quickl, version: "~> 0.4.2", groups: [runtime]}
26
+ - {name: path, version: "~> 1.3.1", groups: [runtime]}
25
27
  - {name: rake, version: "~> 0.9.2", groups: [development]}
26
28
  - {name: bundler, version: "~> 1.0", groups: [development]}
27
29
  - {name: rspec, version: "~> 2.10", groups: [development]}