jekyll-remote-theme 0.1.0 → 0.2.0
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f143d51ba614a2d6ee6050d17b36942e09f3a6ba
|
4
|
+
data.tar.gz: 6920fee94da6e9cdc86e84fb64a80991ea8d1e84
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e0c47f5100f3abb9948fc3c24cd5dbba8673ddc3f554793b278d4cc7f7d53a3257a1dd684d7122330d999145540d338008b289aec938ccd92be94460ab6e2ea
|
7
|
+
data.tar.gz: 136a0edffff8009838810ac562ea521f2fa01a39ea4222382f5f6c03cbb11b85caaa60c357deba097d5f8504b06c45e05f366ad6ad996f8e7c56135b5eac003e
|
data/lib/jekyll-remote-theme.rb
CHANGED
@@ -4,11 +4,15 @@ require "jekyll"
|
|
4
4
|
require "fileutils"
|
5
5
|
require "tempfile"
|
6
6
|
require "addressable"
|
7
|
+
require "typhoeus"
|
8
|
+
require "zip"
|
7
9
|
|
8
10
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
9
11
|
|
10
12
|
module Jekyll
|
11
13
|
module RemoteTheme
|
14
|
+
class DownloadError < StandardError; end
|
15
|
+
|
12
16
|
autoload :Downloader, "jekyll-remote-theme/downloader"
|
13
17
|
autoload :Executor, "jekyll-remote-theme/executor"
|
14
18
|
autoload :MockGemspec, "jekyll-remote-theme/mock_gemspec"
|
@@ -16,8 +20,9 @@ module Jekyll
|
|
16
20
|
autoload :Theme, "jekyll-remote-theme/theme"
|
17
21
|
autoload :VERSION, "jekyll-remote-theme/version"
|
18
22
|
|
19
|
-
CONFIG_KEY
|
20
|
-
LOG_KEY
|
23
|
+
CONFIG_KEY = "remote_theme".freeze
|
24
|
+
LOG_KEY = "Remote Theme:".freeze
|
25
|
+
TEMP_PREFIX = "jekyll-remote-theme-".freeze
|
21
26
|
|
22
27
|
def self.init(site)
|
23
28
|
Munger.new(site).munge!
|
@@ -28,3 +33,5 @@ end
|
|
28
33
|
Jekyll::Hooks.register :site, :after_reset do |site|
|
29
34
|
Jekyll::RemoteTheme.init(site)
|
30
35
|
end
|
36
|
+
|
37
|
+
Ethon.logger = Jekyll.logger.writer
|
@@ -7,8 +7,12 @@ module Jekyll
|
|
7
7
|
|
8
8
|
HOST = "https://codeload.github.com".freeze
|
9
9
|
PROJECT_URL = "https://github.com/benbalter/jekyll-remote-theme".freeze
|
10
|
-
|
11
|
-
|
10
|
+
TYPHOEUS_OPTIONS = {
|
11
|
+
:headers => {
|
12
|
+
:user_agent => "Jekyll Remote Theme/#{VERSION} (+#{PROJECT_URL})",
|
13
|
+
},
|
14
|
+
:verbose => (Jekyll.logger.level == :verbose),
|
15
|
+
}.freeze
|
12
16
|
|
13
17
|
attr_reader :theme
|
14
18
|
private :theme
|
@@ -25,7 +29,6 @@ module Jekyll
|
|
25
29
|
|
26
30
|
download
|
27
31
|
unzip
|
28
|
-
set_theme_root
|
29
32
|
|
30
33
|
@downloaded = true
|
31
34
|
end
|
@@ -34,10 +37,6 @@ module Jekyll
|
|
34
37
|
@downloaded ||= theme_dir_exists? && !theme_dir_empty?
|
35
38
|
end
|
36
39
|
|
37
|
-
def temp_dir
|
38
|
-
@temp_dir ||= File.realpath Dir.mktmpdir(TEMP_PREFIX)
|
39
|
-
end
|
40
|
-
|
41
40
|
private
|
42
41
|
|
43
42
|
def zip_file
|
@@ -46,29 +45,24 @@ module Jekyll
|
|
46
45
|
|
47
46
|
def download
|
48
47
|
Jekyll.logger.debug LOG_KEY, "Downloading #{zip_url} to #{zip_file.path}"
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
48
|
+
request = Typhoeus::Request.new zip_url, TYPHOEUS_OPTIONS
|
49
|
+
request.on_headers { |response| raise_if_unsuccessful(response) }
|
50
|
+
request.on_body { |chunk| zip_file.write(chunk) }
|
51
|
+
request.on_complete { |response| raise_if_unsuccessful(response) }
|
52
|
+
request.run
|
54
53
|
end
|
55
54
|
|
56
55
|
def unzip
|
57
|
-
Jekyll.logger.debug LOG_KEY, "Unzipping #{zip_file.path} to #{
|
58
|
-
cmd = [*timeout_command, "unzip", zip_file.path, "-d", temp_dir]
|
59
|
-
run_command(*cmd)
|
60
|
-
zip_file.unlink
|
61
|
-
end
|
56
|
+
Jekyll.logger.debug LOG_KEY, "Unzipping #{zip_file.path} to #{theme.root}"
|
62
57
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
Jekyll.logger.debug LOG_KEY, "Setting theme root to #{theme.root}"
|
58
|
+
# File IO is already open, rewind pointer to start of file to read
|
59
|
+
zip_file.rewind
|
60
|
+
|
61
|
+
Zip::File.open(zip_file) do |archive|
|
62
|
+
archive.each { |file| file.extract path_without_name_and_ref(file.name) }
|
63
|
+
end
|
64
|
+
|
65
|
+
zip_file.unlink
|
72
66
|
end
|
73
67
|
|
74
68
|
# Full URL to codeload zip download endpoint for the given theme
|
@@ -85,6 +79,26 @@ module Jekyll
|
|
85
79
|
def theme_dir_empty?
|
86
80
|
Dir["#{theme.root}/*"].empty?
|
87
81
|
end
|
82
|
+
|
83
|
+
def raise_if_unsuccessful(response)
|
84
|
+
if response.timed_out?
|
85
|
+
raise DownloadError, "Request timed out"
|
86
|
+
elsif response.code.zero?
|
87
|
+
raise DownloadError, response.return_message
|
88
|
+
elsif response.code != 200
|
89
|
+
msg = "Request failed with #{response.code} - #{response.status_message}"
|
90
|
+
raise DownloadError, msg
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Codeload generated zip files contain a top level folder in the form of
|
95
|
+
# THEME_NAME-GIT_REF/. While requests for Git repos are case incensitive,
|
96
|
+
# the zip subfolder will respect the case in the repository's name, thus
|
97
|
+
# making it impossible to predict the true path to the theme. In case we're
|
98
|
+
# on a case-sensitive file system, strip the parent folder from all paths.
|
99
|
+
def path_without_name_and_ref(path)
|
100
|
+
Jekyll.sanitized_path theme.root, path.split("/").drop(1).join("/")
|
101
|
+
end
|
88
102
|
end
|
89
103
|
end
|
90
104
|
end
|
@@ -58,8 +58,8 @@ module Jekyll
|
|
58
58
|
def enqueue_theme_cleanup
|
59
59
|
at_exit do
|
60
60
|
return unless munged? && downloader.downloaded?
|
61
|
-
Jekyll.logger.debug LOG_KEY, "Cleaning up #{
|
62
|
-
FileUtils.rm_rf
|
61
|
+
Jekyll.logger.debug LOG_KEY, "Cleaning up #{theme.root}"
|
62
|
+
FileUtils.rm_rf theme.root
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
@@ -16,6 +16,7 @@ module Jekyll
|
|
16
16
|
# 2. owner/theme-name@git_ref - a GitHub owner + theme-name + Git ref string
|
17
17
|
def initialize(raw_theme)
|
18
18
|
@raw_theme = raw_theme.to_s.downcase.strip
|
19
|
+
super(@raw_theme)
|
19
20
|
end
|
20
21
|
|
21
22
|
def name
|
@@ -39,13 +40,8 @@ module Jekyll
|
|
39
40
|
theme_parts[:ref] || "master"
|
40
41
|
end
|
41
42
|
|
42
|
-
# Override Jekyll::Theme's native #root which calls gemspec.full_gem_path
|
43
43
|
def root
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
def root=(path)
|
48
|
-
@root = File.realpath(path)
|
44
|
+
@root ||= File.realpath Dir.mktmpdir(TEMP_PREFIX)
|
49
45
|
end
|
50
46
|
|
51
47
|
def inspect
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-remote-theme
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Balter
|
@@ -24,6 +24,34 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3.5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rubyzip
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: typhoeus
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.1'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.1'
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: jekyll-theme-primer
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|