diff --git a/.github/workflows/ruby.yml b/.github/workflows/ruby.yml index f1e2870..1837863 100644 --- a/.github/workflows/ruby.yml +++ b/.github/workflows/ruby.yml @@ -7,7 +7,7 @@ # # Created: 14th August 2026 -# Updated: 15th August 2026 +# Updated: 19th August 2026 # name: Ruby @@ -70,13 +70,20 @@ jobs: uses: actions/checkout@v7 - name: Remove Gemfile.lock + shell: bash run: rm -f Gemfile.lock - name: Set up Ruby v${{ matrix.ruby-version }} uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby-version }} - bundler-cache: true # runs 'bundle install' and caches installed gems automatically + # Bundler 4 honours Gemfile `lockfile false`, so no Gemfile.lock is + # written. bundler-cache cats that file after `bundle lock` and + # fails on Windows 3.2+ (setup-ruby installs Bundler ~> 4). + bundler-cache: false + + - name: Install gems + run: bundle install - name: Show Ruby version run: ruby -v @@ -102,13 +109,17 @@ jobs: uses: actions/checkout@v7 - name: Remove Gemfile.lock + shell: bash run: rm -f Gemfile.lock - name: Set up Ruby uses: ruby/setup-ruby@v1 with: - ruby-version: '3.3' - bundler-cache: true + ruby-version: '3.4' + bundler-cache: false + + - name: Install gems + run: bundle install - name: Show Ruby version run: ruby -v diff --git a/.gitignore b/.gitignore index 0d510c3..ce639ca 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,13 @@ # directories (by name) -/.bzr/ /.bundle/ +/.bzr/ /.config/ /.svn/ +/.vscode/ /.yardoc/ +/_build/ /_yardoc/ /InstalledFiles/ @@ -23,8 +25,10 @@ /tmp/ /vendor/bundle/ + # directories (by pattern) + # files (by name) .DS_Store @@ -32,8 +36,11 @@ .ruby-version .rvmrc +Gemfile.lock + /spec/examples.txt + # files (by pattern) *~ diff --git a/CHANGES.md b/CHANGES.md index ddd2a1a..b4ea3d0 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,16 @@ # recls-helpers.Ruby - Changes +## 0.0.1 - 19th August 2026 + +* **recls-helpers-ruby.gemspec**: `required_ruby_version` is the range `>= 2.0`; **Gemfile.lock** and **.ruby-version** excluded from `spec.files`; `spec.summary` matches the README tagline; packaged **AUTHORS**, **CHANGES**, **CONTRIBUTING**, **EXAMPLES**, **FAQ**, **INSTALL**, **NEWS**, **SECURITY**, **TODO**; +* **Gemfile** sets `lockfile false` when Bundler supports it; stop tracking **Gemfile.lock**; +* CI uses `bundler-cache: false` and explicit `bundle install`; **Warnings** job on Ruby **3.4**; +* updated **run_all_unit_tests.sh** (from https://github.com/synesissoftware/misc-dev-scripts) to skip **tput** when **$TERM** is unset or stdout is not a TTY; +* **README.md**: drop extra GitHub-release badge; nested **Dependencies** (Efferent / Afferent); +* library source **Home:** URLs now use `https`; + + ## 0.0.0 - 16th August 2026 * added `# frozen_string_literal: true` to all **lib/** sources; diff --git a/Gemfile b/Gemfile index 29f6d2e..79965e8 100644 --- a/Gemfile +++ b/Gemfile @@ -2,6 +2,13 @@ source "https://rubygems.org" +# Suppress lockfile on Bundler 4+ (gem: do not pin the graph). No-op on +# Bundler that lacks the DSL (Ruby 2.x CI). Do not combine with +# ruby/setup-ruby `bundler-cache: true` — that action cats Gemfile.lock +# after `bundle lock` and fails when no file is written (Windows 3.2+, +# where setup-ruby installs Bundler ~> 4). +lockfile false if respond_to?(:lockfile) + gemspec # rake 13 requires Ruby >= 2.3 diff --git a/Gemfile.lock b/Gemfile.lock index 8baee4d..0847f09 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,22 +1,27 @@ PATH remote: . specs: - recls-helpers-ruby (0.0.0) + recls-helpers-ruby (0.0.1) recls-ruby (~> 2.13) GEM remote: https://rubygems.org/ specs: - recls-ruby (2.13.2) - xqsr3 (0.39.5) + power_assert (3.1.0) + rake (13.4.2) + recls-ruby (2.13.4) + test-unit (3.7.8) + power_assert + xqsr3 (0.39.8) PLATFORMS - arm64-darwin-25 - ruby + x86_64-darwin-20 DEPENDENCIES + rake (~> 13.0) recls-helpers-ruby! - xqsr3 (~> 0.39) + test-unit (~> 3.0) + xqsr3 (>= 0.39.5, < 1.0) BUNDLED WITH - 2.6.9 + 2.2.16 diff --git a/NEWS.md b/NEWS.md index ff6ca18..9426404 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,8 +1,9 @@ # recls-helpers.Ruby - News -| Date | News Item | -| ---------------- | ------------------------------------------------------------------------------------------------- | -| 16th August 2026 | [recls-helpers.Ruby 0.0.0 released](https://github.com/synesissoftware/recls-helpers.Ruby/releases/tag/0.0.0) | +| Date | News Item | +| ---------------- | -------------------------------------------------------------------------------------------------------- | +| 19th August 2026 | [**recls-helpers.Ruby** 0.0.1](https://github.com/synesissoftware/recls-helpers.Ruby/releases/tag/0.0.1) | +| 16th August 2026 | [**recls-helpers.Ruby** 0.0.0](https://github.com/synesissoftware/recls-helpers.Ruby/releases/tag/0.0.0) | diff --git a/README.md b/README.md index f428b82..18ed44f 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ Helper types and functions for working with **recls.Ruby** ![Language](https://img.shields.io/badge/Ruby-CC342D?style=flat&logo=ruby&logoColor=white) [![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) [![Gem Version](https://badge.fury.io/rb/recls-helpers-ruby.svg)](https://badge.fury.io/rb/recls-helpers-ruby) -[![GitHub release](https://img.shields.io/github/v/release/synesissoftware/recls-helpers.Ruby.svg)](https://github.com/synesissoftware/recls-helpers.Ruby/releases/latest) [![Last Commit](https://img.shields.io/github/last-commit/synesissoftware/recls-helpers.Ruby)](https://github.com/synesissoftware/recls-helpers.Ruby/commits/master) [![Ruby](https://github.com/synesissoftware/recls-helpers.Ruby/actions/workflows/ruby.yml/badge.svg)](https://github.com/synesissoftware/recls-helpers.Ruby/actions/workflows/ruby.yml) @@ -20,6 +19,12 @@ Helper types and functions for working with **recls.Ruby** - [Where to get help](#where-to-get-help) - [Contribution guidelines](#contribution-guidelines) - [Dependencies](#dependencies) + - [Efferent (fan-out)](#efferent-fan-out) + - [Runtime Dependencies (aka "Normal Dependencies")](#runtime-dependencies-aka-normal-dependencies) + - [Development Dependencies](#development-dependencies) + - [Afferent (fan-in)](#afferent-fan-in) + - [Runtime dependents](#runtime-dependents) + - [Development dependents](#development-dependents) - [Related projects](#related-projects) - [License](#license) @@ -59,7 +64,7 @@ require 'recls/helpers' ## Examples -Examples are provided in the `examples` directory, along with a markdown description for each. A detailed list TOC of them is provided in [EXAMPLES.md](./EXAMPLES.md). +Examples are provided in the ```examples``` directory, along with a markdown description for each. A detailed list TOC of them is provided in [EXAMPLES.md](./EXAMPLES.md). ## Project Information @@ -77,24 +82,47 @@ Defect reports, feature requests, and pull requests are welcome on https://githu ### Dependencies -This library has **efferent** (fan-out) dependencies on: -* [**recls.Ruby**](https://github.com/synesissoftware/recls.Ruby) (`recls-ruby`); +#### Efferent (fan-out) -and, for development/tests: +Libraries upon which **recls-helpers.Ruby** depends: -* [**xqsr3**](https://github.com/synesissoftware/xqsr3/). -It has no known **afferent** (fan-in) dependencies yet. +##### Runtime Dependencies (aka "Normal Dependencies") + +* [**recls.Ruby**](https://github.com/synesissoftware/recls.Ruby); + + +##### Development Dependencies + +* [**rake**](https://rubygems.org/gems/rake); +* [**test-unit**](https://rubygems.org/gems/test-unit); +* [**xqsr3**](https://github.com/synesissoftware/xqsr3); + + +#### Afferent (fan-in) + +Projects that depend on **recls-helpers.Ruby**: + + +##### Runtime dependents + +* \; + + +##### Development dependents + +* \; ### Related projects -* [**recls.Ruby**](https://github.com/synesissoftware/recls.Ruby); -* [**recls**](https://github.com/synesissoftware/recls) (**C** / **C++**); -* [**recls.Go**](https://github.com/synesissoftware/recls.Go); -* [**recls.NET**](https://github.com/synesissoftware/recls.NET); -* [**recls.Rust**](https://github.com/synesissoftware/recls.Rust); +* [**recls**](https://github.com/synesissoftware/recls/); +* [**recls.Go**](https://github.com/synesissoftware/recls.Go/); +* [**recls.NET**](https://github.com/synesissoftware/recls.NET/); +* [**recls.Python**](https://github.com/synesissoftware/recls.Python/); +* [**recls.Ruby**](https://github.com/synesissoftware/recls.Ruby/); +* [**recls.Rust**](https://github.com/synesissoftware/recls.Rust/); ### License diff --git a/TODO.md b/TODO.md index 60d9010..6dcf86b 100644 --- a/TODO.md +++ b/TODO.md @@ -1,12 +1,6 @@ # recls-helpers.Ruby - TODO -## Table of Contents - -- [Functional improvements](#functional-improvements) -- [Packaging improvements](#packaging-improvements) - - ## Functional improvements * [ ] Ignore / exclude filtering (`strip_excludes` / `reject_ignored`, String + Regexp); @@ -16,10 +10,20 @@ * [ ] Stock Synesis ignore / pattern presets (optional); +## Performance improvements + +* \ + + ## Packaging improvements * [ ] Examples for first shipped helpers; -* [ ] Publish gem and GitHub release for **0.0.0**; +* [ ] Publish gem and GitHub release for **0.0.1**; +* [x] ~~~updated **run_all_unit_tests.sh** (from **misc-dev-scripts**) to skip `tput` when `$TERM` is unset or stdout is not a TTY~~~; +* [x] ~~~**Gemfile** `lockfile false`; stop tracking **Gemfile.lock**; CI `bundler-cache: false`~~~; +* [x] ~~~gemspec polish: README tagline as `spec.summary`, drop `< 4` upper bound, package docs, exclude **Gemfile.lock** / **.ruby-version**~~~; +* [x] ~~~README canonical structure (tagline before badges; **Dependencies**; CI badge → **ruby.yml**)~~~; +* [x] ~~~after the packaging/boilerplate/CI baseline: bump **VERSION** and align **CHANGES**/**NEWS**~~~; diff --git a/lib/recls/helpers.rb b/lib/recls/helpers.rb index b4b9abf..0e09f21 100644 --- a/lib/recls/helpers.rb +++ b/lib/recls/helpers.rb @@ -5,9 +5,9 @@ # Purpose: Top-level include for recls-helpers.Ruby library # # Created: 14th August 2026 -# Updated: 15th August 2026 +# Updated: 19th August 2026 # -# Home: http://github.com/synesissoftware/recls-helpers.Ruby +# Home: https://github.com/synesissoftware/recls-helpers.Ruby # # Author: Matthew Wilson # diff --git a/lib/recls/helpers/version.rb b/lib/recls/helpers/version.rb index 5d71235..c682ee2 100644 --- a/lib/recls/helpers/version.rb +++ b/lib/recls/helpers/version.rb @@ -5,9 +5,9 @@ # Purpose: Version for recls-helpers.Ruby library # # Created: 14th August 2026 -# Updated: 15th August 2026 +# Updated: 19th August 2026 # -# Home: http://github.com/synesissoftware/recls-helpers.Ruby +# Home: https://github.com/synesissoftware/recls-helpers.Ruby # # Author: Matthew Wilson # @@ -51,7 +51,7 @@ module Recls module Helpers # Current version of the recls-helpers.Ruby library - VERSION = '0.0.0' + VERSION = '0.0.1' private # @!visibility private diff --git a/recls-helpers-ruby.gemspec b/recls-helpers-ruby.gemspec index 26728e3..39ef82c 100644 --- a/recls-helpers-ruby.gemspec +++ b/recls-helpers-ruby.gemspec @@ -1,12 +1,12 @@ -# ######################################################################### # +# ######################################################################## # # File: recls-helpers-ruby.gemspec # # Purpose: Gemspec for recls-helpers.Ruby library # # Created: 14th August 2026 -# Updated: 15th August 2026 +# Updated: 19th August 2026 # -# ######################################################################### # +# ######################################################################## # $:.unshift File.join(File.dirname(__FILE__), 'lib') @@ -17,8 +17,8 @@ require 'recls/helpers/version' Gem::Specification.new do |spec| spec.name = 'recls-helpers-ruby' + spec.summary = 'Helper types and functions for working with recls.Ruby' spec.version = Recls::Helpers::VERSION - spec.summary = 'recls-helpers.Ruby' spec.description = <= 2.0', '< 4' ] + spec.required_ruby_version = [ '>= 2.0' ] + + spec.add_runtime_dependency "recls-ruby", [ '~> 2.13' ] + + spec.add_development_dependency "xqsr3", [ '>= 0.39.5', '< 1.0' ] spec.metadata = { 'bug_tracker_uri' => 'https://github.com/synesissoftware/recls-helpers.Ruby/issues', @@ -42,11 +46,25 @@ END_DESC 'source_code_uri' => 'https://github.com/synesissoftware/recls-helpers.Ruby', } - spec.add_runtime_dependency "recls-ruby", [ '~> 2.13' ] - - spec.add_development_dependency "xqsr3", [ '>= 0.39.5', '< 1.0' ] - - spec.files = Dir[ 'Rakefile', '{bin,examples,lib,man,spec,test}/**/*', 'README*', 'LICENSE*' ] & `git ls-files -z`.split("\0") + spec.files = Dir[ + 'Rakefile', + '{bin,examples,lib,man,spec,test}/**/*', + 'AUTHORS*', + 'CHANGES*', + 'CONTRIBUTING*', + 'EXAMPLES*', + 'FAQ*', + 'INSTALL*', + 'LICENSE*', + 'NEWS*', + 'README*', + 'SECURITY*', + 'TODO*', + ] & `git ls-files -z`.split("\0") + spec.files -= [ + '.ruby-version', + 'Gemfile.lock', + ] end diff --git a/run_all_unit_tests.sh b/run_all_unit_tests.sh index 6aea55b..0a05634 100755 --- a/run_all_unit_tests.sh +++ b/run_all_unit_tests.sh @@ -8,7 +8,7 @@ # executing each rbenv version # # Created: 9th June 2011 -# Updated: 12th August 2026 +# Updated: 19th August 2026 # # Copyright (c) Matthew Wilson, 2011-2026 # All rights reserved @@ -58,18 +58,20 @@ Basename="$(basename "$Source")" # colours -if command -v tput > /dev/null; then +SisClr_Blue=${FG_BLUE:-} +SisClr_Red=${FG_RED:-} +SisClr_Bold=${FD_BOLD:-} +SisClr_None=${FD_NONE:-} - SisClr_Blue=${FG_BLUE:-$(tput setaf 4)} - SisClr_Red=${FG_RED:-$(tput setaf 1)} - SisClr_Bold=${FD_BOLD:-$(tput bold)} - SisClr_None=${FD_NONE:-$(tput sgr0)} -else +if [ -n "${TERM:-}" ] && [ -t 1 ] && command -v tput >/dev/null 2>&1; then + + if tput sgr0 >/dev/null 2>&1; then - SisClr_Blue= - SisClr_Red= - SisClr_Bold= - SisClr_None= + SisClr_Blue=${FG_BLUE:-$(tput setaf 4)} + SisClr_Red=${FG_RED:-$(tput setaf 1)} + SisClr_Bold=${FD_BOLD:-$(tput bold)} + SisClr_None=${FD_NONE:-$(tput sgr0)} + fi fi @@ -115,19 +117,19 @@ if [ ! -z "$RunRbEnvAllVersions" ]; then if ! command -v rbenv > /dev/null; then - >&2 echo "$0: ${SisClr_Red}${SisClr_Bold}rbenv${SisClr_None} not detected" + >&2 echo "$0: ${SisClr_Red}${SisClr_Bold}rbenv${SisClr_None} not detected" - exit 1 + exit 1 fi exclusions=() if [ -e "$ProjectDir/.ruby-version-exclusions" ]; then - exclusion_lines=`cat "$ProjectDir/.ruby-version-exclusions"` - for line in $exclusion_lines; do + exclusion_lines=`cat "$ProjectDir/.ruby-version-exclusions"` + for line in $exclusion_lines; do - exclusions+=("$line") - done + exclusions+=("$line") + done fi echo "executing command line '${SisClr_Blue}${SisClr_Bold}$0 ${ForwardArgs[*]}${SisClr_None}' with all Ruby versions ..." @@ -138,11 +140,20 @@ if [ ! -z "$RunRbEnvAllVersions" ]; then current=$(tr -d '[:space:]' < "$ProjectDir/.ruby-version") fi + if ! version_output=$(rbenv versions --bare); then + + >&2 echo "$0: ${SisClr_Red}${SisClr_Bold}failed to enumerate Ruby versions via rbenv${SisClr_None}" + exit 1 + fi + versions=() - while IFS= read -r line; do + if [ -n "$version_output" ]; then - versions+=("$line") - done < <(rbenv versions --bare) + while IFS= read -r line; do + + versions+=("$line") + done <<< "$version_output" + fi echo "versions: ${SisClr_Blue}${SisClr_Bold}${versions[*]}${SisClr_None}; skipped versions: ${SisClr_Blue}${SisClr_Bold}${exclusions[*]}${SisClr_None}; current version: ${SisClr_Blue}${SisClr_Bold}${current:-(none)}${SisClr_None}" @@ -151,32 +162,32 @@ if [ ! -z "$RunRbEnvAllVersions" ]; then for version in "${versions[@]}" do - echo + echo - skip= + skip= - for exclusion in "${exclusions[@]}"; do + for exclusion in "${exclusions[@]}"; do - if [[ "$exclusion" == "$version" ]]; then + if [[ "$exclusion" == "$version" ]]; then - skip=1 - fi - done + skip=1 + fi + done - if [ "$skip" != "" ]; then + if [ "$skip" != "" ]; then - echo "skipping Ruby version ${SisClr_Blue}${SisClr_Bold}$version${SisClr_None}:" - else + echo "skipping Ruby version ${SisClr_Blue}${SisClr_Bold}$version${SisClr_None}:" + else - echo "processing Ruby version ${SisClr_Blue}${SisClr_Bold}$version${SisClr_None}:" + echo "processing Ruby version ${SisClr_Blue}${SisClr_Bold}$version${SisClr_None}:" - echo -e "\texecuting command line 'RBENV_VERSION=$version $0 ${ForwardArgs[*]}' with Ruby version $version ..." + echo -e "\texecuting command line 'RBENV_VERSION=$version $0 ${ForwardArgs[*]}' with Ruby version $version ..." - if ! RBENV_VERSION="$version" "$0" "${ForwardArgs[@]}"; then + if ! RBENV_VERSION="$version" "$0" "${ForwardArgs[@]}"; then - result=1 + result=1 + fi fi - fi done exit $result @@ -275,13 +286,24 @@ else result=0 + test_files=$(mktemp "${TMPDIR:-/tmp}/run_all_unit_tests.XXXXXX") || { + >&2 echo "$0: ${SisClr_Red}${SisClr_Bold}failed to create temporary file for test discovery${SisClr_None}" + exit 1 + } + trap 'rm -f "$test_files"' EXIT + + if ! find "$ProjectDir" -name 'tc_*.rb' -print0 > "$test_files"; then + >&2 echo "$0: ${SisClr_Red}${SisClr_Bold}failed to discover test files${SisClr_None}" + exit 1 + fi + while IFS= read -r -d '' testfile; do if ! ruby $DebugFlag $WarningsFlag "$testfile"; then result=1 fi - done < <(find "$ProjectDir" -name 'tc_*.rb' -print0) + done < "$test_files" exit $result fi