flutterby 0.0.12 → 0.0.13

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: a2c1bd44e0401ad1f8046a70b01ca191d8d8661c
4
- data.tar.gz: 74e111066e2dcdf84c50db61daab894e069d7376
3
+ metadata.gz: 2c87a6c4e67963aa5d66c2225d60b9e228a2d852
4
+ data.tar.gz: 896782e01a481af93bc5da7d9a277bc9252d9f29
5
5
  SHA512:
6
- metadata.gz: f0a76a23bd09f814804040af24d20df03e7ddcbfa3f1c88833019b356db31ec8f3c228c85a592e86f237d41a71bfd10a9c21af7bc92ff26ad4f6f5d15fb7f73e
7
- data.tar.gz: 7bde567d6c410cab6bee564921f6598b0549ed45b322fb96f0daab9fbb11dfbde57f8abc7a8ca46b316fa99f51e17f0a34fffed592f85d9bc0a476384fc0bf3d
6
+ metadata.gz: 52dcaab598ca23c831ff348a3fdeb56124a4ce663c45c36ba47d4211370d602f8b1e0389de27fc9ec830b79abe0761dcbfe5c64a47834de46f17b75418424e72
7
+ data.tar.gz: 760b7537767012d5b6d044c537d461bfd52514c2feeb5bf114d4213de1805add17e09eaff1225cb2af0381076f1c6f4f2f99201a644a638dce558ebee55d5392
data/exe/flutterby CHANGED
@@ -1,3 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
- require 'rubygems'
2
+ if File.file?("Gemfile")
3
+ require "bundler"
4
+ Bundler.require
5
+ else
6
+ require 'rubygems'
7
+ end
8
+
3
9
  require 'flutterby/cli'
data/lib/flutterby.rb CHANGED
@@ -14,7 +14,11 @@ require "flutterby/server"
14
14
 
15
15
 
16
16
  module Flutterby
17
- def Flutterby.from(fs_path, name: nil, parent: nil)
17
+ extend self
18
+
19
+ attr_writer :logger
20
+
21
+ def from(fs_path, name: nil, parent: nil)
18
22
  name ||= ::File.basename(fs_path)
19
23
 
20
24
  if ::File.exist?(fs_path)
@@ -23,4 +27,8 @@ module Flutterby
23
27
  raise "Path #{fs_path} could not be found."
24
28
  end
25
29
  end
30
+
31
+ def logger
32
+ @logger ||= Logger.new(STDOUT)
33
+ end
26
34
  end
data/lib/flutterby/cli.rb CHANGED
@@ -1,5 +1,8 @@
1
1
  require 'commander'
2
2
  require 'flutterby'
3
+ require 'benchmark'
4
+
5
+ Flutterby.logger.level = Logger::INFO
3
6
 
4
7
  Commander.configure do
5
8
  program :name, 'Flutterby'
@@ -16,8 +19,23 @@ Commander.configure do
16
19
  c.action do |args, options|
17
20
  options.default in: "./site/", out: "./_build/"
18
21
 
19
- root = Flutterby.from(options.in, name: "/")
20
- root.export(into: options.out)
22
+ # Simplify logger output
23
+ Flutterby.logger.formatter = proc do |severity, datetime, progname, msg|
24
+ " • #{msg}\n"
25
+ end
26
+
27
+ time = Benchmark.realtime do
28
+ # Import site
29
+ say color("📚 Importing site...", :bold)
30
+ root = Flutterby.from(options.in, name: "/")
31
+ say color("🌲 Read #{root.tree_size} nodes.", :green, :bold)
32
+
33
+ # Export site
34
+ say color("💾 Exporting site...", :bold)
35
+ root.export(into: options.out)
36
+ end
37
+
38
+ say color("✅ Done. (took #{sprintf "%.2f", time}s)", :green, :bold)
21
39
  end
22
40
  end
23
41
  alias_command :b, :build
@@ -32,7 +50,11 @@ Commander.configure do
32
50
  c.action do |args, options|
33
51
  options.default in: "./site/", port: 4004
34
52
 
53
+ say color("📚 Importing site...", :bold)
35
54
  root = Flutterby.from(options.in, name: "/")
55
+ say color("🌲 Read #{root.tree_size} nodes.", :green, :bold)
56
+
57
+ say color("🌤 Serving your site on port #{options.port}. Enjoy!", :bold)
36
58
  server = Flutterby::Server.new(root, port: options.port)
37
59
  server.run!
38
60
  end
@@ -1,3 +1,5 @@
1
+ require 'benchmark'
2
+
1
3
  module Flutterby
2
4
  class Node
3
5
  attr_accessor :parent, :ext, :source, :body
@@ -32,21 +34,24 @@ module Flutterby
32
34
 
33
35
  def reset_children!
34
36
  @children = []
35
- me = self
37
+ end
38
+
39
+ def add_child(node)
40
+ node.parent = self
41
+ children << node
42
+ end
36
43
 
37
- # Inject some extra methods into this array because this is dirty old Ruby
38
- @children.define_singleton_method(:<<) do |c|
39
- c.parent = me
40
- super(c)
44
+ def find_child(name)
45
+ if name.include?(".")
46
+ @children.find { |c| c.full_name == name }
47
+ else
48
+ @children.find { |c| c.name == name }
41
49
  end
50
+ end
42
51
 
43
- @children.define_singleton_method(:find_by_name) do |name|
44
- # Look for a fully qualified name (index.html), or a simple name (index)?
45
- if name.include?(".")
46
- find { |c| c.full_name == name }
47
- else
48
- find { |c| c.name == name }
49
- end
52
+ def tree_size
53
+ children.inject(children.length) do |count, child|
54
+ count + child.tree_size
50
55
  end
51
56
  end
52
57
 
@@ -81,6 +86,10 @@ module Flutterby
81
86
  parent ? parent.root : self
82
87
  end
83
88
 
89
+ def root?
90
+ root == self
91
+ end
92
+
84
93
  def sibling(name)
85
94
  parent && parent.find(name)
86
95
  end
@@ -99,7 +108,7 @@ module Flutterby
99
108
  when %r{^/} then
100
109
  root.find($')
101
110
  when %r{^([^/]+)/?} then
102
- child = @children.find_by_name($1)
111
+ child = find_child($1)
103
112
  $'.empty? ? child : child.find($')
104
113
  end
105
114
  end
@@ -120,6 +129,16 @@ module Flutterby
120
129
  blk.call(self, val)
121
130
  end
122
131
 
132
+ # Walk the entire tree, top to bottom.
133
+ #
134
+ def walk_tree(val = nil, &blk)
135
+ val = blk.call(self, val)
136
+ children.each do |child|
137
+ val = child.walk_tree(val, &blk)
138
+ end
139
+
140
+ val
141
+ end
123
142
 
124
143
  #
125
144
  # Reading from filesystem
@@ -129,11 +148,13 @@ module Flutterby
129
148
  @body = nil
130
149
  reset_children!
131
150
 
151
+ # Load contents from filesystem
152
+ #
132
153
  if @fs_path
133
154
  if ::File.directory?(fs_path)
134
155
  Dir[::File.join(fs_path, "*")].each do |entry|
135
- if node = Flutterby.from(entry)
136
- children << node
156
+ if node = Flutterby.from(entry, parent: self)
157
+ add_child(node)
137
158
  end
138
159
  end
139
160
  else
@@ -153,8 +174,23 @@ module Flutterby
153
174
  send(meth) if respond_to?(meth)
154
175
  end
155
176
  end
177
+
178
+ # If this node is the root node, perform some preprocessing
179
+ if root?
180
+ preprocess!
181
+ end
182
+ end
183
+
184
+ def preprocess!
185
+ walk_tree do |node|
186
+ node.render_body! if node.should_preprocess?
187
+ end
156
188
  end
157
189
 
190
+ def should_preprocess?
191
+ should_publish? && !folder? &&
192
+ (filters.include?("json") || filters.include?("yaml"))
193
+ end
158
194
 
159
195
  #
160
196
  # Rendering
@@ -164,8 +200,16 @@ module Flutterby
164
200
  @view ||= View.for(self)
165
201
  end
166
202
 
203
+ def render_body!
204
+ time = Benchmark.realtime do
205
+ Filters.apply!(self)
206
+ end
207
+
208
+ logger.info "Rendered #{url} in #{sprintf "%.1f", time * 1000}ms"
209
+ end
210
+
167
211
  def body
168
- Filters.apply!(self) if @body.nil?
212
+ render_body! if @body.nil?
169
213
  @body
170
214
  end
171
215
 
@@ -196,8 +240,11 @@ module Flutterby
196
240
 
197
241
  def export(into:)
198
242
  if should_publish?
199
- puts "* #{url}"
200
- write_static(into: into)
243
+ time = Benchmark.realtime do
244
+ write_static(into: into)
245
+ end
246
+
247
+ logger.info "Exported #{url}"
201
248
  end
202
249
  end
203
250
 
@@ -243,11 +290,11 @@ module Flutterby
243
290
  end
244
291
 
245
292
  def read_json
246
- data.merge!(JSON.parse(@source))
293
+ data.merge!(JSON.parse(body))
247
294
  end
248
295
 
249
296
  def read_yaml
250
- data.merge!(YAML.load(@source))
297
+ data.merge!(YAML.load(body))
251
298
  end
252
299
 
253
300
 
@@ -270,5 +317,9 @@ module Flutterby
270
317
  def page?
271
318
  !folder? && ext == "html"
272
319
  end
320
+
321
+ def logger
322
+ Flutterby.logger
323
+ end
273
324
  end
274
325
  end
@@ -15,7 +15,7 @@ module Flutterby
15
15
  # puts "added absolute path: #{added}"
16
16
  # puts "removed absolute path: #{removed}"
17
17
 
18
- puts "Change detected, reloading everything!"
18
+ Flutterby.logger.info "Change detected, reloading everything!"
19
19
  @root.reload!
20
20
  end
21
21
 
@@ -30,7 +30,7 @@ module Flutterby
30
30
 
31
31
  # Go!
32
32
  listener.start
33
- server.run self, Port: @port
33
+ server.run self, Port: @port, Logger: Flutterby.logger
34
34
  end
35
35
 
36
36
  def call(env)
@@ -1,3 +1,3 @@
1
1
  module Flutterby
2
- VERSION = "0.0.12"
2
+ VERSION = "0.0.13"
3
3
  end
@@ -25,8 +25,8 @@ module Flutterby
25
25
  view = new(file)
26
26
 
27
27
  # walk the tree up to dynamically extend the view
28
- file.parent.walk_down do |e|
29
- if view_node = e.find("_view.rb")
28
+ file.walk_down do |e|
29
+ if view_node = e.sibling("_view.rb")
30
30
  case view_node.ext
31
31
  when "rb" then
32
32
  mod = Module.new
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flutterby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hendrik Mans
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-01-08 00:00:00.000000000 Z
11
+ date: 2017-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler