flutterby 0.0.9 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6269342eafe0fdbe1eddad019ecd44ebd5aea360
4
- data.tar.gz: 6e9c64dda3163516e527b48247546226e943be0f
3
+ metadata.gz: 92409201cdf6f744cf869271e0361b75b771dc6c
4
+ data.tar.gz: 274684a4a805f04b6b8f3739a5c8fcaf5f148f97
5
5
  SHA512:
6
- metadata.gz: d850ecf93387945baf0e1d7fdb8cf7368cd474c8c24f2d536a9a7ae6d53b0fa2b6c363a078a3ab561af88c333f66af7feb306a6a297ca337af53d3e44917e05e
7
- data.tar.gz: 46c17e31c18fbd87c86e5795f15fdd35b3edcccf365d84305e5e828e5228b21022a2a7b4faa55961059bdad3ecf521dd52ee10956aa9d90a3e6b5eb3d9065797
6
+ metadata.gz: b6b3cf80130ea4afdb07faa75e04ba6e680883a7c5f3f6ada5cd2b426a73c5ee23fa9e413dbd3587614e7c78a54c6cef7041f240360f446698102570d06bf806
7
+ data.tar.gz: 28596862f6dce075e164ef713c38497e494d2b7e132b75fe1930e9710c116ffcde346c234c19f94c1e53e971b2962c01704d680b65b25bdd604ed4c2ddab55cf
data/.travis.yml CHANGED
@@ -1,5 +1,8 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
+ - 2.2.6
4
5
  - 2.3.3
6
+ - 2.4.0
5
7
  before_install: gem install bundler -v 1.13.6
8
+ script: bundle exec rake
data/README.md CHANGED
@@ -1,8 +1,13 @@
1
+ [![Gem Version](https://badge.fury.io/rb/flutterby.svg)](https://badge.fury.io/rb/flutterby) [![Build Status](https://travis-ci.org/hmans/flutterby.svg?branch=master)](https://travis-ci.org/hmans/flutterby) ![Status](https://img.shields.io/badge/status-active-brightgreen.svg)
2
+
1
3
  # Flutterby
2
4
 
3
- A currently highly experimental static site generator. Yes, there are many like it;
4
- but this one is mine. (Actually, there are none like it. Ha! I'm very serious about
5
- the _experimental_ bit, though. Use with care, if at all!)
5
+ ### A currently highly experimental static site generator. Yes, there are many like it; but this one is mine. (Actually, there are none like it. Ha! I'm very serious about the _experimental_ bit, though. Use with care, if at all!)
6
+
7
+
8
+ ## Example
9
+
10
+ Even though Flutterby is still very much in flux, I'm already building a bunch of sites with it; one of them is [my blog](http://hmans.io/), the source code for which you can find [here](https://github.com/hmans/hmans_me).
6
11
 
7
12
 
8
13
  ## Actual Features
data/lib/flutterby/cli.rb CHANGED
@@ -27,12 +27,13 @@ Commander.configure do
27
27
  c.description = "Serve your website for development."
28
28
 
29
29
  c.option '--in DIR', String, "Directory containing your source files"
30
+ c.option '--port NUM', String, "Port to serve on (default: 4004)"
30
31
 
31
32
  c.action do |args, options|
32
- options.default in: "./site/"
33
+ options.default in: "./site/", port: 4004
33
34
 
34
35
  root = Flutterby.from(options.in, name: "/")
35
- server = Flutterby::Server.new(root)
36
+ server = Flutterby::Server.new(root, port: options.port)
36
37
  server.run!
37
38
  end
38
39
  end
@@ -2,6 +2,7 @@ module Flutterby
2
2
  class Entity
3
3
  attr_accessor :parent, :ext
4
4
  attr_reader :name, :filters, :fs_path, :data, :children
5
+ alias_method :folder, :parent
5
6
 
6
7
  def initialize(name, parent: nil, fs_path: nil)
7
8
  @parent = parent
@@ -12,7 +13,12 @@ module Flutterby
12
13
  parts = name.split(".")
13
14
  @name = parts.shift
14
15
  @filters = parts.reverse
15
- @ext = @filters.last || "html"
16
+
17
+ # We're assuming the extension is the name of the final filter
18
+ # that will be applied. This may not be always correct, since filters
19
+ # can also change a file's extension.
20
+ #
21
+ @ext = @filters.last
16
22
 
17
23
  # If a filesystem path was given, read the entity from disk
18
24
  if fs_path
@@ -99,6 +105,22 @@ module Flutterby
99
105
  end
100
106
  end
101
107
 
108
+ # Walk the tree up, invoking the passed block for every entity
109
+ # found on the way, passing the entity as its only argument.
110
+ #
111
+ def walk_up(val = nil, &blk)
112
+ val = blk.call(self, val)
113
+ parent ? parent.walk_up(val, &blk) : val
114
+ end
115
+
116
+ # Walk the graph from the root to this entity. Just like walk_up,
117
+ # except the block will be called on higher level entities first.
118
+ #
119
+ def walk_down(val = nil, &blk)
120
+ val = parent ? parent.walk_up(val, &blk) : val
121
+ blk.call(self, val)
122
+ end
123
+
102
124
 
103
125
  #
104
126
  # Reading from filesystem
@@ -58,11 +58,7 @@ module Flutterby
58
58
  end
59
59
 
60
60
  def view
61
- @view ||= begin
62
- View.new(self).tap do |view|
63
- parent.extend_view!(view) if parent
64
- end
65
- end
61
+ @view ||= View.for(self)
66
62
  end
67
63
 
68
64
  def read_json
@@ -74,24 +70,14 @@ module Flutterby
74
70
  end
75
71
 
76
72
  def apply_layout(input)
77
- output = input
78
-
79
- # collect layouts to apply
80
- layouts = []
81
- current = self
82
- while current = current.parent
83
- if layout = current.find("_layout")
84
- layouts << layout
73
+ walk_up(input) do |e, current|
74
+ if layout = e.sibling("_layout")
75
+ tilt = Tilt[layout.ext].new { layout.source }
76
+ tilt.render(view) { current }
77
+ else
78
+ current
85
79
  end
86
80
  end
87
-
88
- # Apply all layouts in order
89
- layouts.each do |layout|
90
- tilt = Tilt[layout.ext].new { layout.source }
91
- output = tilt.render(view) { output }
92
- end
93
-
94
- output
95
81
  end
96
82
 
97
83
  def apply_layout?
@@ -7,6 +7,14 @@ module Flutterby
7
7
  file.filters.each do |filter|
8
8
  meth = "process_#{filter}"
9
9
 
10
+ # Set the file's extension to the requested filter. The filter
11
+ # itself can, of course, override this (eg. the "md" filter can default
12
+ # the extension to "html".)
13
+ #
14
+ file.ext = filter
15
+
16
+ # Now apply the actual filter!
17
+ #
10
18
  if Filters.respond_to?(meth)
11
19
  body = Filters.send(meth, body, file)
12
20
  end
@@ -15,22 +15,5 @@ module Flutterby
15
15
  child.export(path)
16
16
  end
17
17
  end
18
-
19
- def extend_view!(view)
20
- # Load the view extension available in this folder into the given view.
21
- #
22
- if view_entity = find("_view.rb")
23
- case view_entity.ext
24
- when "rb" then
25
- view.instance_eval(view_entity.source)
26
- else
27
- raise "Unknown view extension #{view_entity.full_name}"
28
- end
29
- end
30
-
31
- # Then pass the whole thing up the stack.
32
- #
33
- parent ? parent.extend_view!(view) : view
34
- end
35
18
  end
36
19
  end
@@ -3,8 +3,9 @@ require 'listen'
3
3
 
4
4
  module Flutterby
5
5
  class Server
6
- def initialize(root)
6
+ def initialize(root, port: 4004)
7
7
  @root = root
8
+ @port = port
8
9
  end
9
10
 
10
11
  def run!
@@ -29,7 +30,7 @@ module Flutterby
29
30
 
30
31
  # Go!
31
32
  listener.start
32
- server.run self
33
+ server.run self, Port: @port
33
34
  end
34
35
 
35
36
  def call(env)
@@ -1,3 +1,3 @@
1
1
  module Flutterby
2
- VERSION = "0.0.9"
2
+ VERSION = "0.0.10"
3
3
  end
@@ -18,5 +18,27 @@ module Flutterby
18
18
  def find(expr)
19
19
  entity.find(expr) or raise "No entity found for #{expr}"
20
20
  end
21
+
22
+ class << self
23
+ def for(file)
24
+ # create a new view instance
25
+ view = new(file)
26
+
27
+ # walk the tree up to dynamically extend the view
28
+ file.folder.walk_down do |e|
29
+ if view_entity = e.find("_view.rb")
30
+ case view_entity.ext
31
+ when "rb" then
32
+ view.instance_eval(view_entity.source)
33
+ else
34
+ raise "Unknown view extension #{view_entity.full_name}"
35
+ end
36
+ end
37
+ end
38
+
39
+ # return the finished view object
40
+ view
41
+ end
42
+ end
21
43
  end
22
44
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flutterby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hendrik Mans