nanoc-gzip.rb 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 908677c7913fa3a7f9e4ca35816e62a288065d3103b61d9a8a7468722bd23a88
4
+ data.tar.gz: 47232afc6b2025b46ddc0ba88df5deef8b6de463faf0998c0beca1d9d01e28a0
5
+ SHA512:
6
+ metadata.gz: 19c4a1e137926b59df1894a2adf424fe48a2c9f56fa4bf5d7b1133702e61b1bb16984aa58b793c63961e0c277e90c266599c0c32cdbd4bb63512e530412a402f
7
+ data.tar.gz: 743f721d9400f3a503217164c4b83107a0240637daeaeefde850af249ab9b392c23ca97537a895cc975c744c52f519e072be3bf42bdad379533d2c539e7405bb
@@ -0,0 +1,23 @@
1
+ name: nanoc-gzip.rb
2
+
3
+ on:
4
+ push:
5
+ branches: [ main ]
6
+ pull_request:
7
+ branches: [ main ]
8
+
9
+ jobs:
10
+ specs:
11
+ strategy:
12
+ fail-fast: false
13
+ matrix:
14
+ os: [ubuntu-latest]
15
+ ruby: [3.1, 3.2]
16
+ runs-on: ${{ matrix.os }}
17
+ steps:
18
+ - uses: actions/checkout@v2
19
+ - uses: ruby/setup-ruby@v1
20
+ with:
21
+ ruby-version: ${{ matrix.ruby }}
22
+ - run: bundle install
23
+ - run: ruby test/nanoc_gzip_filter_test.rb
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ .yardoc/
2
+ Gemfile.lock
data/.projectile ADDED
File without changes
data/.rubocop.yml ADDED
@@ -0,0 +1,24 @@
1
+ ##
2
+ # Plugins
3
+ require:
4
+ - standard
5
+ - rubocop-rspec
6
+
7
+ ##
8
+ # Defaults: standard-rb
9
+ inherit_gem:
10
+ standard: config/base.yml
11
+
12
+ ##
13
+ # Enabled
14
+ Style/FrozenStringLiteralComment:
15
+ Enabled: true
16
+
17
+ ##
18
+ # Disabled
19
+ Layout/MultilineMethodCallIndentation:
20
+ Enabled: false
21
+ Style/TrivialAccessors:
22
+ Enabled: false
23
+ Style/CommandLiteral:
24
+ Enabled: false
data/.yardopts ADDED
@@ -0,0 +1,4 @@
1
+ -m markdown -M redcarpet --no-private lib/
2
+ -
3
+ README.md
4
+ LICENSE.txt
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ Copyright (C) 2023 by 0x1eef <0x1eef@protonmail.com>
2
+
3
+ Permission to use, copy, modify, and/or distribute this
4
+ software for any purpose with or without fee is hereby
5
+ granted.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS
8
+ ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
9
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
10
+ EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
12
+ RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
14
+ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
15
+ OF THIS SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,78 @@
1
+ ## About
2
+
3
+ nanoc-gzip.rb is a
4
+ [nanoc](https://nanoc.app)
5
+ filter that integrates gzip compression into nanoc-powered
6
+ websites. The filter can be combined with the nginx module
7
+ [gzip_static](http://nginx.org/en/docs/http/ngx_http_gzip_static_module.html)
8
+ or its equivalent in other web servers.
9
+
10
+ ## Examples
11
+
12
+ **Defaults**
13
+
14
+ The following example demonstrates the compression of "app.js".
15
+ The uncompressed version (app.js) and the compressed version
16
+ (app.js.gz) are both written to disk:
17
+
18
+ ```ruby
19
+ # Rules
20
+ require "nanoc-gzip"
21
+ compile "/js/app.js" do
22
+ write("/js/app.js")
23
+ filter(:gzip)
24
+ write("/js/app.js.gz")
25
+ end
26
+ ```
27
+
28
+ **Options**
29
+
30
+ The filter can be configured with "level", and
31
+ "strategy" options. Both are integer values. The
32
+ default level is 9. And the default strategy
33
+ is 0. The
34
+ [zlib manual](https://www.zlib.net/manual.html#Constants)
35
+ documents what integers are accepted and what
36
+ they represent. Example:
37
+
38
+ ``` ruby
39
+ # Rules
40
+ require "nanoc-gzip"
41
+ compile "/js/app.js" do
42
+ write("/js/app.js")
43
+ filter(:gzip, {level: 1, strategy: 2})
44
+ write("/js/app.js.gz")
45
+ end
46
+ ```
47
+
48
+ ## Sources
49
+
50
+ * [Source code (GitHub)](https://github.com/0x1eef/nanoc-gzip.rb)
51
+ * [Source code (GitLab)](https://gitlab.com/0x1eef/nanoc-gzip.rb)
52
+
53
+ ## <a id='install'>Install</a>
54
+
55
+ **Git**
56
+
57
+ nanoc-gzip.rb is distributed as a RubyGem through its git repositories. <br>
58
+ [GitHub](https://github.com/0x1eef/nanoc-gzip.rb),
59
+ and
60
+ [GitLab](https://gitlab.com/0x1eef/nanoc-gzip.rb)
61
+ are available as sources.
62
+
63
+ ```ruby
64
+ # Gemfile
65
+ gem "nanoc-gzip.rb", github: "0x1eef/nanoc-gzip.rb", tag: "v0.2.2"
66
+ ```
67
+
68
+ **Rubygems.org**
69
+
70
+ nanoc-gzip.rb can also be installed via rubygems.org.
71
+
72
+ gem install nanoc-gzip.rb
73
+
74
+ ## License
75
+
76
+ [BSD Zero Clause](https://choosealicense.com/licenses/0bsd/).
77
+ <br>
78
+ See [LICENSE](./LICENSE).
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "nanoc/core/executor"
4
+ class Nanoc::Core::Executor
5
+ module Patch
6
+ def filter_for_filtering(filter_name)
7
+ klass = Nanoc::Core::Filter.named!(filter_name)
8
+ if klass.from_binary_or_text?
9
+ klass.new(assigns)
10
+ else
11
+ super
12
+ end
13
+ end
14
+ end
15
+ prepend(Patch)
16
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "nanoc/core/filter"
4
+ class Nanoc::Core::Filter
5
+ def self.from_binary_or_text?
6
+ return false unless @from.is_a?(Array)
7
+ @from.sort == %i[binary text]
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ require "nanoc"
2
+ require_relative "nanoc/core/executor"
3
+ require_relative "nanoc/core/filter"
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Nanoc::Gzip::Filter < Nanoc::Filter
4
+ identifier :gzip
5
+ type [:binary, :text] => :binary
6
+ include Nanoc::Gzip
7
+
8
+ ##
9
+ # @param [String] str
10
+ # @return [String]
11
+ def run(str, options = {})
12
+ gzip(
13
+ item.binary? ? File.binread(str) : str,
14
+ options[:level],
15
+ options[:strategy]
16
+ )
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "nanoc"
4
+ module Nanoc::Gzip
5
+ require "zlib"
6
+ require_relative "gzip/filter"
7
+ include Zlib
8
+
9
+ ##
10
+ # Compresses a string, and writes the string to "Nanoc::Filter#output_filename".
11
+ #
12
+ # @param [String] content
13
+ # The contents of a file.
14
+ #
15
+ # @param [Integer] level
16
+ # The compression level represented by an integer between 0, and 9. <br>
17
+ # The default is 9 (Zlib::BEST_COMPRESSION).
18
+ #
19
+ # @param [Integer] strategy
20
+ # The compression strategy represented by an integer between 0, and 4. <br>
21
+ # The default is 0 (Zlib::DEFAULT_STRATEGY).
22
+ #
23
+ # @return [void]
24
+ def gzip(content, level, strategy)
25
+ level ||= BEST_COMPRESSION
26
+ strategy ||= DEFAULT_STRATEGY
27
+ GzipWriter.open(output_filename, level, strategy) { _1.write(content) }
28
+ end
29
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nanoc
4
+ module Gzip
5
+ VERSION = "0.2.2"
6
+ end
7
+ end
data/lib/nanoc-gzip.rb ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "nanoc-gzip/core_ext/nanoc"
4
+ require_relative "nanoc-gzip/gzip"
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "./lib/nanoc-gzip/version"
4
+ Gem::Specification.new do |gem|
5
+ gem.name = "nanoc-gzip.rb"
6
+ gem.authors = ["0x1eef"]
7
+ gem.email = ["0x1eef@protonmail.com"]
8
+ gem.homepage = "https://github.com/0x1eef/nanoc-gzip.rb#readme"
9
+ gem.version = Nanoc::Gzip::VERSION
10
+ gem.licenses = ["0BSD"]
11
+ gem.files = `git ls-files`.split($/)
12
+ gem.require_paths = ["lib"]
13
+ gem.summary = "A nanoc filter that compresses content in the gzip format"
14
+ gem.description = gem.summary
15
+ gem.metadata = { "documentation_uri" => "https://0x1eef.github.io/x/nanoc-gzip.rb" }
16
+
17
+ ##
18
+ # Default gems
19
+ # Pinned to specific versions for OpenBSD support
20
+ gem.add_runtime_dependency "json", "= 2.6.1"
21
+ gem.add_runtime_dependency "racc", "= 1.6.0"
22
+ gem.add_runtime_dependency "stringio", "= 3.0.1"
23
+ gem.add_runtime_dependency "set", "= 1.0.2"
24
+
25
+ gem.add_runtime_dependency "nanoc", "~> 4.12"
26
+ gem.add_development_dependency "test-unit", "~> 3.5"
27
+ gem.add_development_dependency "yard", "~> 0.9"
28
+ gem.add_development_dependency "redcarpet", "~> 3.5"
29
+ gem.add_development_dependency "rspec", "~> 3.10"
30
+ gem.add_development_dependency "standard", "~> 1.13"
31
+ gem.add_development_dependency "rubocop-rspec", "~> 2.11"
32
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "setup"
4
+
5
+ class FilterTest < Test::Unit::TestCase
6
+ module BinaryItem
7
+ def item
8
+ OpenStruct.new("binary?" => true)
9
+ end
10
+ end
11
+
12
+ module TextItem
13
+ def item
14
+ OpenStruct.new("binary?" => false)
15
+ end
16
+ end
17
+
18
+ def teardown
19
+ FileUtils.rm(filter.output_filename)
20
+ end
21
+
22
+ def test_text_item
23
+ filter.extend(TextItem).run("hello world")
24
+ assert_match %r{^application/(x-)?gzip}, file(filter.output_filename)
25
+ end
26
+
27
+ def test_binary_item
28
+ bin_file = File.join(__dir__, "bin_test_file")
29
+ File.binwrite(bin_file, "hello world")
30
+ filter.extend(BinaryItem).run(bin_file)
31
+ assert_match %r{^application/(x-)?gzip}, file(filter.output_filename)
32
+ ensure
33
+ FileUtils.rm(bin_file)
34
+ end
35
+
36
+ private
37
+
38
+ def filter
39
+ @filter ||= Nanoc::Filter.named!(:gzip).new
40
+ end
41
+
42
+ def file(path)
43
+ %x(file -bi #{path}).chomp
44
+ end
45
+ end
data/test/setup.rb ADDED
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "test/unit"
5
+ require "nanoc-gzip"
metadata ADDED
@@ -0,0 +1,216 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nanoc-gzip.rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.2
5
+ platform: ruby
6
+ authors:
7
+ - '0x1eef'
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-01-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 2.6.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 2.6.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: racc
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 1.6.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 1.6.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: stringio
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 3.0.1
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 3.0.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: set
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 1.0.2
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 1.0.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: nanoc
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '4.12'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '4.12'
83
+ - !ruby/object:Gem::Dependency
84
+ name: test-unit
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.5'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.5'
97
+ - !ruby/object:Gem::Dependency
98
+ name: yard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.9'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.9'
111
+ - !ruby/object:Gem::Dependency
112
+ name: redcarpet
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.5'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.5'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '3.10'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '3.10'
139
+ - !ruby/object:Gem::Dependency
140
+ name: standard
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '1.13'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1.13'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rubocop-rspec
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '2.11'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '2.11'
167
+ description: A nanoc filter that compresses content in the gzip format
168
+ email:
169
+ - 0x1eef@protonmail.com
170
+ executables: []
171
+ extensions: []
172
+ extra_rdoc_files: []
173
+ files:
174
+ - ".github/workflows/specs.yml"
175
+ - ".gitignore"
176
+ - ".projectile"
177
+ - ".rubocop.yml"
178
+ - ".yardopts"
179
+ - Gemfile
180
+ - LICENSE
181
+ - README.md
182
+ - lib/nanoc-gzip.rb
183
+ - lib/nanoc-gzip/core_ext/nanoc.rb
184
+ - lib/nanoc-gzip/core_ext/nanoc/core/executor.rb
185
+ - lib/nanoc-gzip/core_ext/nanoc/core/filter.rb
186
+ - lib/nanoc-gzip/gzip.rb
187
+ - lib/nanoc-gzip/gzip/filter.rb
188
+ - lib/nanoc-gzip/version.rb
189
+ - nanoc-gzip.rb.gemspec
190
+ - test/nanoc_gzip_filter_test.rb
191
+ - test/setup.rb
192
+ homepage: https://github.com/0x1eef/nanoc-gzip.rb#readme
193
+ licenses:
194
+ - 0BSD
195
+ metadata:
196
+ documentation_uri: https://0x1eef.github.io/x/nanoc-gzip.rb
197
+ post_install_message:
198
+ rdoc_options: []
199
+ require_paths:
200
+ - lib
201
+ required_ruby_version: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ required_rubygems_version: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - ">="
209
+ - !ruby/object:Gem::Version
210
+ version: '0'
211
+ requirements: []
212
+ rubygems_version: 3.5.3
213
+ signing_key:
214
+ specification_version: 4
215
+ summary: A nanoc filter that compresses content in the gzip format
216
+ test_files: []