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
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+ describe Path, "core extensions" do
3
+
4
+ def load(file)
5
+ (fixtures_path / "data" / file).load
6
+ end
7
+
8
+ it 'loads json correctly' do
9
+ load('data.json').should eq("kind" => "json")
10
+ end
11
+
12
+ it 'loads yaml correctly' do
13
+ load('data.yaml').should eq("kind" => "yaml")
14
+ load('data.yml').should eq("kind" => "yml")
15
+ end
16
+
17
+ it 'loads ruby correctly' do
18
+ load('data.ruby').should eq("kind" => "ruby")
19
+ load('data.rb').should eq("kind" => "rb")
20
+ end
21
+
22
+ it 'load .md correctly, when no front matter' do
23
+ load('text.md').should eq("content" => "This is the text")
24
+ end
25
+
26
+ it 'load .md correctly, when empty front matter' do
27
+ load('empty.md').should eq("content" => "This is the text\n")
28
+ end
29
+
30
+ it 'load .md correctly, when a front matter' do
31
+ load('data.md').should eq("kind" => "md", "content" => "This is the text")
32
+ end
33
+
34
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+ module Polygon
3
+ describe Database, "entries" do
4
+
5
+ let(:database){ Database.new fixtures_path }
6
+
7
+ subject{ database.entries }
8
+
9
+ it 'is returned by dataset' do
10
+ subject.should eq(database.dataset(:entries))
11
+ end
12
+
13
+ it 'returns a Alf::Iterator' do
14
+ subject.should be_a(Alf::Iterator)
15
+ end
16
+
17
+ it 'iterates tuples with entries' do
18
+ subject.each do |tuple|
19
+ tuple.should have_key(:entry)
20
+ tuple[:entry].should be_a(Entry)
21
+ end
22
+ end
23
+
24
+ it 'iterates tuples with entries of different paths' do
25
+ paths = subject.map{|t| t[:entry].relative_path.to_s }.uniq
26
+ paths.size.should eq(subject.to_a.size)
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+ module Polygon
3
+ describe Database, "entries" do
4
+
5
+ let(:database){ Database.new fixtures_path }
6
+
7
+ subject{ database.sitemap }
8
+
9
+ it 'is returned by dataset' do
10
+ subject.should eq(database.dataset(:sitemap))
11
+ end
12
+
13
+ it 'returns a Alf::Iterator' do
14
+ subject.should be_a(Alf::Iterator)
15
+ end
16
+
17
+ it 'iterates tuples with entries, path and lastmod' do
18
+ subject.each do |tuple|
19
+ tuple.should have_key(:entry)
20
+ tuple[:entry].should be_a(Entry)
21
+
22
+ tuple.should have_key(:path)
23
+ tuple[:path].should be_a(String)
24
+
25
+ tuple.should have_key(:lastmod)
26
+ tuple[:lastmod].should be_a(String)
27
+ end
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+ module Polygon
3
+ describe Entry, 'ancestors_or_self' do
4
+
5
+ subject{ entry.ancestors_or_self(filter) }
6
+
7
+ context 'when a normal entry in root' do
8
+ let(:filter){ false }
9
+ let(:entry){ Entry.new(Path.dir, Path.here % Path.dir) }
10
+ it "should contain all index files" do
11
+ expected = entry.index_files.map{|index|
12
+ Entry.new(Path.dir, index)
13
+ } + [ entry ]
14
+ subject.should eq(expected)
15
+ end
16
+ end
17
+
18
+ context 'when filtered' do
19
+ let(:filter){ true }
20
+ let(:entry){ Entry.new(Path.dir, Path.here % Path.dir) }
21
+ it "should contain only existing files" do
22
+ subject.should eq([ entry ])
23
+ end
24
+ end
25
+
26
+ context 'when the root and not filtered' do
27
+ let(:filter){ false }
28
+ let(:entry){ Entry.new(Path.dir, 'index.yml') }
29
+ it "should be the singleton" do
30
+ subject.should eq([entry])
31
+ end
32
+ end
33
+
34
+ context 'when the root and filtered' do
35
+ let(:filter){ true }
36
+ let(:entry){ Entry.new(Path.dir, "index.yml") }
37
+ it "should be empty" do
38
+ subject.should eq([])
39
+ end
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+ module Polygon
3
+ describe Entry, 'divide' do
4
+
5
+ let(:entry){ Entry.new(Path.dir, Path.dir) }
6
+
7
+ subject{ entry / path }
8
+
9
+ context "when it stays inside the root" do
10
+ let(:path){ "somewhere/somefile.yml" }
11
+ it 'should return an Entry instance' do
12
+ subject.should be_a(Entry)
13
+ end
14
+ it 'should return the correct instance' do
15
+ subject.path.should eq(Path.dir / "somewhere/somefile.yml")
16
+ end
17
+ end
18
+
19
+ context "when it exits the root" do
20
+ let(:path){ "../somefile.yml" }
21
+ it 'should return nil' do
22
+ subject.should be_nil
23
+ end
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+ module Polygon
3
+ describe Entry, '==' do
4
+
5
+ subject{ left == right }
6
+
7
+ context 'when the same entries' do
8
+ let(:left) { Entry.new(Path.dir, Path.here % Path.dir) }
9
+ let(:right){ Entry.new(Path.dir, Path.here % Path.dir) }
10
+ it{ should be_true }
11
+ end
12
+
13
+ context 'when not the same entries' do
14
+ let(:left) { Entry.new(Path.dir, Path.here % Path.dir) }
15
+ let(:right){ Entry.new(Path.dir, "another one") }
16
+ it{ should be_false }
17
+ end
18
+
19
+ context 'when bad comparison' do
20
+ let(:left) { Entry.new(Path.dir, Path.here % Path.dir) }
21
+ let(:right){ 12 }
22
+ it{ should be_false }
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+ module Polygon
3
+ describe Entry, 'exist?' do
4
+
5
+ subject{ entry.exist? }
6
+
7
+ context 'when it exists' do
8
+ let(:entry){ Entry.new(Path.dir, Path.here % Path.dir) }
9
+ it{ should be_true }
10
+ end
11
+
12
+ context 'when it does not exists' do
13
+ let(:entry){ Entry.new(Path.dir, "nosuchone.md") }
14
+ it{ should be_false }
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ module Polygon
3
+ describe Entry, 'extensions' do
4
+
5
+ let(:entry){ Entry.new(Path.dir, Path.here % Path.dir, options) }
6
+
7
+ subject{ entry.extensions }
8
+
9
+ before do
10
+ subject.should be_a(Array)
11
+ subject.all?{|e| e.should be_a(String) }
12
+ end
13
+
14
+ context 'with default options' do
15
+ let(:options){ {} }
16
+ it 'should contain expected extensions' do
17
+ subject.should eq(['yml', 'md'])
18
+ end
19
+ end
20
+
21
+ context 'with explicit options' do
22
+ let(:options){ {:extensions => ["yml", "rb"]} }
23
+ it 'should contain expected extensions' do
24
+ subject.should eq(['yml', 'rb'])
25
+ end
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+ module Polygon
3
+ describe Entry, 'hash' do
4
+
5
+ it 'should be consistent with ==' do
6
+ e = Entry.new(Path.dir, Path.here % Path.dir)
7
+ f = Entry.new(Path.dir, Path.here % Path.dir)
8
+ g = Entry.new(Path.dir, 'another one')
9
+ e.hash.should eq(f.hash)
10
+ e.hash.should_not eq(g.hash)
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+ module Polygon
3
+ describe Entry, 'index?' do
4
+
5
+ subject{ entry.index? }
6
+
7
+ context 'when an index file' do
8
+ let(:entry){ Entry.new(Path.dir, "index.yml") }
9
+ it{ should be_true }
10
+ end
11
+
12
+ context 'when not an index file' do
13
+ let(:entry){ Entry.new(Path.dir, "nosuchone.md") }
14
+ it{ should be_false }
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ module Polygon
3
+ describe Entry, 'index_files' do
4
+
5
+ let(:entry){ Entry.new(Path.dir, Path.here % Path.dir, options) }
6
+
7
+ subject{ entry.index_files }
8
+
9
+ before do
10
+ subject.should be_a(Array)
11
+ subject.all?{|e| e.should be_a(String) }
12
+ end
13
+
14
+ context 'with default options' do
15
+ let(:options){ {} }
16
+ it 'should contain expected index files' do
17
+ subject.should eq(['index.yml', 'index.md'])
18
+ end
19
+ end
20
+
21
+ context 'with explicit options' do
22
+ let(:options){ {:extensions => ["yml", "rb"]} }
23
+ it 'should contain expected index files' do
24
+ subject.should eq(['index.yml', 'index.rb'])
25
+ end
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+ module Polygon
3
+ describe Entry, 'parent' do
4
+
5
+ subject{ entry.parent }
6
+
7
+ before do
8
+ subject.should be_a(Entry) unless subject.nil?
9
+ end
10
+
11
+ context 'when a normal entry' do
12
+ let(:entry){ Entry.new(Path.dir, Path.here % Path.dir) }
13
+ it "should be the last index file" do
14
+ subject.path.should eq(Path.dir / entry.index_file(-1))
15
+ end
16
+ end
17
+
18
+ context 'when the second index file' do
19
+ let(:entry){ Entry.new(Path.dir, "index.md") }
20
+ it "should be the first index file" do
21
+ subject.path.should eq(Path.dir / entry.index_file(0))
22
+ end
23
+ end
24
+
25
+ context 'when the first index file and not in root' do
26
+ let(:entry){ Entry.new(Path.dir, Path("subfolder") / "index.yml") }
27
+ it "should be the last index of the parent" do
28
+ subject.path.should eq(Path.dir / entry.index_file(-1))
29
+ end
30
+ end
31
+
32
+ context 'when the first index file and not in' do
33
+ let(:entry){ Entry.new(Path.dir, "index.yml") }
34
+ it "should be nil" do
35
+ subject.should be_nil
36
+ end
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+ module Polygon
3
+ describe Entry, 'path' do
4
+
5
+ let(:entry){ Entry.new(Path.dir, Path.here % Path.dir) }
6
+
7
+ subject{ entry.path }
8
+
9
+ it 'is a path instance' do
10
+ subject.should be_a(Path)
11
+ end
12
+
13
+ it "is the concatenation of root and relative_path" do
14
+ subject.should eq(entry.root / entry.relative_path)
15
+ subject.should eq(Path.here)
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+ module Polygon
3
+ describe Entry, 'to_hash' do
4
+
5
+ let(:fixtures){ Entry.new(fixtures_path, "") }
6
+
7
+ subject{ entry.to_hash }
8
+
9
+ context 'on with_index_yml/say-hello.md' do
10
+ let(:entry){ fixtures / "with_index_yml/say-hello.md" }
11
+ it 'should take all data along ancestors' do
12
+ expected = {
13
+ "title" => "Say Hello",
14
+ "content" => "# How to Say Hello to World?\n\nThis way!\n",
15
+ "keywords" => ["say-hello", "with_index_yml/index.yml", "root"]
16
+ }
17
+ subject.should eq(expected)
18
+ end
19
+ end
20
+
21
+ end
22
+ end
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,3 @@
1
+ ---
2
+ ---
3
+ This is the text
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
data/spec/spec_helper.rb CHANGED
@@ -1,2 +1,18 @@
1
1
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
2
  require 'polygon'
3
+
4
+ class Polygon::Entry
5
+ public :extensions, :index_files, :index_file
6
+ end
7
+
8
+ module Helpers
9
+
10
+ def fixtures_path
11
+ Path.dir / "fixtures"
12
+ end
13
+
14
+ end
15
+
16
+ RSpec.configure do |c|
17
+ c.include Helpers
18
+ end
data/spec/test_polygon.rb CHANGED
@@ -5,4 +5,14 @@ describe Polygon do
5
5
  Polygon.const_defined?(:VERSION).should be_true
6
6
  end
7
7
 
8
+ def markdown(x)
9
+ x.upcase
10
+ end
11
+
12
+ it 'installs a friendly html dialect' do
13
+ tpl = Tilt['wlang'].new{ "~{content}" }
14
+ got = tpl.render(self, :content => "hello world!")
15
+ got.should eq("HELLO WORLD!")
16
+ end
17
+
8
18
  end
data/tasks/yard.rake ADDED
@@ -0,0 +1,51 @@
1
+ # Installs a rake task to generate API documentation using yard.
2
+ #
3
+ # This file installs the 'rake yard' task. It is automatically generated by Noe from
4
+ # your .noespec file, and should therefore be configured there, under the
5
+ # variables/rake_tasks/yard entry, as illustrated below:
6
+ #
7
+ # variables:
8
+ # rake_tasks:
9
+ # yard:
10
+ # files: lib/**/*.rb
11
+ # options: []
12
+ # ...
13
+ #
14
+ # If you have specific needs requiring manual intervention on this file,
15
+ # don't forget to set safe-override to false in your noe specification:
16
+ #
17
+ # template-info:
18
+ # manifest:
19
+ # tasks/yard.rake:
20
+ # safe-override: false
21
+ #
22
+ # This file has been written to conform to yard v0.6.4. More information about
23
+ # yard and the rake task installed below can be found on http://yardoc.org/
24
+ #
25
+ begin
26
+ require "yard"
27
+ desc "Generate yard documentation"
28
+ YARD::Rake::YardocTask.new(:yard) do |t|
29
+ # Array of options passed to yardoc commandline. See 'yardoc --help' about this
30
+ t.options = ["--output-dir", "doc/api", "-", "README.md", "CHANGELOG.md", "LICENCE.md"]
31
+
32
+ # Array of ruby source files (and any extra documentation files
33
+ # separated by '-')
34
+ t.files = ["lib/**/*.rb"]
35
+
36
+ # A proc to call before running the task
37
+ # t.before = proc{ }
38
+
39
+ # A proc to call after running the task
40
+ # r.after = proc{ }
41
+
42
+ # An optional lambda to run against all objects being generated.
43
+ # Any object that the lambda returns false for will be excluded
44
+ # from documentation.
45
+ # t.verifier = lambda{|obj| true}
46
+ end
47
+ rescue LoadError
48
+ task :yard do
49
+ abort 'yard is not available. In order to run yard, you must: gem install yard'
50
+ end
51
+ end