jekyll-watch 1.0.0 → 1.1.0
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 +4 -4
- data/.gitignore +4 -0
- data/.travis.yml +20 -0
- data/History.markdown +15 -0
- data/README.md +2 -0
- data/jekyll-watch.gemspec +3 -1
- data/lib/jekyll-watch.rb +2 -1
- data/lib/jekyll/commands/watch.rb +19 -52
- data/lib/jekyll/watcher.rb +83 -0
- data/script/bootstrap +8 -0
- data/script/cibuild +3 -0
- data/script/test +3 -0
- data/script/test-watcher +5 -0
- data/script/unbundle +8 -0
- data/spec/spec_helper.rb +71 -0
- data/spec/test-site/.gitignore +1 -0
- data/spec/test-site/_config.dev.toml +1 -0
- data/spec/test-site/_config.yml +15 -0
- data/spec/test-site/_includes/footer.html +55 -0
- data/spec/test-site/_includes/head.html +11 -0
- data/spec/test-site/_includes/header.html +27 -0
- data/spec/test-site/_layouts/default.html +20 -0
- data/spec/test-site/_layouts/page.html +14 -0
- data/spec/test-site/_layouts/post.html +15 -0
- data/spec/test-site/_posts/2014-08-08-welcome-to-jekyll.markdown +25 -0
- data/spec/test-site/_sass/_base.scss +201 -0
- data/spec/test-site/_sass/_layout.scss +236 -0
- data/spec/test-site/_sass/_syntax-highlighting.scss +67 -0
- data/spec/test-site/about.md +11 -0
- data/spec/test-site/css/main.scss +50 -0
- data/spec/test-site/feed.xml +30 -0
- data/spec/test-site/index.html +23 -0
- data/spec/watcher_spec.rb +54 -0
- metadata +77 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5af48120c14729914c6d38399ba3555784b2f750
|
4
|
+
data.tar.gz: 90e8fa82eba51acc47c7407d1398fd12ff118506
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4245c05ecf747b93fbc9fc86203d062f6f585a77d549807c29c2601fad7cc676a57507db5a7b90492be7ab4f88dab74d80f5b5f190cad36ec884e5f404ab25e2
|
7
|
+
data.tar.gz: 4a1196d1a352272c409fd213abec35b61391946c6085bafaffe1a1f85a9c0e38735776602e580d3694dcefa318d24d75e7c28cbe364283f3dcdeccc1e3579656
|
data/.gitignore
CHANGED
data/.travis.yml
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- 1.9.3
|
4
|
+
- 2.0
|
5
|
+
- 2.1
|
6
|
+
install:
|
7
|
+
- travis_retry script/unbundle
|
8
|
+
- travis_retry script/bootstrap
|
9
|
+
script: script/cibuild
|
10
|
+
notifications:
|
11
|
+
irc:
|
12
|
+
on_success: change
|
13
|
+
on_failure: change
|
14
|
+
channels:
|
15
|
+
- irc.freenode.org#jekyll
|
16
|
+
template:
|
17
|
+
- '%{repository}#%{build_number} %{message} %{build_url}'
|
18
|
+
email:
|
19
|
+
on_success: never
|
20
|
+
on_failure: change
|
data/History.markdown
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
## 1.1.0 / 2014-08-10
|
2
|
+
|
3
|
+
### Minor Enhancements
|
4
|
+
|
5
|
+
* Refactor the whole watching thing and compartmentalize it. (#5)
|
6
|
+
* Don't listen to things in the `exclude` configuration option. (#5)
|
7
|
+
|
8
|
+
### Development Fixes
|
9
|
+
|
10
|
+
* Add github stuff and the beginnings of the test suite (#6)
|
11
|
+
* Flesh out the test suite (#7)
|
12
|
+
|
13
|
+
## 1.0.0 / 2014-06-27
|
14
|
+
|
15
|
+
* Birthday!
|
data/README.md
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
Rebuild your Jekyll site when a file changes with the `--watch` switch.
|
4
4
|
|
5
|
+
[](https://travis-ci.org/jekyll/jekyll-watch)
|
6
|
+
|
5
7
|
## Installation
|
6
8
|
|
7
9
|
**`jekyll-watch` comes pre-installed with Jekyll 2.1 or greater.**
|
data/jekyll-watch.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = "jekyll-watch"
|
5
|
-
spec.version = "1.
|
5
|
+
spec.version = "1.1.0"
|
6
6
|
spec.authors = ["Parker Moore"]
|
7
7
|
spec.email = ["parkrmoore@gmail.com"]
|
8
8
|
spec.summary = %q{Rebuild your Jekyll site when a file changes with the `--watch` switch.}
|
@@ -24,4 +24,6 @@ Gem::Specification.new do |spec|
|
|
24
24
|
|
25
25
|
spec.add_development_dependency "bundler", "~> 1.6"
|
26
26
|
spec.add_development_dependency "rake"
|
27
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
28
|
+
spec.add_development_dependency "jekyll", "~> 2.0"
|
27
29
|
end
|
data/lib/jekyll-watch.rb
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
|
1
|
+
require_relative "jekyll/watcher"
|
2
|
+
require_relative "jekyll/commands/watch"
|
@@ -1,61 +1,28 @@
|
|
1
1
|
module Jekyll
|
2
2
|
module Commands
|
3
|
-
|
4
|
-
|
3
|
+
module Watch
|
4
|
+
extend self
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
end
|
9
|
-
|
10
|
-
# Build your jekyll site
|
11
|
-
# Continuously watch if `watch` is set to true in the config.
|
12
|
-
def process(options)
|
13
|
-
Jekyll.logger.log_level = :error if options['quiet']
|
14
|
-
watch(site, options) if options['watch']
|
15
|
-
end
|
16
|
-
|
17
|
-
# Watch for file changes and rebuild the site.
|
18
|
-
#
|
19
|
-
# site - A Jekyll::Site instance
|
20
|
-
# options - A Hash of options passed to the command
|
21
|
-
#
|
22
|
-
# Returns nothing.
|
23
|
-
def watch(site, options)
|
24
|
-
require 'listen'
|
25
|
-
|
26
|
-
listener = Listen.to(
|
27
|
-
options['source'],
|
28
|
-
:ignore => ignore_paths(options),
|
29
|
-
:force_polling => options['force_polling']
|
30
|
-
) do |modified, added, removed|
|
31
|
-
t = Time.now.strftime("%Y-%m-%d %H:%M:%S")
|
32
|
-
n = modified.length + added.length + removed.length
|
33
|
-
print Jekyll.logger.formatted_topic("Regenerating:") + "#{n} files at #{t} "
|
34
|
-
begin
|
35
|
-
process_site(site)
|
36
|
-
puts "...done."
|
37
|
-
rescue => e
|
38
|
-
puts "...error:"
|
39
|
-
Jekyll.logger.warn "Error:", e.message
|
40
|
-
Jekyll.logger.warn "Error:", "Run jekyll build --trace for more information."
|
41
|
-
end
|
42
|
-
end
|
43
|
-
listener.start
|
44
|
-
|
45
|
-
Jekyll.logger.info "Auto-regeneration:", "enabled for '#{options['source']}'"
|
46
|
-
|
47
|
-
unless options['serving']
|
48
|
-
trap("INT") do
|
49
|
-
listener.stop
|
50
|
-
puts " Halting auto-regeneration."
|
51
|
-
exit 0
|
52
|
-
end
|
6
|
+
def init_with_program(prog)
|
7
|
+
end
|
53
8
|
|
54
|
-
|
55
|
-
|
56
|
-
|
9
|
+
# Build your jekyll site
|
10
|
+
# Continuously watch if `watch` is set to true in the config.
|
11
|
+
def process(options)
|
12
|
+
Jekyll.logger.log_level = :error if options['quiet']
|
13
|
+
watch(site, options) if options['watch']
|
14
|
+
end
|
57
15
|
|
16
|
+
# Watch for file changes and rebuild the site.
|
17
|
+
#
|
18
|
+
# site - A Jekyll::Site instance
|
19
|
+
# options - A Hash of options passed to the command
|
20
|
+
#
|
21
|
+
# Returns nothing.
|
22
|
+
def watch(site, options)
|
23
|
+
Jekyll::Watcher.watch(options)
|
58
24
|
end
|
25
|
+
|
59
26
|
end
|
60
27
|
end
|
61
28
|
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module Watcher
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def watch(options)
|
6
|
+
listener = build_listener(options)
|
7
|
+
listener.start
|
8
|
+
|
9
|
+
Jekyll.logger.info "Auto-regeneration:", "enabled for '#{options['source']}'"
|
10
|
+
|
11
|
+
unless options['serving']
|
12
|
+
trap("INT") do
|
13
|
+
listener.stop
|
14
|
+
puts " Halting auto-regeneration."
|
15
|
+
exit 0
|
16
|
+
end
|
17
|
+
|
18
|
+
loop { sleep 1000 }
|
19
|
+
end
|
20
|
+
rescue ThreadError => e
|
21
|
+
# You pressed Ctrl-C, oh my!
|
22
|
+
end
|
23
|
+
|
24
|
+
def build_listener(options)
|
25
|
+
require 'listen'
|
26
|
+
Listen.to(
|
27
|
+
options['source'],
|
28
|
+
:ignore => listen_ignore_paths(options),
|
29
|
+
:force_polling => options['force_polling'],
|
30
|
+
&(listen_handler(options))
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
def listen_handler(options)
|
35
|
+
proc { |modified, added, removed|
|
36
|
+
t = Time.now.strftime("%Y-%m-%d %H:%M:%S")
|
37
|
+
c = modified + added + removed
|
38
|
+
n = c.length
|
39
|
+
print Jekyll.logger.message("Regenerating:", "#{n} files at #{t} ")
|
40
|
+
begin
|
41
|
+
Jekyll::Command.process_site(Jekyll::Site.new(options))
|
42
|
+
puts "...done."
|
43
|
+
rescue => e
|
44
|
+
puts "...error:"
|
45
|
+
Jekyll.logger.warn "Error:", e.message
|
46
|
+
Jekyll.logger.warn "Error:", "Run jekyll build --trace for more information."
|
47
|
+
end
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
# Paths to ignore for the watch option
|
52
|
+
#
|
53
|
+
# options - A Hash of options passed to the command
|
54
|
+
#
|
55
|
+
# Returns a list of relative paths from source that should be ignored
|
56
|
+
def listen_ignore_paths(options)
|
57
|
+
source = options['source']
|
58
|
+
destination = options['destination']
|
59
|
+
config_files = Jekyll.sanitized_path(source, "_config.yml")
|
60
|
+
paths = (
|
61
|
+
Array(config_files) \
|
62
|
+
+ Array(destination) \
|
63
|
+
+ Array(options['exclude']).map { |e| Jekyll.sanitized_path(source, e) }
|
64
|
+
)
|
65
|
+
ignored = []
|
66
|
+
|
67
|
+
source_abs = Pathname.new(source).expand_path
|
68
|
+
paths.each do |p|
|
69
|
+
path_abs = Pathname.new(p).expand_path
|
70
|
+
begin
|
71
|
+
rel_path = path_abs.relative_path_from(source_abs).to_s
|
72
|
+
ignored << Regexp.new(Regexp.escape(rel_path)) unless rel_path.start_with?('../')
|
73
|
+
rescue ArgumentError
|
74
|
+
# Could not find a relative path
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
Jekyll.logger.debug "Watcher:", "Ignoring #{ignored.map(&:inspect).join(', ')}"
|
79
|
+
ignored
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
data/script/bootstrap
ADDED
data/script/cibuild
ADDED
data/script/test
ADDED
data/script/test-watcher
ADDED
data/script/unbundle
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'jekyll'
|
2
|
+
require File.expand_path('../../lib/jekyll-watch.rb', __FILE__)
|
3
|
+
TEST_DIR = File.expand_path('..', __FILE__)
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
# These two settings work together to allow you to limit a spec run
|
7
|
+
# to individual examples or groups you care about by tagging them with
|
8
|
+
# `:focus` metadata. When nothing is tagged with `:focus`, all examples
|
9
|
+
# get run.
|
10
|
+
config.filter_run :focus
|
11
|
+
config.run_all_when_everything_filtered = true
|
12
|
+
|
13
|
+
# Many RSpec users commonly either run the entire suite or an individual
|
14
|
+
# file, and it's useful to allow more verbose output when running an
|
15
|
+
# individual spec file.
|
16
|
+
if config.files_to_run.one?
|
17
|
+
# Use the documentation formatter for detailed output,
|
18
|
+
# unless a formatter has already been configured
|
19
|
+
# (e.g. via a command-line flag).
|
20
|
+
config.default_formatter = 'doc'
|
21
|
+
end
|
22
|
+
|
23
|
+
# Print the 10 slowest examples and example groups at the
|
24
|
+
# end of the spec run, to help surface which specs are running
|
25
|
+
# particularly slow.
|
26
|
+
config.profile_examples = 10
|
27
|
+
|
28
|
+
# Run specs in random order to surface order dependencies. If you find an
|
29
|
+
# order dependency and want to debug it, you can fix the order by providing
|
30
|
+
# the seed, which is printed after each run.
|
31
|
+
# --seed 1234
|
32
|
+
config.order = :random
|
33
|
+
|
34
|
+
# Seed global randomization in this process using the `--seed` CLI option.
|
35
|
+
# Setting this allows you to use `--seed` to deterministically reproduce
|
36
|
+
# test failures related to randomization by passing the same `--seed` value
|
37
|
+
# as the one that triggered the failure.
|
38
|
+
Kernel.srand config.seed
|
39
|
+
|
40
|
+
# rspec-expectations config goes here. You can use an alternate
|
41
|
+
# assertion/expectation library such as wrong or the stdlib/minitest
|
42
|
+
# assertions if you prefer.
|
43
|
+
config.expect_with :rspec do |expectations|
|
44
|
+
# Enable only the newer, non-monkey-patching expect syntax.
|
45
|
+
# For more details, see:
|
46
|
+
# - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
|
47
|
+
expectations.syntax = :expect
|
48
|
+
end
|
49
|
+
|
50
|
+
# rspec-mocks config goes here. You can use an alternate test double
|
51
|
+
# library (such as bogus or mocha) by changing the `mock_with` option here.
|
52
|
+
config.mock_with :rspec do |mocks|
|
53
|
+
# Enable only the newer, non-monkey-patching expect syntax.
|
54
|
+
# For more details, see:
|
55
|
+
# - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
|
56
|
+
mocks.syntax = :expect
|
57
|
+
|
58
|
+
# Prevents you from mocking or stubbing a method that does not exist on
|
59
|
+
# a real object. This is generally recommended.
|
60
|
+
mocks.verify_partial_doubles = true
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
def source_dir(*files)
|
65
|
+
File.join(TEST_DIR, 'test-site', *files)
|
66
|
+
end
|
67
|
+
|
68
|
+
def dest_dir(*files)
|
69
|
+
source_dir('_site', *files)
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
_site
|
@@ -0,0 +1 @@
|
|
1
|
+
hello = "there"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Site settings
|
2
|
+
title: jekyll-watch test site
|
3
|
+
email: your-email@domain.com
|
4
|
+
description: > # this means to ignore newlines until "baseurl:"
|
5
|
+
Write an awesome description for your new site here. You can edit this
|
6
|
+
line in _config.yml. It will appear in your document head meta (for
|
7
|
+
Google search results) and in your feed.xml site description.
|
8
|
+
baseurl: "" # the subpath of your site, e.g. /blog/
|
9
|
+
url: "http://yourdomain.com" # the base hostname & protocol for your site
|
10
|
+
twitter_username: jekyllrb
|
11
|
+
github_username: jekyll
|
12
|
+
exclude: [".gitignore"]
|
13
|
+
|
14
|
+
# Build settings
|
15
|
+
markdown: kramdown
|
@@ -0,0 +1,55 @@
|
|
1
|
+
<footer class="site-footer">
|
2
|
+
|
3
|
+
<div class="wrapper">
|
4
|
+
|
5
|
+
<h2 class="footer-heading">{{ site.title }}</h2>
|
6
|
+
|
7
|
+
<div class="footer-col-wrapper">
|
8
|
+
<div class="footer-col footer-col-1">
|
9
|
+
<ul class="contact-list">
|
10
|
+
<li>{{ site.title }}</li>
|
11
|
+
<li><a href="mailto:{{ site.email }}">{{ site.email }}</a></li>
|
12
|
+
</ul>
|
13
|
+
</div>
|
14
|
+
|
15
|
+
<div class="footer-col footer-col-2">
|
16
|
+
<ul class="social-media-list">
|
17
|
+
{% if site.github_username %}
|
18
|
+
<li>
|
19
|
+
<a href="https://github.com/{{ site.github_username }}">
|
20
|
+
<span class="icon icon--github">
|
21
|
+
<svg viewBox="0 0 16 16">
|
22
|
+
<path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/>
|
23
|
+
</svg>
|
24
|
+
</span>
|
25
|
+
|
26
|
+
<span class="username">{{ site.github_username }}</span>
|
27
|
+
</a>
|
28
|
+
</li>
|
29
|
+
{% endif %}
|
30
|
+
|
31
|
+
{% if site.twitter_username %}
|
32
|
+
<li>
|
33
|
+
<a href="https://twitter.com/{{ site.twitter_username }}">
|
34
|
+
<span class="icon icon--twitter">
|
35
|
+
<svg viewBox="0 0 16 16">
|
36
|
+
<path fill="#828282" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809
|
37
|
+
c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/>
|
38
|
+
</svg>
|
39
|
+
</span>
|
40
|
+
|
41
|
+
<span class="username">{{ site.twitter_username }}</span>
|
42
|
+
</a>
|
43
|
+
</li>
|
44
|
+
{% endif %}
|
45
|
+
</ul>
|
46
|
+
</div>
|
47
|
+
|
48
|
+
<div class="footer-col footer-col-3">
|
49
|
+
<p class="text">{{ site.description }}</p>
|
50
|
+
</div>
|
51
|
+
</div>
|
52
|
+
|
53
|
+
</div>
|
54
|
+
|
55
|
+
</footer>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<head>
|
2
|
+
<meta charset="utf-8">
|
3
|
+
<meta name="viewport" content="width=device-width">
|
4
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
5
|
+
|
6
|
+
<title>{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}</title>
|
7
|
+
<meta name="description" content="{{ site.description }}">
|
8
|
+
|
9
|
+
<link rel="stylesheet" href="{{ "/css/main.css" | prepend: site.baseurl }}">
|
10
|
+
<link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}">
|
11
|
+
</head>
|