yarrow 0.3.4 → 0.3.5

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: bc35279dd3d2e8d12c883c813391011aeb64656f
4
- data.tar.gz: eb12a310c3fb88687d69e4602a4dbac50d6010d6
3
+ metadata.gz: e033523f4e9cd963daf57a6550813742b5639c99
4
+ data.tar.gz: fce06e453eb7ade5d7cceb0d1aef81412c5d12d4
5
5
  SHA512:
6
- metadata.gz: b6d3cc965dcc26c80d564f776f2eeefc8e66e9db8c9bda124c15c2d1dbef2927c523656c6a93092ceaeb5fdc175b9fa3b9796ad7f84eee4444862998bbd8b5b6
7
- data.tar.gz: 1b6f155d6b036f0ab25cb002fc83f2c0e82c647aa9520ef7f8c0d70c7b4b02e666d1ec0afa548fbc88d725fa7adf265d5644b978feedea6070a211e5ba50a82e
6
+ metadata.gz: 91c941f27267787bdf6e0959262e966d2be36c2dde5261b89cc80dec853dd24409b8a48c4e17372509cbfd3938ea89b029e182d6ddf95965bc0f0cb81e51c724
7
+ data.tar.gz: 675e0ffd43413591ccc5eeaee2a88977254a62e57eb58c53a0157ce3ad66716ff3be5a24c1801840230464415b64e332e70653b40a63eabe88236c6aa71cc227
data/bin/yarrow-server CHANGED
@@ -11,5 +11,7 @@ require 'yarrow'
11
11
 
12
12
  Yarrow::Configuration.register_defaults
13
13
 
14
+ Yarrow.logger = Logger.new(STDOUT)
15
+
14
16
  server = Yarrow::Server.new
15
17
  server.run
@@ -18,12 +18,13 @@ assets:
18
18
  - js
19
19
  manifest_file: manifest.json
20
20
  server:
21
+ live_reload: true
21
22
  auto_index: true
22
23
  default_index: index.html
23
24
  default_type: text/plain
24
- port: 8888
25
+ port: 4000
25
26
  host: localhost
26
- handler: thin
27
+ handler: webrick
27
28
  middleware:
28
29
  - Rack::ShowExceptions
29
30
  - Rack::CommonLogger
@@ -1,6 +1,6 @@
1
1
  module Yarrow
2
2
  module HTML
3
- module AssetTags
3
+ module AssetTags
4
4
  include Yarrow::Configurable
5
5
 
6
6
  # TODO: make sprockets manifest optional/pluggable
@@ -11,44 +11,49 @@ module Yarrow
11
11
  ##
12
12
  # Computes the base URL path to assets in the public web directory.
13
13
  def base_url_path
14
- raise Yarrow::ConfigurationError if config.assets.nil?
15
- raise Yarrow::ConfigurationError if config.output_dir.nil?
14
+ if config.assets.nil? || config.output_dir.nil?
15
+ raise Yarrow::ConfigurationError
16
+ end
16
17
 
17
18
  # TODO: prepend configurable CDN URL for host path
18
19
  # TODO: dev/production mode switch
19
20
 
20
- assets_path = config.assets.output_dir
21
- assets_path.gsub(config.output_dir, '')
21
+ config.assets.output_dir.gsub(config.output_dir, '')
22
22
  end
23
23
 
24
24
  def script_tags
25
- manifest.js_logical_paths.map { |asset_path| script_tag(asset: asset_path) }.join("\n")
25
+ manifest.js_logical_paths.map { |path| script_tag(asset: path) }.join("\n")
26
26
  end
27
27
 
28
- # TODO: support asset path option?
29
28
  def script_tag(options)
30
- if options.has_key? :asset and manifest.exists? options[:asset]
31
- script_path = manifest.digest_path(options[:asset])
32
- src_path = "#{base_url_path}/#{script_path}"
29
+ src_path = if asset_in_manifest?(options)
30
+ digest_path(options[:asset])
33
31
  else
34
- src_path = options[:src]
32
+ options[:src]
35
33
  end
36
34
 
37
35
  "<script src=\"#{src_path}\"></script>"
38
36
  end
39
37
 
40
- # TODO: support asset path option?
41
38
  def link_tag(options)
42
- if options.has_key? :asset and manifest.exists? options[:asset]
43
- stylesheet_path = manifest.digest_path(options[:asset])
44
- href_path = "#{base_url_path}/#{stylesheet_path}"
39
+ href_path = if asset_in_manifest?(options)
40
+ digest_path(options[:asset])
45
41
  else
46
- href_path = options[:href]
42
+ options[:href]
47
43
  end
48
44
 
49
45
  "<link href=\"#{href_path}\" rel=\"stylesheet\" type=\"text/css\">"
50
46
  end
51
47
 
48
+ private
49
+
50
+ def asset_in_manifest?(options)
51
+ options.has_key?(:asset) and manifest.exists?(options[:asset])
52
+ end
53
+
54
+ def digest_path(path)
55
+ "#{base_url_path}/#{manifest.digest_path(path)}"
56
+ end
52
57
  end
53
58
  end
54
59
  end
@@ -0,0 +1,74 @@
1
+ require 'eventmachine'
2
+ require 'em-websocket'
3
+ require 'json'
4
+
5
+ module Yarrow
6
+ class Server
7
+ module Livereload
8
+ class Reactor
9
+ include Yarrow::Loggable
10
+
11
+ def initialize
12
+ @sockets = []
13
+ @running = false
14
+ end
15
+
16
+ def running?
17
+ @running
18
+ end
19
+
20
+ def start
21
+ @thread = Thread.new do
22
+ run_loop
23
+ end
24
+ @running = true
25
+ end
26
+
27
+ def stop
28
+ logger.info 'Shutting down Livereload'
29
+ @thread.kill
30
+ @running = false
31
+ end
32
+
33
+ def refresh_payload(path)
34
+ data = JSON.dump(['refresh', {
35
+ :path => path,
36
+ :apply_js_live => false,
37
+ :apply_css_live => false
38
+ }])
39
+ end
40
+
41
+ def send_refresh
42
+ @updated_paths.each do |path|
43
+ @sockets.each do |ws|
44
+ ws.send(refresh_payload(path))
45
+ end
46
+ end
47
+ end
48
+
49
+ def run_loop
50
+ EventMachine.run do
51
+ logger.info 'Starting Livereload reactor on port: 35729'
52
+
53
+ EventMachine::WebSocket.start(:host => 'localhost', :port => 35729) do |socket|
54
+ socket.onopen do
55
+ socket.send "!!ver:1.6"
56
+ @sockets << socket
57
+ logger.info 'Livereload connected'
58
+ end
59
+
60
+ socket.onmessage do |message|
61
+ logger.info "Receiving message: #{message}"
62
+ end
63
+
64
+ socket.onclose do
65
+ @sockets.delete(socket)
66
+ logger.info 'Livereload disconnected'
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
data/lib/yarrow/server.rb CHANGED
@@ -26,7 +26,7 @@ module Yarrow
26
26
 
27
27
  def call(env)
28
28
  index_path = File.join(@root, Rack::Request.new(env).path.split('/'), @index_file)
29
- if File.exists?(index_path)
29
+ if File.exist?(index_path)
30
30
  return [200, {"Content-Type" => "text/html"}, [File.read(index_path)]]
31
31
  else
32
32
  @app.call(env)
@@ -40,41 +40,56 @@ module Yarrow
40
40
  # If no output directory is specified, defaults to the current working
41
41
  # directory.
42
42
  #
43
+ # `auto_index` and `live_reload` middleware needs to run in the specific order
44
+ # which is hardcoded here.
45
+ #
43
46
  # @return [Yarrow::Server::StaticFiles]
44
47
  def app
45
- root = docroot
46
- index = default_index
47
- middleware_stack = middleware_map
48
- auto_index = auto_index?
49
- mime_type = default_type
50
-
51
- Rack::Builder.new do
52
- middleware_stack.each do |middleware|
53
- use middleware
54
- end
48
+ app = Rack::Builder.new
55
49
 
56
- use DirectoryIndex, root: root, index: index
50
+ middleware_stack.each do |middleware|
51
+ app.use(middleware)
52
+ end
57
53
 
58
- app_args = [root, {}].tap { |args| args.push(mime_type) if mime_type }
59
- static_app = Rack::File.new(*app_args)
54
+ app.use(DirectoryIndex, root: docroot, index: default_index)
60
55
 
61
- if auto_index
62
- run Rack::Directory.new(root, static_app)
63
- else
64
- run static_app
65
- end
56
+ app_args = [docroot, {}].tap { |args| args.push(default_type) if default_type }
57
+ static_app = Rack::File.new(*app_args)
58
+
59
+ if live_reload?
60
+ require 'rack-livereload'
61
+ app.use(Rack::LiveReload, no_swf: true)
62
+ end
63
+
64
+ if auto_index?
65
+ app.run(Rack::Directory.new(docroot, static_app))
66
+ else
67
+ app.run(static_app)
66
68
  end
69
+
70
+ app
67
71
  end
68
72
 
69
73
  ##
70
74
  # Starts the server.
71
75
  #
72
- # Listens on `localhost:8888` unless `server.host` and `server.port` are
76
+ # Listens on `localhost:4000` unless `server.host` and `server.port` are
73
77
  # provided in the config.
74
78
  #
75
79
  def run
76
- server = Rack::Handler.get(run_options[:server])
77
- server.run(app, run_options)
80
+ if live_reload?
81
+ reactor = Livereload::Reactor.new
82
+ reactor.start
83
+ end
84
+
85
+ handler = Rack::Handler.get(run_options[:server])
86
+
87
+ trap(:INT) do
88
+ handler.shutdown if handler.respond_to?(:shutdown)
89
+ reactor.stop
90
+ end
91
+
92
+ handler.run(app, run_options)
78
93
  end
79
94
 
80
95
  private
@@ -98,6 +113,12 @@ module Yarrow
98
113
  config.server.auto_index
99
114
  end
100
115
 
116
+ ##
117
+ # @return [TrueClass, FalseClass]
118
+ def live_reload?
119
+ if config.server.live_reload then true else false; end
120
+ end
121
+
101
122
  ##
102
123
  # @return [String]
103
124
  def default_type
@@ -106,7 +127,7 @@ module Yarrow
106
127
 
107
128
  ##
108
129
  # @return [Array<Class>]
109
- def middleware_map
130
+ def middleware_stack
110
131
  middleware = config.server.middleware || []
111
132
  middleware.map { |class_name| Kernel.const_get(class_name) }
112
133
  end
@@ -118,12 +139,12 @@ module Yarrow
118
139
  def run_options
119
140
  {
120
141
  :Port => config.server.port,
121
- :Host => config.server.port,
142
+ :Host => config.server.host,
122
143
  :server => config.server.handler.to_sym,
123
144
  :daemonize => false,
124
145
  :quiet => false,
125
146
  :warn => true,
126
- :debug => true,
147
+ :debug => false,
127
148
  }
128
149
  end
129
150
  end
@@ -2,17 +2,21 @@ module Yarrow
2
2
  module Tools
3
3
  module FrontMatter
4
4
 
5
- def read_split_content(path)
6
- extract_split_content(File.read(path, :encoding => 'utf-8'))
5
+ def read_split_content(path, options={})
6
+ extract_split_content(File.read(path, :encoding => 'utf-8'), options)
7
7
  end
8
8
 
9
- def extract_split_content(text)
9
+ def extract_split_content(text, options={})
10
10
  pattern = /^(---\s*\n.*?\n?)^(---\s*$\n?)/m
11
11
  if text =~ pattern
12
12
  content = text.sub(pattern, "")
13
13
 
14
14
  begin
15
- meta = YAML.load($1)
15
+ if options.key?(:symbolize_keys)
16
+ meta = symbolize_keys(YAML.load($1))
17
+ else
18
+ meta = YAML.load($1)
19
+ end
16
20
  return [content, meta]
17
21
  rescue Psych::SyntaxError => error
18
22
  if defined? ::Logger
@@ -22,12 +26,26 @@ module Yarrow
22
26
  end
23
27
  return [content, nil]
24
28
  end
25
-
26
29
  end
27
30
 
28
31
  [text, nil]
29
32
  end
30
33
 
34
+ def symbolize_keys(hash)
35
+ hash.inject({}) do |result, (key, value)|
36
+ new_key = case key
37
+ when String then key.to_sym
38
+ else key
39
+ end
40
+ new_value = case value
41
+ when Hash then symbolize_keys(value)
42
+ when Array then value.map { |entry| symbolize_keys(entry) }
43
+ else value
44
+ end
45
+ result[new_key] = new_value
46
+ result
47
+ end
48
+ end
31
49
  end
32
50
  end
33
51
  end
@@ -1,4 +1,4 @@
1
1
  module Yarrow
2
2
  APP_NAME = 'Yarrow'.freeze
3
- VERSION = '0.3.4'.freeze
3
+ VERSION = '0.3.5'.freeze
4
4
  end
data/lib/yarrow.rb CHANGED
@@ -6,8 +6,6 @@ require 'yarrow/logging'
6
6
  require 'yarrow/configuration'
7
7
  require 'yarrow/console_runner'
8
8
  require 'yarrow/generator'
9
- require 'yarrow/model/index'
10
- require 'yarrow/model/base'
11
9
  require 'yarrow/html/asset_tags'
12
10
  require 'yarrow/output/mapper'
13
11
  require 'yarrow/output/generator'
@@ -17,6 +15,7 @@ require 'yarrow/assets'
17
15
  require 'yarrow/html'
18
16
  require 'yarrow/tools/front_matter'
19
17
  require 'yarrow/server'
18
+ require 'yarrow/server/livereload'
20
19
 
21
20
  # Dir[File.dirname(__FILE__) + '/yarrow/generators/*.rb'].each do |generator|
22
21
  # require generator
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yarrow
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Rickerby
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-07 00:00:00.000000000 Z
11
+ date: 2017-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
@@ -80,6 +80,48 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rack-livereload
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: eventmachine
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: em-websocket
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
83
125
  - !ruby/object:Gem::Dependency
84
126
  name: bundler
85
127
  requirement: !ruby/object:Gem::Requirement
@@ -174,12 +216,11 @@ files:
174
216
  - lib/yarrow/html/asset_tags.rb
175
217
  - lib/yarrow/html/content_tags.rb
176
218
  - lib/yarrow/logging.rb
177
- - lib/yarrow/model/base.rb
178
- - lib/yarrow/model/index.rb
179
219
  - lib/yarrow/output/context.rb
180
220
  - lib/yarrow/output/generator.rb
181
221
  - lib/yarrow/output/mapper.rb
182
222
  - lib/yarrow/server.rb
223
+ - lib/yarrow/server/livereload.rb
183
224
  - lib/yarrow/tools/front_matter.rb
184
225
  - lib/yarrow/tools/output_file.rb
185
226
  - lib/yarrow/version.rb
@@ -203,7 +244,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
203
244
  version: '0'
204
245
  requirements: []
205
246
  rubyforge_project:
206
- rubygems_version: 2.2.2
247
+ rubygems_version: 2.5.1
207
248
  signing_key:
208
249
  specification_version: 4
209
250
  summary: Documentation generator based on a fluent data model.
@@ -1,13 +0,0 @@
1
- require "mementus"
2
- require "active_support/inflector"
3
-
4
- module Yarrow
5
- module Model
6
- class Base < Mementus::Model
7
- def self.inherited(klass)
8
- self.superclass.inherited(klass)
9
- Index.register(klass)
10
- end
11
- end
12
- end
13
- end
@@ -1,12 +0,0 @@
1
- require "active_support/inflector"
2
-
3
- module Yarrow
4
- module Model
5
- class Index
6
- def self.register(klass)
7
- method_name = ActiveSupport::Inflector.pluralize(ActiveSupport::Inflector.underscore(klass.to_s)).to_sym
8
- define_singleton_method method_name, lambda { klass.all }
9
- end
10
- end
11
- end
12
- end