Skip to content

gemification #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,4 @@ build-iPhoneSimulator/

# Used by RuboCop. Remote config files pulled in from inherit_from directive.
# .rubocop-https?--*
**/*.sw*
3 changes: 3 additions & 0 deletions .rspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
--format documentation
--color
--require spec_helper
558 changes: 558 additions & 0 deletions .rspec_status

Large diffs are not rendered by default.

7 changes: 7 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
source "https://rubygems.org"

# Specify your gem's dependencies in ruby_node_semver.gemspec
gemspec

gem "rake", "~> 12.0"
gem "rspec", "~> 3.0"
34 changes: 34 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
PATH
remote: .
specs:
ruby-node-semver (0.1.0)

GEM
remote: https://rubygems.org/
specs:
diff-lcs (1.4.4)
rake (12.3.3)
rspec (3.10.0)
rspec-core (~> 3.10.0)
rspec-expectations (~> 3.10.0)
rspec-mocks (~> 3.10.0)
rspec-core (3.10.0)
rspec-support (~> 3.10.0)
rspec-expectations (3.10.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.10.0)
rspec-mocks (3.10.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.10.0)
rspec-support (3.10.0)

PLATFORMS
ruby

DEPENDENCIES
rake (~> 12.0)
rspec (~> 3.0)
ruby-node-semver!

BUNDLED WITH
2.1.4
34 changes: 30 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,27 @@
# ruby-node-semver
# RubyNodeSemver

Ruby version of [node-semver](https://github.com/isaacs/node-semver)

## Installation

Add this line to your application's Gemfile:

```ruby
gem 'ruby_node_semver'
```

And then execute:

$ bundle install

## install
Or install it yourself as:

_todo_
$ gem install ruby_node_semver

## examples

```ruby
require_relative 'node_semver.rb'
require 'node_semver'

versions = ['1.2.3', '1.2.4', '1.2.5', '1.2.6', '2.0.1']
NodeSemver.max_satisfying(versions, '~1.2.3', loose=false) == "1.2.6"
Expand All @@ -27,3 +39,17 @@ versions = ['1.2.3', '1.2.4', '1.2.5', '1.2.6-pre.1', '2.0.1']
NodeSemver.max_satisfying(versions, '~1.2.3', loose=false, include_prerelease=true) == '1.2.6-pre.1'
NodeSemver.max_satisfying(versions, '~1.2.3', loose=false, include_prerelease=false) == '1.2.5'
```

## Development

## Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/voodoologic/ruby_node_semver. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/voodoologic/ruby_node_semver/blob/master/CODE_OF_CONDUCT.md).

## License

The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).

## Code of Conduct

Everyone interacting in the RubyNodeSemver project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/voodoologic/ruby_node_semver/blob/master/CODE_OF_CONDUCT.md).
6 changes: 6 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
require "bundler/gem_tasks"
require "rspec/core/rake_task"

RSpec::Core::RakeTask.new(:spec)

task :default => :spec
14 changes: 14 additions & 0 deletions bin/console
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/env ruby

require "bundler/setup"
require "ruby_node_semver"

# You can add fixtures and/or initialization code here to make experimenting
# with your gem easier. You can also use a different console, if you like.

# (If you use this, don't forget to add pry to your Gemfile!)
# require "pry"
# Pry.start

require "irb"
IRB.start(__FILE__)
8 changes: 8 additions & 0 deletions bin/setup
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#!/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
198 changes: 128 additions & 70 deletions lib/node_semver.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
require "node_semver/version"

module NodeSemver
extend self

Expand Down Expand Up @@ -115,7 +117,7 @@ def get_regex(key)

def parse(version, loose)
r = get_regex(loose ? :loose : :full)
m = r.search(version)
m = r.match(version)
m ? make_semver(version, loose) : nil
end

Expand Down Expand Up @@ -172,7 +174,7 @@ def initialize(version, loose)
if m[3].nil?
# this is not same behaviour node's semver (see: https://github.com/podhmo/python-semver/issues/15)
@prerelease = v[m.end(0)..v.length].split('.').select{|x| !x.empty?}
if [email protected]? and NodeSemver.isnumeric?(@prerelease[0])
if [email protected]? && NodeSemver.isnumeric?(@prerelease[0])
@patch = @prerelease[0].to_i
@prerelease = @prerelease[1..prerelease.length]
end
Expand Down Expand Up @@ -444,18 +446,29 @@ def _prerelease_key(prerelease)
prerelease.map {|e| (e.instance_of? Fixnum) ? ['', e] : [e]}
end

{'loose'=>true, 'full'=>false}.each do |k, loose|
define_method(k + '_key_function') do |version|
v = make_semver(version, loose)
key = [v.major, v.minor, v.patch]
if !v.micro_versions.nil? and !v.micro_versions.empty?
key = key + v.micro_versions
end
if !v.prerelease.nil? and !v.prerelease.empty?
key = key + [0] + _prerelease_key(v.prerelease)
else
key = key + [1] # NOT having a prerelease is > having one
end
def loose_key_function(version)
v = make_semver(version, true)
key = [v.major, v.minor, v.patch]
if !v.micro_versions.nil? and !v.micro_versions.empty?
key = key + v.micro_versions
end
if !v.prerelease.nil? and !v.prerelease.empty?
key = key + [0] + _prerelease_key(v.prerelease)
else
key = key + [1] # NOT having a prerelease is > having one
end
end

def full_key_function(version)
v = make_semver(version, false)
key = [v.major, v.minor, v.patch]
if !v.micro_versions.nil? and !v.micro_versions.empty?
key = key + v.micro_versions
end
if !v.prerelease.nil? and !v.prerelease.empty?
key = key + [0] + _prerelease_key(v.prerelease)
else
key = key + [1] # NOT having a prerelease is > having one
end
end

Expand Down Expand Up @@ -856,8 +869,24 @@ def satisfies(version, range, loose=false, include_prerelease=false)
range.test(version, include_prerelease)
end

{'min'=>1, 'max'=>-1}.each do |k, direction|
define_method(k + '_satisfying') do |versions, range, loose=false, include_prerelease=false|
def max_satisfying(versions, range, loose=false, include_prerelease=false)
begin
range_obj = make_range(range, loose)
rescue ArgumentError
return nil
end

a, b = nil, nil
for v in versions do
if range_obj.test(v, include_prerelease) and (a.nil? or b.compare(v) == -1)
a = v
b = make_semver(a, loose)
end
end
a
end

def min_satisfying(versions, range, loose=false, include_prerelease=false)
begin
range_obj = make_range(range, loose)
rescue ArgumentError
Expand All @@ -866,13 +895,12 @@ def satisfies(version, range, loose=false, include_prerelease=false)

a, b = nil, nil
for v in versions do
if range_obj.test(v, include_prerelease) and (a.nil? or b.compare(v) == direction)
if range_obj.test(v, include_prerelease) and (a.nil? or b.compare(v) == 1)
a = v
b = make_semver(a, loose)
end
end
a
end
end

def valid_range(range, loose)
Expand All @@ -883,61 +911,91 @@ def valid_range(range, loose)
end
end

# Determine if version is less or greater than all the versions possible in the range
{'ltr'=>'<', 'gtr'=>'>'}.each do |method_name, operator|
define_method method_name do |version, range, loose|
version = make_semver(version, loose)
range = make_range(range, loose)

if operator == '>'
alias gtfn gt
alias ltefn lte
alias ltfn lt
comp = '>'
ecomp = '>='
elsif operator == '<'
alias gtfn lt
alias ltefn gte
alias ltfn gt
comp = '<'
ecomp = '<='
else
raise ArgumentError.new("Must provide a operator val of '<' or '>'")
end

# If it satisifes the range it is not outside
if satisfies(version, range, loose)
return false
end

# From now on, variable terms are as if we're in "gtr" mode.
# but note that everything is flipped for the "ltr" function.
for comparators in range.set do
high = nil
low = nil
for comparator in comparators do
high = (high or comparator)
low = (low or comparator)
if gtfn(comparator.semver, high.semver, loose)
high = comparator
elsif ltfn(comparator.semver, low.semver, loose)
low = comparator
end
def ltr(version, range, loose)
version = make_semver(version, loose)
range = make_range(range, loose)

alias gtfn lt
alias ltefn gte
alias ltfn gt
comp = '<'
ecomp = '<='

# If it satisifes the range it is not outside
if satisfies(version, range, loose)
return false
end

# From now on, variable terms are as if we're in "gtr" mode.
# but note that everything is flipped for the "ltr" function.
for comparators in range.set do
high = nil
low = nil
for comparator in comparators do
high = (high or comparator)
low = (low or comparator)
if gtfn(comparator.semver, high.semver, loose)
high = comparator
elsif ltfn(comparator.semver, low.semver, loose)
low = comparator
end
end

# If the edge version comparator has a operator then our version isn't outside it
if high.operator == comp or high.operator == ecomp
false
# If the lowest version comparator has an operator and our version is less than it then it isn't higher than the range
elsif (not low.operator or low.operator == comp) and ltefn(version, low.semver, loose)
false
elsif low.operator == ecomp and ltfn(version, low.semver, loose)
false
else
true
end
end

# If the edge version comparator has a operator then our version isn't outside it
if high.operator == comp or high.operator == ecomp
false
# If the lowest version comparator has an operator and our version is less than it then it isn't higher than the range
elsif (not low.operator or low.operator == comp) and ltefn(version, low.semver, loose)
false
elsif low.operator == ecomp and ltfn(version, low.semver, loose)
false
else
true
end
end

def gtr
version = make_semver(version, loose)
range = make_range(range, loose)

alias gtfn gt
alias ltefn lte
alias ltfn lt
comp = '>'
ecomp = '>='

# If it satisifes the range it is not outside
if satisfies(version, range, loose)
return false
end

# From now on, variable terms are as if we're in "gtr" mode.
# but note that everything is flipped for the "ltr" function.
for comparators in range.set do
high = nil
low = nil
for comparator in comparators do
high = (high or comparator)
low = (low or comparator)
if gtfn(comparator.semver, high.semver, loose)
high = comparator
elsif ltfn(comparator.semver, low.semver, loose)
low = comparator
end
end
end

# If the edge version comparator has a operator then our version isn't outside it
if high.operator == comp or high.operator == ecomp
false
# If the lowest version comparator has an operator and our version is less than it then it isn't higher than the range
elsif (not low.operator or low.operator == comp) and ltefn(version, low.semver, loose)
false
elsif low.operator == ecomp and ltfn(version, low.semver, loose)
false
else
true
end
end
end
3 changes: 3 additions & 0 deletions lib/node_semver/version.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module NodeSemver
VERSION = "0.1.0"
end
Loading