flutterby 0.0.9 → 0.0.10

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.
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