minifyrb 0.1.0

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: 1a44790e72286a5725a7260f5fb3fee2124e5d56970539b6a2a1ff9a2ae2f67e
4
+ data.tar.gz: f6a4e1d3f0462e380ed55613fb02b72d10fdcc7ba292195b8065fc33993b53b5
5
+ SHA512:
6
+ metadata.gz: 2185f292c456b5edd03a0b07c055dd56d7ed2698599c315eba54d6c45d0715ef89f61995938e17a33cb8ca5c3c6bc06b22f9568b7654d93bd792ab28968585d0
7
+ data.tar.gz: a338db6cbc0ac8d124eb0f92202966603ea5736362664088d8317dd7202fa24f24ef5de0b7aab46e82977b678118550e6e9dd50fc7c3ec882f68cb6ce09fca48
@@ -0,0 +1,39 @@
1
+ ---
2
+ name: Bug Report
3
+ about: Report an issue with Minify Ruby you've discovered.
4
+ ---
5
+
6
+ *Be clear, concise and precise in your description of the problem.
7
+ Open an issue with a descriptive title and a summary in grammatically correct,
8
+ complete sentences.*
9
+
10
+ *Use the template below when reporting bugs. Please, make sure that
11
+ you're running the latest stable Minify Ruby and that the problem you're reporting
12
+ hasn't been reported (and potentially fixed) already.*
13
+
14
+ *Before filing the ticket you should replace all text above the horizontal
15
+ rule with your own words.*
16
+
17
+ --------
18
+
19
+ ## Expected behavior
20
+
21
+ Describe here how you expected RuboCop to behave in this particular situation.
22
+
23
+ ## Actual behavior
24
+
25
+ Describe here what actually happened.
26
+
27
+ ## Steps to reproduce the problem
28
+
29
+ This is extremely important! Providing us with a reliable way to reproduce
30
+ a problem will expedite its solution.
31
+
32
+ ## RuboCop version
33
+
34
+ Include the output of `minifyrb -v` or `bundle exec minifyrb -v` if using Bundler.
35
+
36
+ ```console
37
+ $ [bundle exec] minifyrb -v
38
+ 0.1.0
39
+ ```
@@ -0,0 +1,35 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+ workflow_dispatch:
9
+
10
+ concurrency:
11
+ group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
12
+ cancel-in-progress: true
13
+
14
+ jobs:
15
+ main:
16
+ name: Ruby ${{ matrix.ruby }}
17
+ runs-on: ubuntu-latest
18
+ strategy:
19
+ fail-fast: false
20
+ matrix:
21
+ os: [ubuntu]
22
+ ruby: ['3.3', 'head']
23
+
24
+ steps:
25
+ - name: checkout
26
+ uses: actions/checkout@v4
27
+ - name: set up Ruby
28
+ uses: ruby/setup-ruby@v1
29
+ with:
30
+ ruby-version: ${{ matrix.ruby }}
31
+ bundler-cache: true
32
+ - name: lint
33
+ run: bundle exec rake rubocop
34
+ - name: spec
35
+ run: bundle exec rake spec
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+ .ruby-version
13
+
14
+ Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,51 @@
1
+ # The behavior of RuboCop can be controlled via the .rubocop.yml
2
+ # configuration file. It makes it possible to enable/disable
3
+ # certain cops (checks) and to alter their behavior if they accept
4
+ # any parameters. The file can be placed either in your home
5
+ # directory or in some project directory.
6
+ #
7
+ # RuboCop will start looking for the configuration file in the directory
8
+ # where the inspected file is and continue its way up to the root directory.
9
+ #
10
+ # See https://docs.rubocop.org/rubocop/configuration
11
+ require:
12
+ - rubocop-rspec
13
+
14
+ AllCops:
15
+ TargetRubyVersion: 3.3
16
+ NewCops: enable
17
+ ParserEngine: parser_prism
18
+ SuggestExtensions: false
19
+
20
+ Layout/EndAlignment:
21
+ EnforcedStyleAlignWith: variable
22
+
23
+ Layout/LineLength:
24
+ Enabled: false
25
+
26
+ Lint/AmbiguousOperatorPrecedence:
27
+ Enabled: false
28
+
29
+ Metrics:
30
+ Enabled: false
31
+
32
+ Style/BlockDelimiters:
33
+ EnforcedStyle: semantic
34
+
35
+ Style/Documentation:
36
+ Enabled: false
37
+
38
+ Style/IfUnlessModifier:
39
+ Enabled: false
40
+
41
+ Style/MutableConstant:
42
+ Enabled: false
43
+
44
+ Style/PercentLiteralDelimiters:
45
+ PreferredDelimiters:
46
+ default: ()
47
+ '%i': '()'
48
+ '%I': '()'
49
+ '%r': '||'
50
+ '%w': '()'
51
+ '%W': '()'
data/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # Change log
2
+
3
+ ## master (2024-08-24)
4
+
5
+ ### New features
6
+
7
+ * Initial Release. @koic
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in minifyrb.gemspec
6
+ gemspec
7
+
8
+ gem 'rake', '~> 13.0'
9
+ gem 'rspec', '~> 3.0'
10
+ gem 'rubocop', '~> 1.64.0'
11
+ gem 'rubocop-rspec', '~> 3.0.0'
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2024 Koichi ITO
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,97 @@
1
+ # Minify Ruby
2
+
3
+ [![CI](https://github.com/koic/minifyrb/actions/workflows/test.yml/badge.svg)](https://github.com/koic/minifyrb/actions/workflows/test.yml)
4
+
5
+ A minifier of Ruby files.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'minifyrb'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ ```console
18
+ $ bundle install
19
+ ```
20
+
21
+ Or install it yourself as:
22
+
23
+ ```console
24
+ $ gem install minifyrb
25
+ ```
26
+
27
+ ## Usage
28
+
29
+ For execution from the command line, use `minifyrb` command:
30
+
31
+ ```console
32
+ $ cat path/to/example.rb
33
+ def foo
34
+ bar(arg, **options) do
35
+ baz.qux
36
+ end
37
+ end
38
+
39
+ $ minifyrb path/to/example.rb
40
+ def foo;bar(arg,**options) do baz.qux;end;end
41
+ ```
42
+
43
+ You can check the command line options with `-h` or `--help`:
44
+
45
+ ```console
46
+ $ minifyrb -h
47
+ Usage: minifyrb [options] [file1, file2, ...]
48
+ -v, --version Output the version number.
49
+ -o, --output <file> Output file (default STDOUT).
50
+ ```
51
+
52
+ ### Rake Task
53
+
54
+ You can define a Rake task for Minify. Please write the following code in your Rakefile:
55
+
56
+ ```ruby
57
+ # Rakefile
58
+ require 'minifyrb/rake_task'
59
+ Minifyrb::RakeTask.new
60
+ ```
61
+
62
+ The task `rake minifyrb` will be defined:
63
+
64
+ ```console
65
+ $ bundle exec rake -T
66
+ rake minifyrb # Minify Ruby files in the current directory and subdirectories
67
+ ```
68
+
69
+ ### Ruby API
70
+
71
+ From Ruby code, use `Minifyrb::Minifier#minify` API:
72
+
73
+ ```ruby
74
+ require 'minifyrb'
75
+
76
+ source = <<~'RUBY'
77
+ def say(name)
78
+ puts "Hello, #{name}!"
79
+ end
80
+ RUBY
81
+
82
+ Minifyrb::Minifier.new(source).minify # => "def say(name)puts\"Hello, \#{name}!\";end\n"
83
+ ```
84
+
85
+ ## Development
86
+
87
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
88
+
89
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
90
+
91
+ ## Contributing
92
+
93
+ Bug reports and pull requests are welcome on GitHub at https://github.com/koic/minifyrb.
94
+
95
+ ## License
96
+
97
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+ require 'rubocop/rake_task'
6
+ require 'minifyrb/rake_task'
7
+
8
+ RSpec::Core::RakeTask.new(:spec)
9
+ RuboCop::RakeTask.new
10
+ Minifyrb::RakeTask.new
11
+
12
+ task default: %i(rubocop spec)
data/bin/console ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'minifyrb'
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require 'irb'
15
+ IRB.start(__FILE__)
data/bin/lex ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'prism'
5
+
6
+ unless (source = ARGV[0])
7
+ warn 'usage: bin/lex source'
8
+ exit(1)
9
+ end
10
+
11
+ p Prism.lex(source).value.map(&:first).map(&:type)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/exe/minifyrb ADDED
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH.unshift("#{__dir__}/../lib")
5
+
6
+ require 'optparse'
7
+ require 'minifyrb'
8
+
9
+ params = {}
10
+
11
+ OptionParser.new do |opt|
12
+ opt.banner = 'Usage: minifyrb [options] [file1, file2, ...]'
13
+
14
+ opt.on('-v', '--version', 'Output the version number.') do
15
+ params[:version] = true
16
+ end
17
+
18
+ opt.on('-o', '--output <file>', 'Output file (default STDOUT).') do |filepath|
19
+ params[:output] = filepath
20
+ end
21
+
22
+ opt.parse!
23
+ rescue OptionParser::InvalidOption, OptionParser::MissingArgument
24
+ puts opt.help
25
+ exit 1
26
+ end
27
+
28
+ if params[:version]
29
+ puts Minifyrb::VERSION
30
+ exit
31
+ end
32
+
33
+ filepaths = ARGV
34
+
35
+ minified_rubies = if filepaths.empty?
36
+ Minifyrb::Minifier.new($stdin.read).minify
37
+ else
38
+ filepaths.map { |filepath|
39
+ Minifyrb::Minifier.new(File.read(filepath), filepath:).minify
40
+ }.join
41
+ end
42
+
43
+ if (filepath = params[:output])
44
+ File.write(filepath, minified_rubies)
45
+ else
46
+ puts minified_rubies
47
+ end
@@ -0,0 +1,193 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'prism'
4
+
5
+ module Minifyrb
6
+ class Minifier
7
+ AFTER_SPACE_REQUIRED_KEYWORDS = %i(
8
+ KEYWORD_ALIAS KEYWORD_AND KEYWORD_BEGIN KEYWORD_BREAK KEYWORD_CASE KEYWORD_CLASS KEYWORD_DEF KEYWORD_DO KEYWORD_ELSE
9
+ KEYWORD_ELSIF KEYWORD_ENSURE KEYWORD_FOR KEYWORD_IF KEYWORD_IF_MODIFIER KEYWORD_IN KEYWORD_MODULE KEYWORD_NEXT
10
+ KEYWORD_NOT KEYWORD_OR KEYWORD_REDO KEYWORD_RESCUE KEYWORD_RESCUE_MODIFIER KEYWORD_RETURN KEYWORD_SUPER KEYWORD_THEN
11
+ KEYWORD_UNDEF KEYWORD_UNLESS KEYWORD_UNLESS_MODIFIER KEYWORD_UNTIL KEYWORD_UNTIL_MODIFIER KEYWORD_WHEN KEYWORD_WHILE
12
+ KEYWORD_WHILE_MODIFIER KEYWORD_YIELD
13
+ )
14
+ BEFORE_SPACE_REQUIRED_KEYWORDS = %i(
15
+ KEYWORD_AND KEYWORD_DO KEYWORD_IF_MODIFIER KEYWORD_IN KEYWORD_OR KEYWORD_RESCUE_MODIFIER KEYWORD_THEN
16
+ KEYWORD_UNLESS_MODIFIER KEYWORD_UNTIL_MODIFIER KEYWORD_WHILE_MODIFIER
17
+ )
18
+ NUMERIC_LITERAL_TYPES = %i(FLOAT FLOAT_RATIONAL INTEGER INTEGER_RATIONAL)
19
+ PERCENT_ARRAY_LITERAL_TYPES = %i(PERCENT_LOWER_W PERCENT_UPPER_W PERCENT_LOWER_I PERCENT_UPPER_I)
20
+ NO_DELIMITER_VALUE_TYPES = %i(CONSTANT IDENTIFIER) + NUMERIC_LITERAL_TYPES
21
+ REQUIRE_SPACE_AFTER_IDENTIFIER_TYPES = %i(KEYWORD_SELF KEYWORD_TRUE KEYWORD_FALSE KEYWORD_NIL METHOD_NAME) + NUMERIC_LITERAL_TYPES
22
+ CLOSING_DELIMITER_TYPES = %i(PARENTHESIS_RIGHT BRACKET_RIGHT BRACE_RIGHT)
23
+
24
+ def initialize(source, filepath: nil)
25
+ result = Prism.lex(source)
26
+ raise SyntaxError, filepath || 'compile error' unless result.errors.empty?
27
+
28
+ @tokens = result.value
29
+
30
+ @in_heredoc = false
31
+ @string_quote = nil
32
+ @minified_values = []
33
+ @heredoc_content_tokens = []
34
+ end
35
+
36
+ def minify
37
+ squiggly_heredoc = false
38
+ prev_token = nil
39
+
40
+ @tokens.each_cons(2) do |(token, _lex_state), (next_token, _next_lex_state)|
41
+ case token.type
42
+ when :COMMENT
43
+ if prev_token && prev_token.location.start_line < next_token.location.start_line && prev_token.type == :IDENTIFIER && next_token.type == :IDENTIFIER
44
+ append_token_value_to_minified_values(';')
45
+ elsif prev_token && prev_token.location.start_line == token.location.start_line && token.location.start_line < next_token.location.start_line || next_token.type == :EOF
46
+ append_token_value_to_minified_values("\n")
47
+ end
48
+ when :IDENTIFIER
49
+ append_token_to_minified_values(token)
50
+
51
+ if REQUIRE_SPACE_AFTER_IDENTIFIER_TYPES.include?(next_token.type)
52
+ append_token_value_to_minified_values(' ')
53
+ end
54
+ when :IGNORED_NEWLINE, :EMBDOC_BEGIN, :EMBDOC_LINE, :EMBDOC_END
55
+ # noop
56
+ when :NEWLINE
57
+ token_value = if next_token.type == :EOF
58
+ token.value
59
+ elsif CLOSING_DELIMITER_TYPES.include?(next_token.type)
60
+ # NOTE: This noop is required due to https://github.com/ruby/prism/issues/2967.
61
+ else
62
+ ';'
63
+ end
64
+
65
+ append_token_value_to_minified_values(token_value)
66
+ when :KEYWORD_END
67
+ if NO_DELIMITER_VALUE_TYPES.include?(prev_token.type) && prev_token.location.start_line == token.location.start_line
68
+ append_token_value_to_minified_values(' ')
69
+ end
70
+ append_token_to_minified_values(token)
71
+ when :HEREDOC_START
72
+ @in_heredoc = true
73
+ squiggly_heredoc = token.value.start_with?('<<~')
74
+ @string_quote = if token.value.end_with?("'")
75
+ "'"
76
+ elsif token.value.end_with?('`')
77
+ '`'
78
+ else
79
+ '"'
80
+ end
81
+
82
+ @minified_values << (@string_quote == '`' ? '`' : '"')
83
+ when :HEREDOC_END
84
+ heredoc_contents = @heredoc_content_tokens.join
85
+
86
+ if squiggly_heredoc
87
+ lines = heredoc_contents.lines
88
+
89
+ minimum_indentation_length = lines.map { |line|
90
+ line.match(/\A(?<indentation_spaces> *)/)[:indentation_spaces].length
91
+ }.min
92
+
93
+ indentation = ' ' * minimum_indentation_length
94
+
95
+ heredoc_contents = lines.map { |line| line.delete_prefix(indentation) }
96
+ end
97
+
98
+ @minified_values << heredoc_contents
99
+ @minified_values << (@string_quote == '`' ? '`' : '"')
100
+
101
+ @heredoc_content_tokens.clear
102
+ @in_heredoc = false
103
+ when :QUESTION_MARK
104
+ # NOTE: Prevent syntax errors by converting `cond? ? x : y` to `cond??x:y`.
105
+ token_value = if prev_token.value.end_with?('?')
106
+ "#{token.value} "
107
+ else
108
+ # NOTE: Require both spaces to prevent syntax error of `foo==bar?x:y`.
109
+ " #{token.value} "
110
+ end
111
+
112
+ append_token_value_to_minified_values(token_value)
113
+ when :COLON
114
+ # NOTE: Prevent syntax errors by converting `cond(arg) ? x : y` to `cond(arg)?x:y`.
115
+ append_token_value_to_minified_values("#{token.value} ")
116
+ when :UCOLON_COLON
117
+ append_token_value_to_minified_values(' ') if prev_token.type == :IDENTIFIER || prev_token.type == :METHOD_NAME
118
+
119
+ append_token_to_minified_values(token)
120
+ when :BANG_TILDE
121
+ append_token_value_to_minified_values(' ') if prev_token.type == :IDENTIFIER
122
+
123
+ append_token_to_minified_values(token)
124
+ when :LABEL
125
+ append_token_value_to_minified_values(' ') if prev_token.type == :IDENTIFIER
126
+
127
+ append_token_to_minified_values(token)
128
+
129
+ append_token_value_to_minified_values(' ') if next_token.type == :SYMBOL_BEGIN
130
+ when :EQUAL, :EQUAL_EQUAL, :EQUAL_EQUAL_EQUAL, :EQUAL_GREATER
131
+ token_value = (prev_token.value.end_with?('*', '<', '=', '>', '?') ? " #{token.value}" : token.value)
132
+
133
+ append_token_value_to_minified_values(token_value)
134
+ when :STRING_BEGIN, :REGEXP_BEGIN, :PERCENT_LOWER_X, *PERCENT_ARRAY_LITERAL_TYPES
135
+ append_token_value_to_minified_values(' ') if token.value.start_with?('%')
136
+
137
+ append_token_to_minified_values(token)
138
+ when :KEYWORD_DEF
139
+ append_token_value_to_minified_values(' ') if prev_token&.type == :IDENTIFIER
140
+
141
+ append_token_to_minified_values(token)
142
+ when :WORDS_SEP
143
+ if !PERCENT_ARRAY_LITERAL_TYPES.include?(prev_token.type) && next_token.type != :STRING_END
144
+ append_token_value_to_minified_values(' ')
145
+ end
146
+ else
147
+ append_token_to_minified_values(token)
148
+ end
149
+
150
+ if padding_required?(token, next_token)
151
+ append_token_value_to_minified_values(' ')
152
+ end
153
+
154
+ prev_token = token
155
+ end
156
+
157
+ @minified_values.join
158
+ end
159
+
160
+ private
161
+
162
+ def append_token_to_minified_values(token)
163
+ if @in_heredoc
164
+ token_value = if token.type == :STRING_CONTENT
165
+ token.value.gsub!(/(?<!\\)"/, '\\\"') # Escape quotes.
166
+ if @in_heredoc && @string_quote == "'"
167
+ token.value.gsub!(/\#{/, '\\#{') # FIXME: Dirty Hack for escape of string interpolation
168
+ end
169
+ end
170
+ token_value ||= token.value
171
+
172
+ @heredoc_content_tokens << token_value
173
+ else
174
+ @minified_values << token.value
175
+ end
176
+ end
177
+
178
+ def append_token_value_to_minified_values(token_value)
179
+ if @in_heredoc
180
+ @heredoc_content_tokens << token_value
181
+ else
182
+ @minified_values << token_value
183
+ end
184
+ end
185
+
186
+ def padding_required?(token, next_token)
187
+ return true if token.type == :IDENTIFIER && (next_token.type == :IDENTIFIER || next_token.type == :CONSTANT)
188
+ return false if token.type == :SYMBOL_BEGIN || next_token.type == :PARENTHESIS_LEFT
189
+
190
+ AFTER_SPACE_REQUIRED_KEYWORDS.include?(token.type) || BEFORE_SPACE_REQUIRED_KEYWORDS.include?(next_token.type)
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rake'
4
+ require 'rake/tasklib'
5
+
6
+ # Provides a custom rake task.
7
+ #
8
+ # require 'minifyrb/rake_task'
9
+ # Minifyrb::RakeTask.new
10
+ #
11
+ module Minifyrb
12
+ class RakeTask < ::Rake::TaskLib
13
+ def initialize(name = :minifyrb, *, &)
14
+ super()
15
+
16
+ desc 'Minify Ruby files in the current directory and subdirectories' unless ::Rake.application.last_description
17
+ task(name) do
18
+ RakeFileUtils.verbose(verbose) do
19
+ run_minify_ruby(verbose)
20
+ end
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def run_minify_ruby(verbose)
27
+ require_relative 'minifier'
28
+
29
+ puts 'Running Minify Ruby...' if verbose
30
+ Dir['**/*.rb'].each { |ruby_filepath|
31
+ code = File.read(ruby_filepath)
32
+ minified_code = Minifyrb::Minifier.new(code, filepath: ruby_filepath).minify
33
+
34
+ File.write(ruby_filepath, minified_code)
35
+ }
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Minifyrb
4
+ VERSION = '0.1.0'
5
+ end
data/lib/minifyrb.rb ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'minifyrb/version'
4
+ require_relative 'minifyrb/minifier'
data/minifyrb.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/minifyrb/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'minifyrb'
7
+ spec.version = Minifyrb::VERSION
8
+ spec.authors = ['Koichi ITO']
9
+ spec.email = ['koic.ito@gmail.com']
10
+
11
+ spec.summary = 'A minifier of Ruby files.'
12
+ spec.description = 'A minifier of Ruby files.'
13
+ spec.homepage = 'http://github.com/koic/minifyrb'
14
+ spec.license = 'MIT'
15
+ spec.required_ruby_version = Gem::Requirement.new('>= 3.3.0')
16
+
17
+ spec.metadata['homepage_uri'] = spec.homepage
18
+ spec.metadata['source_code_uri'] = 'http://github.com/koic/minifyrb'
19
+ spec.metadata['changelog_uri'] = 'http://github.com/koic/minifyrb/CHANGELOG.md'
20
+ spec.metadata['rubygems_mfa_required'] = 'true'
21
+
22
+ # Specify which files should be added to the gem when it is released.
23
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
24
+ spec.files = Dir.chdir(File.expand_path(__dir__)) {
25
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
26
+ }
27
+ spec.bindir = 'exe'
28
+ spec.executables = spec.files.grep(%r|\Aexe/|) { |f| File.basename(f) }
29
+ spec.require_paths = ['lib']
30
+
31
+ spec.add_dependency 'prism'
32
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: minifyrb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Koichi ITO
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 2024-08-24 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: prism
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ description: A minifier of Ruby files.
27
+ email:
28
+ - koic.ito@gmail.com
29
+ executables:
30
+ - minifyrb
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - ".github/ISSUE_TEMPLATE/bug_report.md"
35
+ - ".github/workflows/test.yml"
36
+ - ".gitignore"
37
+ - ".rspec"
38
+ - ".rubocop.yml"
39
+ - CHANGELOG.md
40
+ - Gemfile
41
+ - LICENSE.txt
42
+ - README.md
43
+ - Rakefile
44
+ - bin/console
45
+ - bin/lex
46
+ - bin/setup
47
+ - exe/minifyrb
48
+ - lib/minifyrb.rb
49
+ - lib/minifyrb/minifier.rb
50
+ - lib/minifyrb/rake_task.rb
51
+ - lib/minifyrb/version.rb
52
+ - minifyrb.gemspec
53
+ homepage: http://github.com/koic/minifyrb
54
+ licenses:
55
+ - MIT
56
+ metadata:
57
+ homepage_uri: http://github.com/koic/minifyrb
58
+ source_code_uri: http://github.com/koic/minifyrb
59
+ changelog_uri: http://github.com/koic/minifyrb/CHANGELOG.md
60
+ rubygems_mfa_required: 'true'
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 3.3.0
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ requirements: []
75
+ rubygems_version: 3.6.0.dev
76
+ specification_version: 4
77
+ summary: A minifier of Ruby files.
78
+ test_files: []