quick_and_ruby 0.2.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +5 -0
- data/.reek.yml +7 -0
- data/.rubocop.yml +45 -0
- data/README.md +45 -22
- data/Rakefile +10 -1
- data/bin/cat.rb +4 -0
- data/bin/datetime +6 -0
- data/bin/distinguished_name +34 -0
- data/bin/jb +17 -0
- data/bin/json2yaml +20 -0
- data/{exe → bin}/proxy +2 -0
- data/bin/yaml2json +20 -0
- data/bin/yb +17 -0
- data/lib/quick_and_ruby/data/browser.rb +68 -0
- data/lib/quick_and_ruby/data/context.rb +81 -0
- data/lib/quick_and_ruby/data.rb +10 -0
- data/lib/quick_and_ruby/date/date_time_args.rb +79 -0
- data/lib/quick_and_ruby/date/date_time_cli.rb +44 -0
- data/lib/quick_and_ruby/date.rb +11 -0
- data/lib/quick_and_ruby/distinguished_name/attribute.rb +45 -0
- data/lib/quick_and_ruby/distinguished_name/openssl_format.rb +46 -0
- data/lib/quick_and_ruby/distinguished_name/rfc_format.rb +47 -0
- data/lib/quick_and_ruby/distinguished_name.rb +66 -0
- data/lib/quick_and_ruby/proxy/arg_parser.rb +2 -1
- data/lib/quick_and_ruby/string/case.rb +18 -0
- data/lib/quick_and_ruby/string.rb +5 -0
- data/lib/quick_and_ruby/version.rb +1 -1
- data/man/distinguished_name.1.ronn +26 -0
- data/quick_and_ruby.gemspec +21 -10
- data/{bin → scripts}/console +1 -0
- metadata +153 -24
- data/Gemfile.lock +0 -53
- /data/{bin → scripts}/setup +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c685bd6937aa82ca104aa4d885bb6cb150e465d61dafe2fc4c5bcd18f2a19cc5
|
4
|
+
data.tar.gz: c6e90670c6447c6261fb3c25be94d7617c0c4a4042da22cd302f5c9a9c906481
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '03189ba3378295c3358c4449d30d6c2c6075f1c292f83b6f5db7f4cedcac775e3bc6cfd0d639cb50d54fcbe56f77aa70df2eaad3fe17263286bb968f34097933'
|
7
|
+
data.tar.gz: 00b294e7bc307dbb19947dfc48dd49cdd0b803fc5c69258ddcf6d5596b2df9923fb2be3e86921b3784ccef348d78f2d5865fe13c3a3cba15c5927e42b7f8278d
|
data/.gitignore
CHANGED
data/.reek.yml
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require:
|
2
|
+
- rubocop-rake
|
3
|
+
- rubocop-rspec
|
4
|
+
|
5
|
+
AllCops:
|
6
|
+
NewCops: enable
|
7
|
+
TargetRubyVersion: 2.7
|
8
|
+
|
9
|
+
Gemspec/DevelopmentDependencies:
|
10
|
+
Enabled: false
|
11
|
+
|
12
|
+
Layout/LineLength:
|
13
|
+
Max: 100
|
14
|
+
|
15
|
+
Metrics/BlockLength:
|
16
|
+
Exclude:
|
17
|
+
- quick_and_ruby.gemspec
|
18
|
+
- spec/**/*.rb
|
19
|
+
|
20
|
+
Metrics/ClassLength:
|
21
|
+
Exclude:
|
22
|
+
- test/**/*.rb
|
23
|
+
|
24
|
+
Metrics/CyclomaticComplexity:
|
25
|
+
Max: 10
|
26
|
+
|
27
|
+
Metrics/MethodLength:
|
28
|
+
Max: 25
|
29
|
+
|
30
|
+
Style/Documentation:
|
31
|
+
Enabled: false
|
32
|
+
|
33
|
+
# Style/StringLiterals:
|
34
|
+
# Enabled: true
|
35
|
+
# EnforcedStyle: double_quotes
|
36
|
+
|
37
|
+
# Style/StringLiteralsInInterpolation:
|
38
|
+
# Enabled: true
|
39
|
+
# EnforcedStyle: double_quotes
|
40
|
+
|
41
|
+
RSpec/ExampleLength:
|
42
|
+
Max: 10
|
43
|
+
|
44
|
+
RSpec/MultipleExpectations:
|
45
|
+
Max: 2
|
data/README.md
CHANGED
@@ -1,43 +1,66 @@
|
|
1
1
|
# QuickAndRuby
|
2
2
|
|
3
|
-
|
3
|
+
Gem to group utilities in ruby.
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
## Installation
|
8
|
-
|
9
|
-
Add this line to your application's Gemfile:
|
5
|
+
## install
|
10
6
|
|
11
7
|
```ruby
|
12
|
-
gem
|
8
|
+
gem install quick_and_ruby
|
13
9
|
```
|
14
10
|
|
15
|
-
|
11
|
+
## bins
|
12
|
+
|
13
|
+
### proxy
|
14
|
+
|
15
|
+
### datetime
|
16
16
|
|
17
|
-
|
17
|
+
Used to manipulate date:
|
18
|
+
- allow to compute all increment between 2 dates.
|
19
|
+
- allow to compute a date starting form another/now.
|
18
20
|
|
19
|
-
|
21
|
+
Usage:
|
22
|
+
``` shell
|
23
|
+
datetime -o <offset> -i <incr> -f "<format>" <from>|now <to>|now
|
20
24
|
|
21
|
-
|
25
|
+
datetime -o <offset> -i <incr> -f "<format>" <from>|now
|
26
|
+
```
|
27
|
+
|
28
|
+
### yaml2json
|
22
29
|
|
23
|
-
|
30
|
+
Convert yaml formated string, file or stdin to json format.
|
24
31
|
|
25
|
-
|
32
|
+
usage:
|
26
33
|
|
27
|
-
|
34
|
+
``` shell
|
35
|
+
yaml2json file.json
|
36
|
+
# ... generates file.json
|
28
37
|
|
29
|
-
|
38
|
+
yaml2json 'msg: test'
|
39
|
+
# {
|
40
|
+
# "msg": "test"
|
41
|
+
# }
|
30
42
|
|
31
|
-
|
43
|
+
echo 'msg: test' | yaml2json
|
44
|
+
# {
|
45
|
+
# "msg": "test"
|
46
|
+
# }
|
47
|
+
```
|
32
48
|
|
33
|
-
|
49
|
+
### json2yaml
|
34
50
|
|
35
|
-
|
51
|
+
Convert json formated string, file or stdin to yaml format.
|
36
52
|
|
37
|
-
|
53
|
+
usage:
|
38
54
|
|
39
|
-
|
55
|
+
``` shell
|
56
|
+
json2yaml file.json
|
57
|
+
# ... generates file.yaml
|
40
58
|
|
41
|
-
|
59
|
+
json2yaml '{"msg": "test"}'
|
60
|
+
# ---
|
61
|
+
# msg: test
|
42
62
|
|
43
|
-
|
63
|
+
echo '{"msg": "test"}' | json2yaml
|
64
|
+
# ---
|
65
|
+
# msg: test
|
66
|
+
```
|
data/Rakefile
CHANGED
@@ -1,6 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'bundler/gem_tasks'
|
4
|
+
|
2
5
|
require 'rspec/core/rake_task'
|
3
6
|
|
4
7
|
RSpec::Core::RakeTask.new(:spec)
|
5
8
|
|
6
|
-
|
9
|
+
require 'rubocop/rake_task'
|
10
|
+
|
11
|
+
RuboCop::RakeTask.new
|
12
|
+
|
13
|
+
require 'bump/tasks'
|
14
|
+
|
15
|
+
task default: %i[spec rubocop]
|
data/bin/cat.rb
ADDED
data/bin/datetime
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'optparse'
|
5
|
+
require 'quick_and_ruby/distinguished_name'
|
6
|
+
|
7
|
+
argv = ARGV.clone
|
8
|
+
|
9
|
+
options = {}
|
10
|
+
option_parser = OptionParser.new do |opts|
|
11
|
+
executable_name = File.basename($PROGRAM_NAME)
|
12
|
+
opts.banner = "Format Distinguished Name.\n" \
|
13
|
+
"\n" \
|
14
|
+
"Usage: #{executable_name} [options] distinguished_name"
|
15
|
+
|
16
|
+
opts.on('-r', '--reverse', 'Reverse Distinguished Name') do |reverse|
|
17
|
+
options[:reverse] = reverse
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
option_parser.parse!(argv)
|
22
|
+
if argv.empty?
|
23
|
+
warn 'error: you must supply a distinguished_name'
|
24
|
+
$stderr.puts
|
25
|
+
warn option_parser.help
|
26
|
+
exit 2
|
27
|
+
else
|
28
|
+
distinguished_name = argv.clone.join(' ')
|
29
|
+
end
|
30
|
+
|
31
|
+
dn = QuickAndRuby::DistinguishedName.from_s(distinguished_name)
|
32
|
+
dn = dn.reverse if options[:reverse]
|
33
|
+
|
34
|
+
puts dn.to_s
|
data/bin/jb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'optparse'
|
5
|
+
require 'quick_and_ruby/data'
|
6
|
+
|
7
|
+
option_parser = OptionParser.new do |opts|
|
8
|
+
executable_name = File.basename($PROGRAM_NAME)
|
9
|
+
opts.banner = "Interactively browse a JSON file\n" \
|
10
|
+
"\n" \
|
11
|
+
"Usage: #{executable_name} [json_file]"
|
12
|
+
end
|
13
|
+
option_parser.parse!
|
14
|
+
|
15
|
+
json_context = QuickAndRuby::Data::Context.from_json(ARGF.read)
|
16
|
+
browser = QuickAndRuby::Data::Browser.new(json_context)
|
17
|
+
browser.main
|
data/bin/json2yaml
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'json'
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
def json2yaml(str)
|
8
|
+
YAML.dump(JSON.parse(str))
|
9
|
+
end
|
10
|
+
|
11
|
+
from = ARGV[0]
|
12
|
+
if from && File.exist?(from)
|
13
|
+
to = ARGV[1] || "#{from.chomp('.json')}.yaml"
|
14
|
+
|
15
|
+
File.write(to, json2yaml(File.read(from)))
|
16
|
+
elsif from
|
17
|
+
puts json2yaml(from)
|
18
|
+
elsif !$stdin.tty? && !$stdin.closed?
|
19
|
+
puts json2yaml($stdin.read)
|
20
|
+
end
|
data/{exe → bin}/proxy
RENAMED
data/bin/yaml2json
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'json'
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
def yaml2json(str)
|
8
|
+
JSON.pretty_generate(YAML.safe_load(str, aliases: true))
|
9
|
+
end
|
10
|
+
|
11
|
+
from = ARGV[0]
|
12
|
+
if from && File.exist?(from)
|
13
|
+
to = ARGV[1] || "#{from.chomp('.yaml').chomp('.yml')}.json"
|
14
|
+
|
15
|
+
File.write(to, yaml2json(File.read(from)))
|
16
|
+
elsif from
|
17
|
+
puts yaml2json(from)
|
18
|
+
elsif !$stdin.tty? && !$stdin.closed?
|
19
|
+
puts yaml2json($stdin.read)
|
20
|
+
end
|
data/bin/yb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'optparse'
|
5
|
+
require 'quick_and_ruby/data'
|
6
|
+
|
7
|
+
option_parser = OptionParser.new do |opts|
|
8
|
+
executable_name = File.basename($PROGRAM_NAME)
|
9
|
+
opts.banner = "Interactively browse a Yaml file\n" \
|
10
|
+
"\n" \
|
11
|
+
"Usage: #{executable_name} [yaml_file]"
|
12
|
+
end
|
13
|
+
option_parser.parse!
|
14
|
+
|
15
|
+
yaml_context = QuickAndRuby::Data::Context.from_yaml(ARGF.read)
|
16
|
+
browser = QuickAndRuby::Data::Browser.new(yaml_context)
|
17
|
+
browser.main
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'reline'
|
4
|
+
|
5
|
+
module QuickAndRuby
|
6
|
+
module Data
|
7
|
+
class Browser
|
8
|
+
attr_reader :root_context
|
9
|
+
|
10
|
+
def initialize(root_context)
|
11
|
+
@root_context = root_context
|
12
|
+
end
|
13
|
+
|
14
|
+
def main
|
15
|
+
command = nil
|
16
|
+
current_context = root_context
|
17
|
+
|
18
|
+
Reline.completion_proc = lambda { |input|
|
19
|
+
current_context.completions(input)
|
20
|
+
}
|
21
|
+
|
22
|
+
while command != 'exit'
|
23
|
+
command = Reline.readline("#{current_context.pwd}> ", true)
|
24
|
+
break if command.nil?
|
25
|
+
|
26
|
+
current_context = execute_command(command.strip, current_context)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def execute_command(command, context)
|
33
|
+
case command
|
34
|
+
when /^ls$/
|
35
|
+
puts context
|
36
|
+
when /^cd (.*$)/
|
37
|
+
new_context = context.cd(::Regexp.last_match(1))
|
38
|
+
if new_context.nil?
|
39
|
+
puts "No such key #{::Regexp.last_match(1)}"
|
40
|
+
else
|
41
|
+
context = new_context
|
42
|
+
end
|
43
|
+
when /^cat (.*)$/
|
44
|
+
item = context.cat(::Regexp.last_match(1))
|
45
|
+
if item.nil?
|
46
|
+
puts "No such item #{::Regexp.last_match(1)}"
|
47
|
+
else
|
48
|
+
puts item.inspect
|
49
|
+
end
|
50
|
+
when /^pwd$/
|
51
|
+
puts context.pwd
|
52
|
+
when /^help$/
|
53
|
+
puts 'cat <item> - print the contents of <item> in the current context'
|
54
|
+
puts 'cd <item> - change context to the context of <item>'
|
55
|
+
puts 'cd .. - change up one level'
|
56
|
+
puts 'ls - list available items in the current context'
|
57
|
+
puts 'pwd - print context path'
|
58
|
+
end
|
59
|
+
context
|
60
|
+
end
|
61
|
+
|
62
|
+
def complete_command(input, context)
|
63
|
+
require 'byebug'
|
64
|
+
byebug
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
module QuickAndRuby
|
7
|
+
module Data
|
8
|
+
class Context
|
9
|
+
attr_reader :here, :id, :parent
|
10
|
+
|
11
|
+
def initialize(here, id: nil, parent: nil)
|
12
|
+
@here = here
|
13
|
+
@id = id
|
14
|
+
@parent = parent
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_s
|
18
|
+
if here.is_a? Array
|
19
|
+
indices = []
|
20
|
+
here.each_index { |i| indices << i }
|
21
|
+
indices.join(' ')
|
22
|
+
elsif here.is_a? Hash
|
23
|
+
here.keys.join(' ')
|
24
|
+
else
|
25
|
+
here.to_s
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def pwd
|
30
|
+
pwd_parts = []
|
31
|
+
pwd_cur = self
|
32
|
+
while pwd_cur
|
33
|
+
pwd_parts.unshift pwd_cur.id if pwd_cur.id
|
34
|
+
pwd_cur = pwd_cur.parent
|
35
|
+
end
|
36
|
+
"/" + pwd_parts.join('/')
|
37
|
+
end
|
38
|
+
|
39
|
+
def cat(path)
|
40
|
+
item_at(path)
|
41
|
+
end
|
42
|
+
|
43
|
+
def cd(path)
|
44
|
+
if path == '..'
|
45
|
+
parent
|
46
|
+
else
|
47
|
+
item = item_at(path)
|
48
|
+
if item.nil?
|
49
|
+
nil
|
50
|
+
else
|
51
|
+
Context.new(item, id: path, parent: self)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def completions(input)
|
57
|
+
to_s.split(/\s+/).grep(/^#{input}/)
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def item_at(path)
|
63
|
+
if path == '..'
|
64
|
+
parent.here
|
65
|
+
elsif here.is_a? Array
|
66
|
+
here[path.to_i]
|
67
|
+
elsif here.is_a? Hash
|
68
|
+
here[path]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.from_yaml(yaml_data)
|
73
|
+
new(YAML.parse(yaml_data))
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.from_json(json_data)
|
77
|
+
new(JSON.parse(json_data))
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
require 'optparse'
|
5
|
+
|
6
|
+
require 'quick_and_ruby/version'
|
7
|
+
|
8
|
+
module QuickAndRuby
|
9
|
+
module Date
|
10
|
+
# argv parser for datetime utility
|
11
|
+
# parsing example:
|
12
|
+
# - datetime -z <zone> -i <incr> -f "<format>" <from>|now <to>|now
|
13
|
+
# - datetime -z <zone> -i <incr> -f "<format>" <from>|now
|
14
|
+
class DateTimeArgs
|
15
|
+
DEFAULT_FORMAT = '%Y-%m-%dT%H:%M:%S.%3NZ'
|
16
|
+
DEFAULT_INCR = '1d'
|
17
|
+
DEFAULT_ZONE = DateTime.now.zone
|
18
|
+
|
19
|
+
attr_reader :date_begin, :date_end, :incr, :format, :zone
|
20
|
+
|
21
|
+
def initialize(date_begin: DateTime.now, date_end: nil,
|
22
|
+
incr: DEFAULT_INCR,
|
23
|
+
format: DEFAULT_FORMAT,
|
24
|
+
zone: DEFAULT_ZONE)
|
25
|
+
@date_begin = date_begin
|
26
|
+
@date_end = date_end
|
27
|
+
@incr = incr
|
28
|
+
@format = format
|
29
|
+
@zone = zone
|
30
|
+
end
|
31
|
+
|
32
|
+
def want_range?
|
33
|
+
date_begin && date_end
|
34
|
+
end
|
35
|
+
|
36
|
+
def want_incr?
|
37
|
+
date_begin && !date_end
|
38
|
+
end
|
39
|
+
|
40
|
+
class << self
|
41
|
+
def load(argv = ARGV)
|
42
|
+
options = new
|
43
|
+
parser(options).parse!(argv.clone)
|
44
|
+
puts options
|
45
|
+
options
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def parser(options)
|
51
|
+
@parser ||= OptionParser.new do |opts|
|
52
|
+
opts.banner = 'Usage: daterange [options] time-begin time-end'
|
53
|
+
opts.on_tail('-h', '--help', 'Show this message') do
|
54
|
+
puts opts
|
55
|
+
exit
|
56
|
+
end
|
57
|
+
|
58
|
+
opts.on_tail('--version', 'Show version') do
|
59
|
+
puts ::QuickAndRuby::VERSION
|
60
|
+
exit
|
61
|
+
end
|
62
|
+
|
63
|
+
opts.on_tail('-f', '--format=FORMAT', 'FORMAT for printing date') do |format|
|
64
|
+
options.format = format
|
65
|
+
end
|
66
|
+
|
67
|
+
opts.on_tail('-i', '--incr=INCR', 'Increment by INCR') do |incr|
|
68
|
+
options.incr = incr
|
69
|
+
end
|
70
|
+
|
71
|
+
opts.on_tail('-z', '--zone=ZONE', 'Timezone ZONE') do |zone|
|
72
|
+
options.zone = zone
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'date_time_args'
|
4
|
+
|
5
|
+
module QuickAndRuby
|
6
|
+
module Date
|
7
|
+
# cli / main class for datetime utility
|
8
|
+
# usage example:
|
9
|
+
# - datetime -z <zone> -i <incr> -f "<format>" <from>|now <to>|now
|
10
|
+
# - datetime -z <zone> -i <incr> -f "<format>" <from>|now
|
11
|
+
class DateTimeCli
|
12
|
+
def initialize(argv = ARGV, args_loader = QuickAndRuby::Date::DateTimeArgs)
|
13
|
+
@argv = argv || []
|
14
|
+
@args_loader = args_loader
|
15
|
+
end
|
16
|
+
|
17
|
+
def run
|
18
|
+
run_range if args.want_range?
|
19
|
+
run_incr if args.want_incr?
|
20
|
+
end
|
21
|
+
|
22
|
+
def run_range
|
23
|
+
puts :RUN_RANGE
|
24
|
+
time_cursor = args.date_begin
|
25
|
+
while time_cursor <= args.date_end
|
26
|
+
puts time_cursor.strftime(args.format)
|
27
|
+
time_cursor.increment(**args.incr)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def run_incr
|
32
|
+
puts :RUN_INCR
|
33
|
+
end
|
34
|
+
|
35
|
+
def args
|
36
|
+
@args ||= args_loader.load(argv)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
attr_reader :argv, :args_loader
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module QuickAndRuby
|
4
|
+
class DistinguishedName
|
5
|
+
class Attribute
|
6
|
+
# DC domainComponent
|
7
|
+
# CN commonName
|
8
|
+
# OU organizationalUnitName
|
9
|
+
# O organizationName
|
10
|
+
# STREET streetAddress
|
11
|
+
# L localityName
|
12
|
+
# ST stateOrProvinceName
|
13
|
+
# C countryName
|
14
|
+
# UID userid
|
15
|
+
|
16
|
+
SPLIT_RE = /^(\w+)=((?:\\.|[^\\])+)$/.freeze
|
17
|
+
|
18
|
+
attr_reader :name, :value
|
19
|
+
|
20
|
+
def initialize(name, value)
|
21
|
+
@name = name
|
22
|
+
@value = value
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_s(escaper: nil)
|
26
|
+
escaped_value = value
|
27
|
+
escaped_value = escaper.call(escaped_value) if escaper
|
28
|
+
|
29
|
+
"#{name}=#{escaped_value}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.from_s(part, unescaper: nil)
|
33
|
+
unless (match = SPLIT_RE.match(part))
|
34
|
+
raise "Invalid DN part: '#{part}'"
|
35
|
+
end
|
36
|
+
|
37
|
+
key = match[1].strip
|
38
|
+
value = match[2].strip
|
39
|
+
unescaped_value = value
|
40
|
+
unescaped_value = unescaper.call(unescaped_value) if unescaper
|
41
|
+
new(key, unescaped_value)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'attribute'
|
4
|
+
|
5
|
+
module QuickAndRuby
|
6
|
+
class DistinguishedName
|
7
|
+
class OpensslFormat
|
8
|
+
LABEL = :openssl
|
9
|
+
SEPARATOR = '/'
|
10
|
+
SPLIT_RE = %r{(?<!\\)/}.freeze
|
11
|
+
|
12
|
+
def escape(value)
|
13
|
+
value.gsub(%r{([/\\])}, '\\\\\1')
|
14
|
+
end
|
15
|
+
|
16
|
+
def unescape(value)
|
17
|
+
value.gsub(%r{\\([/\\])}, '\1')
|
18
|
+
end
|
19
|
+
|
20
|
+
def recognize?(dn_str)
|
21
|
+
return true if !dn_str || dn_str.empty?
|
22
|
+
return true if dn_str.start_with?(SEPARATOR)
|
23
|
+
|
24
|
+
false
|
25
|
+
end
|
26
|
+
|
27
|
+
def split(dn_str)
|
28
|
+
dn_str = dn_str[1..] if dn_str.start_with?(SEPARATOR)
|
29
|
+
|
30
|
+
parts = dn_str.split(SPLIT_RE)
|
31
|
+
parts.map do |part|
|
32
|
+
part = part.strip if part
|
33
|
+
next if !part || part.empty?
|
34
|
+
|
35
|
+
Attribute.from_s(part, unescaper: method(:unescape))
|
36
|
+
end.compact
|
37
|
+
end
|
38
|
+
|
39
|
+
def join(attributes)
|
40
|
+
SEPARATOR + attributes.map do |attribute|
|
41
|
+
attribute.to_s(escaper: method(:escape))
|
42
|
+
end.join(SEPARATOR)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'attribute'
|
4
|
+
|
5
|
+
module QuickAndRuby
|
6
|
+
class DistinguishedName
|
7
|
+
class RfcFormat
|
8
|
+
LABEL = :rfc
|
9
|
+
SEPARATOR = ','
|
10
|
+
SPLIT_RE = /(?<!\\),/.freeze
|
11
|
+
|
12
|
+
UNESCAPE_ALL_RE = /\\(.)/.freeze
|
13
|
+
|
14
|
+
def escape(value)
|
15
|
+
# value.gsub(/([,\\+<>;"= ])/, '\\\1')
|
16
|
+
value.gsub(/([,\\+<>;"=])/, '\\\\\1')
|
17
|
+
end
|
18
|
+
|
19
|
+
def unescape(value)
|
20
|
+
# .gsub(UNESCAPE_ALL_RE, '\1')
|
21
|
+
value.gsub(/\\([,\\+<>;"= ])/, '\1')
|
22
|
+
end
|
23
|
+
|
24
|
+
def recognize?(dn_str)
|
25
|
+
return true if !dn_str || dn_str.empty?
|
26
|
+
|
27
|
+
true
|
28
|
+
end
|
29
|
+
|
30
|
+
def split(dn_str)
|
31
|
+
parts = dn_str.split(SPLIT_RE)
|
32
|
+
parts.map do |part|
|
33
|
+
part = part.strip if part
|
34
|
+
next if !part || part.empty?
|
35
|
+
|
36
|
+
Attribute.from_s(part, unescaper: method(:unescape))
|
37
|
+
end.compact
|
38
|
+
end
|
39
|
+
|
40
|
+
def join(attributes)
|
41
|
+
attributes.map do |attribute|
|
42
|
+
attribute.to_s(escaper: method(:escape))
|
43
|
+
end.join(SEPARATOR)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'distinguished_name/attribute'
|
4
|
+
require_relative 'distinguished_name/rfc_format'
|
5
|
+
require_relative 'distinguished_name/openssl_format'
|
6
|
+
|
7
|
+
module QuickAndRuby
|
8
|
+
class DistinguishedName
|
9
|
+
attr_reader :attributes
|
10
|
+
|
11
|
+
def initialize(attributes = [])
|
12
|
+
@attributes = attributes
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_s(format: :rfc)
|
16
|
+
formatter = get_format(format)
|
17
|
+
formatter.join(attributes)
|
18
|
+
end
|
19
|
+
|
20
|
+
def reverse
|
21
|
+
self.class.new(attributes.reverse)
|
22
|
+
end
|
23
|
+
|
24
|
+
def size
|
25
|
+
attributes.size
|
26
|
+
end
|
27
|
+
alias length size
|
28
|
+
|
29
|
+
def get_format(label = :rfc)
|
30
|
+
self.class.get_format(label)
|
31
|
+
end
|
32
|
+
|
33
|
+
class << self
|
34
|
+
def from_s(dn_str, format: nil)
|
35
|
+
return new if !dn_str || dn_str.empty?
|
36
|
+
|
37
|
+
formatter ||= get_format(format) if format
|
38
|
+
formatter ||= openssl_format if openssl_format.recognize?(dn_str)
|
39
|
+
formatter ||= rfc_format
|
40
|
+
|
41
|
+
attributes = formatter.split(dn_str)
|
42
|
+
|
43
|
+
new(attributes)
|
44
|
+
end
|
45
|
+
|
46
|
+
def rfc_format
|
47
|
+
get_format(:rfc)
|
48
|
+
end
|
49
|
+
|
50
|
+
def openssl_format
|
51
|
+
get_format(:openssl)
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_format(label = :rfc)
|
55
|
+
case label.to_sym
|
56
|
+
when :rfc
|
57
|
+
RfcFormat.new
|
58
|
+
when :openssl
|
59
|
+
OpensslFormat.new
|
60
|
+
else
|
61
|
+
raise ArgumentError, "Unsupported format #{label}"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module QuickAndRuby
|
4
|
+
module String
|
5
|
+
module Case
|
6
|
+
def snakecase
|
7
|
+
gsub(/\s+/, '_').gsub(/([a-z\d])([A-Z])/, '\1_\2').downcase
|
8
|
+
end
|
9
|
+
|
10
|
+
# def snakecase2
|
11
|
+
# return downcase if match(/\A[A-Z]+\z/)
|
12
|
+
# gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
|
13
|
+
# gsub(/([a-z])([A-Z])/, '\1_\2').
|
14
|
+
# downcase
|
15
|
+
# end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
distinguished_name(1) -- utility to manipulate DN formated string
|
2
|
+
=================================================================
|
3
|
+
|
4
|
+
## SYNOPSIS
|
5
|
+
|
6
|
+
`distinguished_name` <dn>
|
7
|
+
`distinguished_name` `-r`|`--reverse` <dn>
|
8
|
+
|
9
|
+
## DESCRIPTION
|
10
|
+
|
11
|
+
**distinguished_name** is a simple command-line tool for modifying a dn string.
|
12
|
+
|
13
|
+
## FILES
|
14
|
+
|
15
|
+
No files are used for the moment.
|
16
|
+
|
17
|
+
## OPTIONS
|
18
|
+
|
19
|
+
* `-r`, `--reverse`:
|
20
|
+
Do a reverse of each attribute in the distinguished name (dn).
|
21
|
+
|
22
|
+
## EXAMPLES
|
23
|
+
|
24
|
+
Print in reverse order the dn:
|
25
|
+
|
26
|
+
$ distinguished_name --reverse "C=CountryCode, ST=State, CN=CommonName"
|
data/quick_and_ruby.gemspec
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
lib = File.expand_path('lib', __dir__)
|
2
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
5
|
require 'quick_and_ruby/version'
|
@@ -10,20 +12,24 @@ Gem::Specification.new do |spec|
|
|
10
12
|
|
11
13
|
spec.summary = 'Quick and Ruby utilities.'
|
12
14
|
spec.description = 'Set of small and standalone utilities in Ruby.'
|
13
|
-
spec.homepage = 'https://github.com/ttych/
|
15
|
+
spec.homepage = 'https://github.com/ttych/quick_and_ruby'
|
14
16
|
spec.license = 'MIT'
|
15
17
|
|
18
|
+
spec.required_ruby_version = '> 2.7'
|
19
|
+
|
16
20
|
if spec.respond_to?(:metadata)
|
17
21
|
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
18
22
|
|
19
23
|
spec.metadata['homepage_uri'] = spec.homepage
|
20
|
-
spec.metadata['source_code_uri'] =
|
21
|
-
spec.metadata['changelog_uri'] =
|
24
|
+
spec.metadata['source_code_uri'] = spec.homepage
|
25
|
+
spec.metadata['changelog_uri'] = "#{spec.homepage}/CHANGELOG.md"
|
22
26
|
else
|
23
27
|
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
24
|
-
|
28
|
+
'public gem pushes.'
|
25
29
|
end
|
26
30
|
|
31
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
32
|
+
|
27
33
|
# Specify which files should be added to the gem when it is released.
|
28
34
|
# The `git ls-files -z` loads the files in the RubyGem
|
29
35
|
# that have been added into git.
|
@@ -32,12 +38,17 @@ Gem::Specification.new do |spec|
|
|
32
38
|
f.match(%r{^(test|spec|features)/})
|
33
39
|
end
|
34
40
|
end
|
35
|
-
spec.bindir = '
|
36
|
-
spec.executables = spec.files.grep(%r{
|
41
|
+
spec.bindir = 'bin'
|
42
|
+
spec.executables = spec.files.grep(%r{^#{spec.bindir}/}) { |f| File.basename(f) }
|
37
43
|
spec.require_paths = ['lib']
|
38
44
|
|
39
|
-
spec.add_development_dependency '
|
40
|
-
spec.add_development_dependency '
|
41
|
-
spec.add_development_dependency '
|
42
|
-
spec.add_development_dependency '
|
45
|
+
spec.add_development_dependency 'bump', '~> 0.10.0'
|
46
|
+
spec.add_development_dependency 'bundler', '~> 2.2', '>= 2.2.31'
|
47
|
+
spec.add_development_dependency 'byebug', '~> 11.1', '>= 11.1.3'
|
48
|
+
spec.add_development_dependency 'rake', '~> 13.0', '>= 13.0.6'
|
49
|
+
spec.add_development_dependency 'reek', '~> 6.0', '>= 6.0.6'
|
50
|
+
spec.add_development_dependency 'rspec', '~> 3.10'
|
51
|
+
spec.add_development_dependency 'rubocop', '~> 1.22', '>= 1.22.3'
|
52
|
+
spec.add_development_dependency 'rubocop-rake', '~> 0.6.0'
|
53
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 2.6'
|
43
54
|
end
|
data/{bin → scripts}/console
RENAMED
metadata
CHANGED
@@ -1,122 +1,251 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quick_and_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ttych
|
8
|
-
autorequire:
|
9
|
-
bindir:
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-12-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bump
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.10.0
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.10.0
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - "~>"
|
18
32
|
- !ruby/object:Gem::Version
|
19
|
-
version: '2.
|
33
|
+
version: '2.2'
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 2.2.31
|
37
|
+
type: :development
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - "~>"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '2.2'
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 2.2.31
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: byebug
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '11.1'
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: 11.1.3
|
20
57
|
type: :development
|
21
58
|
prerelease: false
|
22
59
|
version_requirements: !ruby/object:Gem::Requirement
|
23
60
|
requirements:
|
24
61
|
- - "~>"
|
25
62
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
63
|
+
version: '11.1'
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 11.1.3
|
27
67
|
- !ruby/object:Gem::Dependency
|
28
68
|
name: rake
|
29
69
|
requirement: !ruby/object:Gem::Requirement
|
30
70
|
requirements:
|
31
71
|
- - "~>"
|
32
72
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
73
|
+
version: '13.0'
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 13.0.6
|
34
77
|
type: :development
|
35
78
|
prerelease: false
|
36
79
|
version_requirements: !ruby/object:Gem::Requirement
|
37
80
|
requirements:
|
38
81
|
- - "~>"
|
39
82
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
83
|
+
version: '13.0'
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: 13.0.6
|
87
|
+
- !ruby/object:Gem::Dependency
|
88
|
+
name: reek
|
89
|
+
requirement: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - "~>"
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '6.0'
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 6.0.6
|
97
|
+
type: :development
|
98
|
+
prerelease: false
|
99
|
+
version_requirements: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '6.0'
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: 6.0.6
|
41
107
|
- !ruby/object:Gem::Dependency
|
42
108
|
name: rspec
|
43
109
|
requirement: !ruby/object:Gem::Requirement
|
44
110
|
requirements:
|
45
111
|
- - "~>"
|
46
112
|
- !ruby/object:Gem::Version
|
47
|
-
version: '3.
|
113
|
+
version: '3.10'
|
48
114
|
type: :development
|
49
115
|
prerelease: false
|
50
116
|
version_requirements: !ruby/object:Gem::Requirement
|
51
117
|
requirements:
|
52
118
|
- - "~>"
|
53
119
|
- !ruby/object:Gem::Version
|
54
|
-
version: '3.
|
120
|
+
version: '3.10'
|
55
121
|
- !ruby/object:Gem::Dependency
|
56
122
|
name: rubocop
|
57
123
|
requirement: !ruby/object:Gem::Requirement
|
58
124
|
requirements:
|
59
125
|
- - "~>"
|
60
126
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
127
|
+
version: '1.22'
|
128
|
+
- - ">="
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: 1.22.3
|
62
131
|
type: :development
|
63
132
|
prerelease: false
|
64
133
|
version_requirements: !ruby/object:Gem::Requirement
|
65
134
|
requirements:
|
66
135
|
- - "~>"
|
67
136
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
137
|
+
version: '1.22'
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: 1.22.3
|
141
|
+
- !ruby/object:Gem::Dependency
|
142
|
+
name: rubocop-rake
|
143
|
+
requirement: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - "~>"
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: 0.6.0
|
148
|
+
type: :development
|
149
|
+
prerelease: false
|
150
|
+
version_requirements: !ruby/object:Gem::Requirement
|
151
|
+
requirements:
|
152
|
+
- - "~>"
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: 0.6.0
|
155
|
+
- !ruby/object:Gem::Dependency
|
156
|
+
name: rubocop-rspec
|
157
|
+
requirement: !ruby/object:Gem::Requirement
|
158
|
+
requirements:
|
159
|
+
- - "~>"
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
version: '2.6'
|
162
|
+
type: :development
|
163
|
+
prerelease: false
|
164
|
+
version_requirements: !ruby/object:Gem::Requirement
|
165
|
+
requirements:
|
166
|
+
- - "~>"
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: '2.6'
|
69
169
|
description: Set of small and standalone utilities in Ruby.
|
70
170
|
email:
|
71
171
|
- thomas.tych@gmail.com
|
72
172
|
executables:
|
173
|
+
- cat.rb
|
174
|
+
- datetime
|
175
|
+
- distinguished_name
|
176
|
+
- jb
|
177
|
+
- json2yaml
|
73
178
|
- proxy
|
179
|
+
- yaml2json
|
180
|
+
- yb
|
74
181
|
extensions: []
|
75
182
|
extra_rdoc_files: []
|
76
183
|
files:
|
77
184
|
- ".gitignore"
|
185
|
+
- ".reek.yml"
|
78
186
|
- ".rspec"
|
187
|
+
- ".rubocop.yml"
|
79
188
|
- ".travis.yml"
|
80
189
|
- CODE_OF_CONDUCT.md
|
81
190
|
- Gemfile
|
82
|
-
- Gemfile.lock
|
83
191
|
- LICENSE.txt
|
84
192
|
- README.md
|
85
193
|
- Rakefile
|
86
|
-
- bin/
|
87
|
-
- bin/
|
88
|
-
-
|
194
|
+
- bin/cat.rb
|
195
|
+
- bin/datetime
|
196
|
+
- bin/distinguished_name
|
197
|
+
- bin/jb
|
198
|
+
- bin/json2yaml
|
199
|
+
- bin/proxy
|
200
|
+
- bin/yaml2json
|
201
|
+
- bin/yb
|
89
202
|
- lib/quick_and_ruby.rb
|
203
|
+
- lib/quick_and_ruby/data.rb
|
204
|
+
- lib/quick_and_ruby/data/browser.rb
|
205
|
+
- lib/quick_and_ruby/data/context.rb
|
206
|
+
- lib/quick_and_ruby/date.rb
|
207
|
+
- lib/quick_and_ruby/date/date_time_args.rb
|
208
|
+
- lib/quick_and_ruby/date/date_time_cli.rb
|
209
|
+
- lib/quick_and_ruby/distinguished_name.rb
|
210
|
+
- lib/quick_and_ruby/distinguished_name/attribute.rb
|
211
|
+
- lib/quick_and_ruby/distinguished_name/openssl_format.rb
|
212
|
+
- lib/quick_and_ruby/distinguished_name/rfc_format.rb
|
90
213
|
- lib/quick_and_ruby/proxy/arg_parser.rb
|
91
214
|
- lib/quick_and_ruby/proxy/env_parser.rb
|
92
215
|
- lib/quick_and_ruby/proxy/proxy.rb
|
216
|
+
- lib/quick_and_ruby/string.rb
|
217
|
+
- lib/quick_and_ruby/string/case.rb
|
93
218
|
- lib/quick_and_ruby/version.rb
|
219
|
+
- man/distinguished_name.1.ronn
|
94
220
|
- quick_and_ruby.gemspec
|
95
|
-
|
221
|
+
- scripts/console
|
222
|
+
- scripts/setup
|
223
|
+
homepage: https://github.com/ttych/quick_and_ruby
|
96
224
|
licenses:
|
97
225
|
- MIT
|
98
226
|
metadata:
|
99
227
|
allowed_push_host: https://rubygems.org
|
100
|
-
homepage_uri: https://github.com/ttych/
|
228
|
+
homepage_uri: https://github.com/ttych/quick_and_ruby
|
101
229
|
source_code_uri: https://github.com/ttych/quick_and_ruby
|
102
|
-
changelog_uri: https://github.com/ttych/quick_and_ruby
|
103
|
-
|
230
|
+
changelog_uri: https://github.com/ttych/quick_and_ruby/CHANGELOG.md
|
231
|
+
rubygems_mfa_required: 'true'
|
232
|
+
post_install_message:
|
104
233
|
rdoc_options: []
|
105
234
|
require_paths:
|
106
235
|
- lib
|
107
236
|
required_ruby_version: !ruby/object:Gem::Requirement
|
108
237
|
requirements:
|
109
|
-
- - "
|
238
|
+
- - ">"
|
110
239
|
- !ruby/object:Gem::Version
|
111
|
-
version: '
|
240
|
+
version: '2.7'
|
112
241
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
242
|
requirements:
|
114
243
|
- - ">="
|
115
244
|
- !ruby/object:Gem::Version
|
116
245
|
version: '0'
|
117
246
|
requirements: []
|
118
|
-
rubygems_version: 3.
|
119
|
-
signing_key:
|
247
|
+
rubygems_version: 3.1.6
|
248
|
+
signing_key:
|
120
249
|
specification_version: 4
|
121
250
|
summary: Quick and Ruby utilities.
|
122
251
|
test_files: []
|
data/Gemfile.lock
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
quick_and_ruby (0.2.0)
|
5
|
-
|
6
|
-
GEM
|
7
|
-
remote: https://rubygems.org/
|
8
|
-
specs:
|
9
|
-
ast (2.4.0)
|
10
|
-
diff-lcs (1.3)
|
11
|
-
jaro_winkler (1.5.2)
|
12
|
-
parallel (1.17.0)
|
13
|
-
parser (2.6.2.0)
|
14
|
-
ast (~> 2.4.0)
|
15
|
-
psych (3.1.0)
|
16
|
-
rainbow (3.0.0)
|
17
|
-
rake (10.5.0)
|
18
|
-
rspec (3.8.0)
|
19
|
-
rspec-core (~> 3.8.0)
|
20
|
-
rspec-expectations (~> 3.8.0)
|
21
|
-
rspec-mocks (~> 3.8.0)
|
22
|
-
rspec-core (3.8.0)
|
23
|
-
rspec-support (~> 3.8.0)
|
24
|
-
rspec-expectations (3.8.2)
|
25
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
26
|
-
rspec-support (~> 3.8.0)
|
27
|
-
rspec-mocks (3.8.0)
|
28
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
29
|
-
rspec-support (~> 3.8.0)
|
30
|
-
rspec-support (3.8.0)
|
31
|
-
rubocop (0.66.0)
|
32
|
-
jaro_winkler (~> 1.5.1)
|
33
|
-
parallel (~> 1.10)
|
34
|
-
parser (>= 2.5, != 2.5.1.1)
|
35
|
-
psych (>= 3.1.0)
|
36
|
-
rainbow (>= 2.2.2, < 4.0)
|
37
|
-
ruby-progressbar (~> 1.7)
|
38
|
-
unicode-display_width (>= 1.4.0, < 1.6)
|
39
|
-
ruby-progressbar (1.10.0)
|
40
|
-
unicode-display_width (1.5.0)
|
41
|
-
|
42
|
-
PLATFORMS
|
43
|
-
ruby
|
44
|
-
|
45
|
-
DEPENDENCIES
|
46
|
-
bundler (~> 2.0)
|
47
|
-
quick_and_ruby!
|
48
|
-
rake (~> 10.0)
|
49
|
-
rspec (~> 3.0)
|
50
|
-
rubocop (~> 0.66.0)
|
51
|
-
|
52
|
-
BUNDLED WITH
|
53
|
-
2.0.1
|
/data/{bin → scripts}/setup
RENAMED
File without changes
|