jekyll-remote-theme 0.2.4 → 0.3.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
  SHA256:
3
- metadata.gz: 415c69a1e7f672bd5ff2b794521e2cb63313fb2acb53dcb2cd6fd6e097c9d8fc
4
- data.tar.gz: ae79306ad3180f4d5bb24b811a2a15f72b14bbbf38e26a9bf365073b874e683e
3
+ metadata.gz: e39b39cafa24a34892141eb0d7d386988faa47a922a50195eb33458f0ec5cb18
4
+ data.tar.gz: 3ebfdb2d308084fabce1d92a5eba50fde22aa1be8cd742a7c44bcd9bc5f75e33
5
5
  SHA512:
6
- metadata.gz: ede198efdb562ac9b1f7704d1faa3b492d53e2ebcd62ba064b10d89acca36c28c6f4111b7eff004909e6c694927c3c3d7c438e1dc16536c24e6ad8d3b8b25583
7
- data.tar.gz: d860bc2b58ab158b61f68be85a32b4fa7a1f656559214a0734c4b13dc85315a649c8cac4ca66ba624132aa42a1e296329580c954ed0e6af01479b1eb8760adf4
6
+ metadata.gz: dfc7198186058021058cfcd85b34330fb1b8df153cc6ee2ae5ac280afac7e21a26e0c3257c8285890a676c9b14f600bdf1a8bf893997cf1370e95279353f0271
7
+ data.tar.gz: 93f287e3f8455eef42f66595d97e11b55aa378e2bda0e94cb644793d2ceb8429d71ab094d097d36aa036f59b4ade98c4f5af6b39cead00064939c684c003e946
@@ -4,7 +4,7 @@ require "jekyll"
4
4
  require "fileutils"
5
5
  require "tempfile"
6
6
  require "addressable"
7
- require "typhoeus"
7
+ require "net/http"
8
8
  require "zip"
9
9
 
10
10
  $LOAD_PATH.unshift(File.dirname(__FILE__))
@@ -32,5 +32,3 @@ end
32
32
  Jekyll::Hooks.register :site, :after_reset do |site|
33
33
  Jekyll::RemoteTheme.init(site)
34
34
  end
35
-
36
- Ethon.logger = Jekyll.logger.writer
@@ -5,12 +5,12 @@ module Jekyll
5
5
  class Downloader
6
6
  HOST = "https://codeload.github.com".freeze
7
7
  PROJECT_URL = "https://github.com/benbalter/jekyll-remote-theme".freeze
8
- TYPHOEUS_OPTIONS = {
9
- :headers => {
10
- :user_agent => "Jekyll Remote Theme/#{VERSION} (+#{PROJECT_URL})",
11
- },
12
- :verbose => (Jekyll.logger.level == :debug),
13
- }.freeze
8
+ USER_AGENT = "Jekyll Remote Theme/#{VERSION} (+#{PROJECT_URL})".freeze
9
+ MAX_FILE_SIZE = 1 * (1024 * 1024 * 1024) # Size in bytes (1 GB)
10
+ NET_HTTP_ERRORS = [
11
+ Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError,
12
+ Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError,
13
+ ].freeze
14
14
 
15
15
  attr_reader :theme
16
16
  private :theme
@@ -27,8 +27,6 @@ module Jekyll
27
27
 
28
28
  download
29
29
  unzip
30
-
31
- @downloaded = true
32
30
  end
33
31
 
34
32
  def downloaded?
@@ -38,16 +36,40 @@ module Jekyll
38
36
  private
39
37
 
40
38
  def zip_file
41
- @zip_file ||= Tempfile.new([TEMP_PREFIX, ".zip"])
39
+ @zip_file ||= Tempfile.new([TEMP_PREFIX, ".zip"], :binmode => true)
42
40
  end
43
41
 
44
42
  def download
45
43
  Jekyll.logger.debug LOG_KEY, "Downloading #{zip_url} to #{zip_file.path}"
46
- request = Typhoeus::Request.new zip_url, TYPHOEUS_OPTIONS
47
- request.on_headers { |response| raise_if_unsuccessful(response) }
48
- request.on_body { |chunk| zip_file.write(chunk) }
49
- request.on_complete { |response| raise_if_unsuccessful(response) }
50
- request.run
44
+ Net::HTTP.start(zip_url.host, zip_url.port, :use_ssl => true) do |http|
45
+ http.request(request) do |response|
46
+ raise_unless_sucess(response)
47
+ enforce_max_file_size(response.content_length)
48
+ response.read_body do |chunk|
49
+ zip_file.write chunk
50
+ end
51
+ end
52
+ end
53
+ @downloaded = true
54
+ rescue *NET_HTTP_ERRORS => e
55
+ raise DownloadError, e.message
56
+ end
57
+
58
+ def request
59
+ return @request if defined? @request
60
+ @request = Net::HTTP::Get.new zip_url.request_uri
61
+ @request["User-Agent"] = USER_AGENT
62
+ @request
63
+ end
64
+
65
+ def raise_unless_sucess(response)
66
+ return if response.is_a?(Net::HTTPSuccess)
67
+ raise DownloadError, "#{response.code} - #{response.message}"
68
+ end
69
+
70
+ def enforce_max_file_size(size)
71
+ return unless size && size > MAX_FILE_SIZE
72
+ raise DownloadError, "Maximum file size of #{MAX_FILE_SIZE} bytes exceeded"
51
73
  end
52
74
 
53
75
  def unzip
@@ -59,13 +81,14 @@ module Jekyll
59
81
  Zip::File.open(zip_file) do |archive|
60
82
  archive.each { |file| file.extract path_without_name_and_ref(file.name) }
61
83
  end
62
-
84
+ ensure
85
+ zip_file.close
63
86
  zip_file.unlink
64
87
  end
65
88
 
66
89
  # Full URL to codeload zip download endpoint for the given theme
67
90
  def zip_url
68
- Addressable::URI.join(
91
+ @zip_url ||= Addressable::URI.join(
69
92
  HOST, "#{theme.owner}/", "#{theme.name}/", "zip/", theme.git_ref
70
93
  ).normalize
71
94
  end
@@ -78,17 +101,6 @@ module Jekyll
78
101
  Dir["#{theme.root}/*"].empty?
79
102
  end
80
103
 
81
- def raise_if_unsuccessful(response)
82
- if response.timed_out?
83
- raise DownloadError, "Request timed out"
84
- elsif response.code.zero?
85
- raise DownloadError, response.return_message
86
- elsif response.code != 200
87
- msg = "Request failed with #{response.code} - #{response.status_message}"
88
- raise DownloadError, msg
89
- end
90
- end
91
-
92
104
  # Codeload generated zip files contain a top level folder in the form of
93
105
  # THEME_NAME-GIT_REF/. While requests for Git repos are case insensitive,
94
106
  # the zip subfolder will respect the case in the repository's name, thus
@@ -9,16 +9,43 @@ module Jekyll
9
9
  extend Forwardable
10
10
  def_delegator :theme, :root, :full_gem_path
11
11
 
12
+ DEPENDENCY_PREFIX = %r!^\s*[a-z]+\.add_(?:runtime_)?dependency!
13
+ DEPENDENCY_REGEX = %r!#{DEPENDENCY_PREFIX}\(?\s*["']([a-z_-]+)["']!
14
+
12
15
  def initialize(theme)
13
16
  @theme = theme
14
17
  end
15
18
 
16
19
  def runtime_dependencies
17
- []
20
+ @runtime_dependencies ||= dependency_names.map do |name|
21
+ Gem::Dependency.new(name)
22
+ end
18
23
  end
19
24
 
20
25
  private
21
26
 
27
+ def contents
28
+ @contents ||= File.read(path, :encoding => "utf-8") if path
29
+ end
30
+
31
+ def path
32
+ @path ||= potential_paths.find { |path| File.exist? path }
33
+ end
34
+
35
+ def potential_paths
36
+ [theme.name, "jekyll-theme-#{theme.name}"].map do |filename|
37
+ File.expand_path "#{filename}.gemspec", theme.root
38
+ end
39
+ end
40
+
41
+ def dependency_names
42
+ @dependency_names ||= if contents
43
+ contents.scan(DEPENDENCY_REGEX).flatten
44
+ else
45
+ []
46
+ end
47
+ end
48
+
22
49
  attr_reader :theme
23
50
  end
24
51
  end
@@ -53,6 +53,7 @@ module Jekyll
53
53
  site.theme = theme
54
54
  site.theme.configure_sass
55
55
  site.send(:configure_include_paths)
56
+ site.plugin_manager.require_theme_deps
56
57
  end
57
58
 
58
59
  def enqueue_theme_cleanup
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Jekyll
4
4
  module RemoteTheme
5
- VERSION = "0.2.4".freeze
5
+ VERSION = "0.3.0".freeze
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-remote-theme
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Balter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-02 00:00:00.000000000 Z
11
+ date: 2018-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -45,39 +45,33 @@ dependencies:
45
45
  - !ruby/object:Gem::Version
46
46
  version: '3.0'
47
47
  - !ruby/object:Gem::Dependency
48
- name: typhoeus
48
+ name: jekyll-theme-primer
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - ">="
52
- - !ruby/object:Gem::Version
53
- version: '0.7'
54
- - - "<"
51
+ - - "~>"
55
52
  - !ruby/object:Gem::Version
56
- version: '2.0'
57
- type: :runtime
53
+ version: '0.5'
54
+ type: :development
58
55
  prerelease: false
59
56
  version_requirements: !ruby/object:Gem::Requirement
60
57
  requirements:
61
- - - ">="
62
- - !ruby/object:Gem::Version
63
- version: '0.7'
64
- - - "<"
58
+ - - "~>"
65
59
  - !ruby/object:Gem::Version
66
- version: '2.0'
60
+ version: '0.5'
67
61
  - !ruby/object:Gem::Dependency
68
- name: jekyll-theme-primer
62
+ name: jekyll_test_plugin_malicious
69
63
  requirement: !ruby/object:Gem::Requirement
70
64
  requirements:
71
65
  - - "~>"
72
66
  - !ruby/object:Gem::Version
73
- version: '0.5'
67
+ version: '0.2'
74
68
  type: :development
75
69
  prerelease: false
76
70
  version_requirements: !ruby/object:Gem::Requirement
77
71
  requirements:
78
72
  - - "~>"
79
73
  - !ruby/object:Gem::Version
80
- version: '0.5'
74
+ version: '0.2'
81
75
  - !ruby/object:Gem::Dependency
82
76
  name: pry
83
77
  requirement: !ruby/object:Gem::Requirement
@@ -113,6 +107,9 @@ dependencies:
113
107
  - - "~>"
114
108
  - !ruby/object:Gem::Version
115
109
  version: '0.4'
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: 0.49.0
116
113
  type: :development
117
114
  prerelease: false
118
115
  version_requirements: !ruby/object:Gem::Requirement
@@ -120,6 +117,23 @@ dependencies:
120
117
  - - "~>"
121
118
  - !ruby/object:Gem::Version
122
119
  version: '0.4'
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: 0.49.0
123
+ - !ruby/object:Gem::Dependency
124
+ name: webmock
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '3.0'
130
+ type: :development
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - "~>"
135
+ - !ruby/object:Gem::Version
136
+ version: '3.0'
123
137
  description:
124
138
  email:
125
139
  - ben.balter@github.com