diff --git a/pkgs/ruby/.gitignore b/pkgs/ruby/.gitignore new file mode 100644 index 0000000..c1a6109 --- /dev/null +++ b/pkgs/ruby/.gitignore @@ -0,0 +1,43 @@ +*.gem +*.rbc + +/.byebug_history +/.config/ +/.rake_tasks~ +/InstalledFiles/ +/pkg/ +/tmp/ + +# Used by dotenv library to load environment variables. +/.env + +# RSpec configuration and generated files. +/.rspec +/coverage/ +/spec/examples.txt +/spec/reports/ +/test/tmp/ +/test/version_tmp/ + +# Documentation cache and generated files. +/.yardoc/ +/_yardoc/ +/doc/ +/rdoc/ + +# Environment normalization. +/.bundle/ +/vendor/bundle/ +/lib/bundler/man/ + +# For a library or gem, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in. +/Gemfile.lock +/.ruby-version +/.ruby-gemset + +# Unless supporting rvm < 1.11.0 or doing something fancy, ignore this. +/.rvmrc + +# Used by RuboCop. Remote config files pulled in from inherit_from directive. +/.rubocop-https?--* diff --git a/pkgs/ruby/.rubocop.yml b/pkgs/ruby/.rubocop.yml new file mode 100644 index 0000000..45600f8 --- /dev/null +++ b/pkgs/ruby/.rubocop.yml @@ -0,0 +1,66 @@ +require: + - rubocop-performance + - rubocop-rake + - rubocop-rspec + +AllCops: + TargetRubyVersion: 3.0 + DisplayCopNames: true + NewCops: enable + +Layout/AccessModifierIndentation: + EnforcedStyle: outdent + +Layout/LineLength: + Max: 80 + +Lint/AmbiguousOperatorPrecedence: + Enabled: false + +Lint/ReturnInVoidContext: + Enabled: false + +Metrics/BlockLength: + Exclude: + - '*.gemspec' + - 'Rakefile' + - 'spec/**/*_spec.rb' + +RSpec/ContextWording: + Prefixes: + - 'and' + - 'for' + - 'when' + - 'with' + - 'without' + +RSpec/FilePath: + CustomTransform: + KernAux: kernaux + +RSpec/ExampleLength: + CountAsOne: ['array', 'hash', 'heredoc'] + +Style/AndOr: + EnforcedStyle: conditionals + +Style/DoubleNegation: + Enabled: false + +Style/HashAsLastArrayItem: + Enabled: false + +Style/PerlBackrefs: + Enabled: false + +Style/TrailingCommaInArguments: + EnforcedStyleForMultiline: comma + +Style/TrailingCommaInArrayLiteral: + EnforcedStyleForMultiline: comma + +Style/TrailingCommaInHashLiteral: + EnforcedStyleForMultiline: comma + +Style/VariableInterpolation: + Enabled: false diff --git a/pkgs/ruby/.simplecov b/pkgs/ruby/.simplecov new file mode 100644 index 0000000..8c6bdb8 --- /dev/null +++ b/pkgs/ruby/.simplecov @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +if ENV['SKIP_COVERAGE'].to_s.empty? + SimpleCov.start do + minimum_coverage 95 + + add_filter '/spec/' + end +end diff --git a/pkgs/ruby/.yardopts b/pkgs/ruby/.yardopts new file mode 100644 index 0000000..505c853 --- /dev/null +++ b/pkgs/ruby/.yardopts @@ -0,0 +1,4 @@ +--markup markdown +--readme README.md +--protected +--private diff --git a/pkgs/ruby/Gemfile b/pkgs/ruby/Gemfile new file mode 100644 index 0000000..b455047 --- /dev/null +++ b/pkgs/ruby/Gemfile @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +source 'https://rubygems.org' + +# Specify your gem's dependencies in kernaux.gemspec +gemspec + +gem 'simplecov', require: false diff --git a/pkgs/ruby/README.md b/pkgs/ruby/README.md new file mode 100644 index 0000000..cd34507 --- /dev/null +++ b/pkgs/ruby/README.md @@ -0,0 +1,4 @@ +KernAux +======= + +Auxiliary library for kernel development. diff --git a/pkgs/ruby/Rakefile b/pkgs/ruby/Rakefile new file mode 100644 index 0000000..bacb118 --- /dev/null +++ b/pkgs/ruby/Rakefile @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +require 'bundler/gem_tasks' + +CLEAN << '.yardoc' +CLEAN << 'coverage' +CLEAN << 'doc' +CLEAN << 'spec/examples.txt' + +desc 'Run default checks' +task default: %i[test lint] + +desc 'Run tests' +task test: :spec + +desc 'Run code analysis tools' +task lint: :rubocop + +desc 'Fix code style (rubocop --auto-correct)' +task fix: 'rubocop:auto_correct' + +begin + require 'rspec/core/rake_task' + RSpec::Core::RakeTask.new +rescue LoadError + nil +end + +begin + require 'rubocop/rake_task' + RuboCop::RakeTask.new +rescue LoadError + nil +end + +begin + require 'yard' + YARD::Rake::YardocTask.new +rescue LoadError + nil +end + +desc 'Open development console' +task :console do + sh 'bundle', 'exec', File.expand_path(File.join('bin', 'console'), __dir__) +end diff --git a/pkgs/ruby/bin/console b/pkgs/ruby/bin/console new file mode 100755 index 0000000..bde46c0 --- /dev/null +++ b/pkgs/ruby/bin/console @@ -0,0 +1,8 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require 'bundler/setup' +require 'kernaux' +require 'pry' + +Pry.start diff --git a/pkgs/ruby/bin/setup b/pkgs/ruby/bin/setup new file mode 100755 index 0000000..5cc837a --- /dev/null +++ b/pkgs/ruby/bin/setup @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -euo pipefail +IFS=$'\n\t' +set -vx + +bundle install + +# Do any other automated setup that you need to do here diff --git a/pkgs/ruby/kernaux.gemspec b/pkgs/ruby/kernaux.gemspec new file mode 100644 index 0000000..a9e184a --- /dev/null +++ b/pkgs/ruby/kernaux.gemspec @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +require_relative 'lib/kernaux/version' + +Gem::Specification.new do |spec| + repo = 'https://github.com/tailix/libkernaux' + + spec.name = 'kernaux' + spec.version = KernAux::VERSION + spec.license = 'MIT' + spec.homepage = "#{repo}/tree/master/pkgs/ruby" + spec.platform = Gem::Platform::RUBY + spec.summary = 'Auxiliary library for kernel development' + + spec.required_ruby_version = '~> 3.0' + + spec.authors = ['Alex Kotov'] + spec.email = %w[kotovalexarian@gmail.com] + + spec.description = <<~DESCRIPTION.split("\n").map(&:strip).join ' ' + Auxiliary library for kernel development. + DESCRIPTION + + spec.metadata['homepage_uri'] = spec.homepage + spec.metadata['source_code_uri'] = spec.homepage + spec.metadata['bug_tracker_uri'] = "#{repo}/issues" + spec.metadata['rubygems_mfa_required'] = 'true' + + spec.bindir = 'exe' + spec.require_paths = ['lib'] + + spec.files = Dir.chdir File.expand_path __dir__ do + `git ls-files -z`.split("\x0").reject do |f| + f.match %r{\A(?:test|spec|features)/} + end + end + + spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename f } + + spec.add_development_dependency 'bundler', '~> 2.2' + spec.add_development_dependency 'pry', '~> 0.14' + spec.add_development_dependency 'rake', '~> 13.0' + spec.add_development_dependency 'rspec', '~> 3.10' + spec.add_development_dependency 'rubocop', '~> 1.25' + spec.add_development_dependency 'rubocop-performance', '~> 1.13' + spec.add_development_dependency 'rubocop-rake', '~> 0.6' + spec.add_development_dependency 'rubocop-rspec', '~> 2.7' + spec.add_development_dependency 'simplecov', '~> 0.21' + spec.add_development_dependency 'yard', '~> 0.9' +end diff --git a/pkgs/ruby/lib/kernaux.rb b/pkgs/ruby/lib/kernaux.rb new file mode 100644 index 0000000..05f48de --- /dev/null +++ b/pkgs/ruby/lib/kernaux.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +require_relative 'kernaux/version' + +## +# Auxiliary library for kernel development. +# +module KernAux +end diff --git a/pkgs/ruby/lib/kernaux/version.rb b/pkgs/ruby/lib/kernaux/version.rb new file mode 100644 index 0000000..2fa888f --- /dev/null +++ b/pkgs/ruby/lib/kernaux/version.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +module KernAux + # Gem version. + VERSION = '0.0.0' +end diff --git a/pkgs/ruby/spec/lib/kernaux_spec.rb b/pkgs/ruby/spec/lib/kernaux_spec.rb new file mode 100644 index 0000000..932373a --- /dev/null +++ b/pkgs/ruby/spec/lib/kernaux_spec.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe KernAux do + describe '::VERSION' do + specify do + expect(described_class::VERSION).to match(/\A\d+\.\d+\.\d+\z/) + end + end +end diff --git a/pkgs/ruby/spec/spec_helper.rb b/pkgs/ruby/spec/spec_helper.rb new file mode 100644 index 0000000..eb964ec --- /dev/null +++ b/pkgs/ruby/spec/spec_helper.rb @@ -0,0 +1,104 @@ +# frozen_string_literal: true + +# This should be on the top of the file. +require 'simplecov' + +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration + +require 'kernaux' + +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = 'spec/examples.txt' + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = 'doc' + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +end