Skip to content

Commit

Permalink
Feature/Ability to check smtpmock version from cli (#43)
Browse files Browse the repository at this point in the history
* Added ability to check smtpmock version from cli
* Updated development environment guide
* Updated gemspecs
* Updated codeclimate/circleci configs
* Updated gem development dependencies
* Updated gem version, changelog
  • Loading branch information
bestwebua committed May 17, 2022
1 parent ff89bb8 commit f9a52c8
Show file tree
Hide file tree
Showing 17 changed files with 141 additions and 43 deletions.
4 changes: 2 additions & 2 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ defaults: &defaults
- image: cimg/ruby:<< parameters.ruby-version >>

orbs:
ruby: circleci/ruby@1.4.0
ruby: circleci/ruby@1.7.1

references:
restore_bundle_cache: &restore_bundle_cache
Expand Down Expand Up @@ -122,7 +122,7 @@ jobs:
- checkout
- <<: *use_compatible_gemspec
- ruby/install-deps:
bundler-version: "2.3.9"
bundler-version: "2.3.13"
with-cache: false
path: './vendor/custom_bundle'
- <<: *system_dependencies
Expand Down
2 changes: 1 addition & 1 deletion .circleci/gemspec_compatible
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ Gem::Specification.new do |spec|

spec.add_runtime_dependency 'dry-struct', '~> 1.4'

spec.add_development_dependency 'ffaker', '~> 2.20'
spec.add_development_dependency 'ffaker', '~> 2.21'
spec.add_development_dependency 'rake', '~> 13.0', '>= 13.0.6'
spec.add_development_dependency 'rspec', '~> 3.11'
end
12 changes: 6 additions & 6 deletions .circleci/gemspec_latest
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,16 @@ Gem::Specification.new do |spec|
spec.add_runtime_dependency 'dry-struct', '~> 1.4'

spec.add_development_dependency 'bundler-audit', '~> 0.9.0.1'
spec.add_development_dependency 'fasterer', '~> 0.9.0'
spec.add_development_dependency 'ffaker', '~> 2.20'
spec.add_development_dependency 'fasterer', '~> 0.10.0'
spec.add_development_dependency 'ffaker', '~> 2.21'
spec.add_development_dependency 'net-smtp', '~> 0.3.1'
spec.add_development_dependency 'overcommit', '~> 0.58.0'
spec.add_development_dependency 'overcommit', '~> 0.59.1'
spec.add_development_dependency 'pry-byebug', '~> 3.9'
spec.add_development_dependency 'rake', '~> 13.0', '>= 13.0.6'
spec.add_development_dependency 'reek', '~> 6.1'
spec.add_development_dependency 'reek', '~> 6.1', '>= 6.1.1'
spec.add_development_dependency 'rspec', '~> 3.11'
spec.add_development_dependency 'rubocop', '~> 1.26'
spec.add_development_dependency 'rubocop', '~> 1.29', '>= 1.29.1'
spec.add_development_dependency 'rubocop-performance', '~> 1.13', '>= 1.13.3'
spec.add_development_dependency 'rubocop-rspec', '~> 2.9'
spec.add_development_dependency 'rubocop-rspec', '~> 2.10'
spec.add_development_dependency 'simplecov', '~> 0.21.2'
end
2 changes: 1 addition & 1 deletion .codeclimate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ checks:
plugins:
rubocop:
enabled: true
channel: rubocop-1-26
channel: rubocop-1-29

reek:
enabled: true
2 changes: 1 addition & 1 deletion .github/DEVELOPMENT_ENVIRONMENT_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ cd ruby-smtp-mock
Configure latest Ruby environment:

```bash
echo 'ruby-3.1.1' > .ruby-version
echo 'ruby-3.1.2' > .ruby-version
cp .circleci/gemspec_latest smtp_mock.gemspec
```

Expand Down
4 changes: 2 additions & 2 deletions .reek.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ detectors:
NestedIterators:
exclude:
- SmtpMock::CommandLineArgsBuilder#define_attribute
- SmtpMock::Cli::Resolver#resolve

TooManyStatements:
exclude:
- SmtpMock::Cli::Resolver#resolve
- SmtpMock::Server#run
- SmtpMock::ServerHelper#create_fake_servers
- SmtpMock::Cli::Resolver#install
- SmtpMock::Cli::Resolver#resolve

TooManyInstanceVariables:
exclude:
Expand Down
21 changes: 21 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,18 @@ Style/OpenStructUse:
Style/NestedFileDirname:
Enabled: true

Style/EnvHome:
Enabled: true

Style/FetchEnvVar:
Enabled: true

Style/ObjectThen:
Enabled: true

Style/RedundantInitialize:
Enabled: true

Layout/LineLength:
Max: 150

Expand Down Expand Up @@ -284,6 +296,9 @@ Lint/IncompatibleIoSelectWithFiberScheduler:
Lint/RequireRelativeSelfPath:
Enabled: true

Lint/RefinementImportMethods:
Enabled: true

Lint/UselessRuby2Keywords:
Enabled: true

Expand All @@ -296,6 +311,9 @@ Gemspec/RequireMFA:
Security/IoMethods:
Enabled: true

Security/CompoundHash:
Enabled: true

Performance/AncestorsInclude:
Enabled: true

Expand Down Expand Up @@ -400,3 +418,6 @@ RSpec/BeEq:

RSpec/BeNil:
Enabled: true

RSpec/VerifiedDoubleReference:
Enabled: false
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,19 @@
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).


## [1.1.0] - 2022-05-17

### Added

- Ability to check `smtpmock` version from cli

### Updated

- Updated gemspecs
- Updated codeclimate/circleci configs
- Updated gem development dependencies
- Updated gem version

## [1.0.1] - 2022-03-10

### Added
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ This gem includes easy system dependency manager. Run `bundle exec smtp_mock` wi
| `-i`, `--install=PATH` | Install `smtpmock` to the existing path | `bundle exec smtp_mock -i ~/existent_dir` |
| `-u`, `--uninstall` | Uninstall `smtpmock` | `bundle exec smtp_mock -u` |
| `-g`, `--upgrade` | Upgrade to latest version of `smtpmock` | `bundle exec smtp_mock -g` |
| `-v`, `--version` | Prints current version of `smtpmock` | `bundle exec smtp_mock -v` |
| `-h`, `--help` | Prints help | `bundle exec smtp_mock -h` |

### DSL
Expand Down
66 changes: 41 additions & 25 deletions lib/smtp_mock/cli/resolver.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,45 +8,61 @@ module Resolver
USE_CASE = 'Usage: smtp_mock [options], example: `bundle exec smtp_mock -s -i ~/existent_dir`'
DOWNLOAD_SCRIPT = 'https://raw.githubusercontent.com/mocktools/go-smtp-mock/master/script/download.sh'

def resolve(command_line_args) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
def resolve(command_line_args) # rubocop:disable Metrics/AbcSize
opt_parser = ::OptionParser.new do |parser|
parser.banner = SmtpMock::Cli::Resolver::USE_CASE

parser.on('-s', '--sudo', 'Run command as sudo') { self.sudo = true }
parser.on('-iPATH', '--install=PATH', 'Install smtpmock to the existing path', &install)
parser.on('-u', '--uninstall', 'Uninstall smtpmock', &uninstall)
parser.on('-g', '--upgrade', 'Upgrade to latest version of smtpmock', &upgrade)
parser.on('-v', '--version', 'Prints current smtpmock version', &version)
parser.on('-h', '--help', 'Prints help') { self.message = parser.to_s }

parser.on('-iPATH', '--install=PATH', 'Install smtpmock to the existing path') do |argument|
self.install_path = argument
return self.message = 'smtpmock is already installed' if ::File.exist?(binary_path)

install_to(install_path)
::Kernel.system("#{as_sudo}ln -s #{binary_path} #{SmtpMock::Dependency::SYMLINK}")
self.message = 'smtpmock was installed successfully'
end
self.success = true
end

parser.on('-u', '--uninstall', 'Uninstall smtpmock') do
return if not_installed? # rubocop:disable Lint/NonLocalExitFromIterator
opt_parser.parse(command_line_args) # TODO: add error handler
end

::Kernel.system("#{as_sudo}unlink #{SmtpMock::Dependency::SYMLINK}")
::Kernel.system("rm #{current_smtpmock_path}")
self.message = 'smtpmock was uninstalled successfully'
end
private

parser.on('-g', '--upgrade', 'Upgrade to latest version of smtpmock') do
return if not_installed? # rubocop:disable Lint/NonLocalExitFromIterator
def install
lambda do |argument|
self.install_path = argument
return self.message = 'smtpmock is already installed' if ::File.exist?(binary_path)

install_to(current_smtpmock_path[%r{(.+)/.+}, 1])
self.message = 'smtpmock was upgraded successfully'
end
install_to(install_path)
::Kernel.system("#{as_sudo}ln -s #{binary_path} #{SmtpMock::Dependency::SYMLINK}")
self.message = 'smtpmock was installed successfully'
end
end

parser.on('-h', '--help', 'Prints help') { self.message = parser.to_s }
def uninstall
lambda do |_|
return if not_installed?

self.success = true
::Kernel.system("#{as_sudo}unlink #{SmtpMock::Dependency::SYMLINK}")
::Kernel.system("rm #{current_smtpmock_path}")
self.message = 'smtpmock was uninstalled successfully'
end
end

opt_parser.parse(command_line_args) # TODO: add error handler
def upgrade
lambda do |_|
return if not_installed?

install_to(current_smtpmock_path[%r{(.+)/.+}, 1])
self.message = 'smtpmock was upgraded successfully'
end
end

private
def version
lambda do |_|
return if not_installed?

self.message = SmtpMock::Dependency.version
end
end

def binary_path
"#{install_path}/smtpmock"
Expand Down
4 changes: 2 additions & 2 deletions lib/smtp_mock/dependency.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,15 @@ def compose_command(command_line_args)
"#{SmtpMock::Dependency::BINARY_SHORTCUT} #{command_line_args}".strip
end

private

def version
::Kernel.public_send(
:`,
"#{SmtpMock::Dependency::BINARY_SHORTCUT} -v"
)[SmtpMock::Dependency::VERSION_REGEX_PATTERN, 1]
end

private

def minimal_version?(current_version)
!!current_version && current_version >= SmtpMock::SMTPMOCK_MIN_VERSION
end
Expand Down
2 changes: 1 addition & 1 deletion lib/smtp_mock/version.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# frozen_string_literal: true

module SmtpMock
VERSION = '1.0.1'
VERSION = '1.1.0'
end
2 changes: 1 addition & 1 deletion smtp_mock.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ Gem::Specification.new do |spec|

spec.add_runtime_dependency 'dry-struct', '~> 1.4'

spec.add_development_dependency 'ffaker', '~> 2.20'
spec.add_development_dependency 'ffaker', '~> 2.21'
spec.add_development_dependency 'net-smtp', '~> 0.3.1' if ::RUBY_VERSION >= '3.1.0'
spec.add_development_dependency 'rake', '~> 13.0', '>= 13.0.6'
spec.add_development_dependency 'rspec', '~> 3.11'
Expand Down
30 changes: 30 additions & 0 deletions spec/smtp_mock/cli_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,35 @@
end
end

context 'when version key passed' do
[%w[-v], %w[--version]].each do |keys|
let(:command_line_args) { keys }
let(:version) { random_sem_version }

context 'when smtpmock is already installed' do
it 'returns current version of smtpmock' do
expect(::SmtpMock::Dependency).to receive(:version).and_return(version)
expect { resolve }
.to change(command_instance, :message)
.from(nil).to(version)
.and change(command_instance, :success)
.from(nil).to(true)
end
end

context 'when smtpmock is not installed yet' do
it 'not returns current version of smtpmock' do
expect(::SmtpMock::Dependency).to receive(:smtpmock_path_by_symlink).and_return([])
expect { resolve }
.to change(command_instance, :message)
.from(nil).to('smtpmock not installed yet')
.and change(command_instance, :success)
.from(nil).to(true)
end
end
end
end

context 'when help key passed' do
%w[-h --help].each do |key|
let(:command_line_args) { [key] }
Expand All @@ -307,6 +336,7 @@
-i, --install=PATH Install smtpmock to the existing path
-u, --uninstall Uninstall smtpmock
-g, --upgrade Upgrade to latest version of smtpmock
-v, --version Prints current smtpmock version
-h, --help Prints help
)
end
Expand Down
2 changes: 1 addition & 1 deletion spec/smtp_mock/dependency_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@
end

describe '.version' do
subject(:version) { described_class.send(:version) }
subject(:version) { described_class.version }

before { allow(::Kernel).to receive(:`).with("#{SmtpMock::Dependency::BINARY_SHORTCUT} -v").and_return(ver) }

Expand Down
4 changes: 4 additions & 0 deletions spec/support/helpers/context_generator_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ def random_message
FFaker::Lorem.sentence
end

def random_sem_version
::Array.new(3) { rand(0..42) }.join('.')
end

private

def ffaker
Expand Down
13 changes: 13 additions & 0 deletions spec/support/helpers/context_generator_helper_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,17 @@
expect(random_signal).to be_an_instance_of(::Integer)
end
end

describe '#random_message' do
it 'returns random message' do
expect(::FFaker::Lorem).to receive(:sentence).and_call_original
expect(random_message).to be_an_instance_of(::String)
end
end

describe '#random_sem_version' do
it 'returns random semantic version' do
expect(random_sem_version).to match(/(\d+)(\.\g<1>){2}/)
end
end
end

0 comments on commit f9a52c8

Please sign in to comment.