jekyll-remote-theme 0.2.4 → 0.3.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 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