flutterby 0.0.12 → 0.0.13

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