nanoc-gzip.rb 0.2.2

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 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: []