ali-cli 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: '094ee32de699f8ab31bfbb9c34ff42b40de0fe50ec8f75cf449a35f5faeb2cd9'
4
+ data.tar.gz: 7ba097d6fbe68081da2ed7015196a737daab083d5cb447624e53081ff56a3afa
5
+ SHA512:
6
+ metadata.gz: 8a679c30c3ca9441e5dcbbfbd0cdc7399e03efa909077a6954cfc1cd1b02ba39e06a0feb9531726081d5f8fe94cba8958699dae5a9cf01e9ebbaf54fda69e410
7
+ data.tar.gz: 20c5d812134a25212f66db2d849327a6b0a657954ad9faf0a4639c3294489d65936d4285fb9c068a42925ba4ff6b89beaf45fadf1f0b838371a7bdca78ed251b
data/LICENSE.txt ADDED
@@ -0,0 +1,26 @@
1
+ Copyright 2023 Nathan Hopkins, @hopsoft
2
+
3
+ Redistribution and use in source and binary forms, with or without modification,
4
+ are permitted provided that the following conditions are met:
5
+
6
+ 1. Redistributions of source code must retain the above copyright notice, this
7
+ list of conditions and the following disclaimer.
8
+
9
+ 2. Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation and/or
11
+ other materials provided with the distribution.
12
+
13
+ 3. Neither the name of the copyright holder nor the names of its contributors
14
+ may be used to endorse or promote products derived from this software without
15
+ specific prior written permission.
16
+
17
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
21
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
24
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # Ali
2
+
3
+ > Float like a butterfly, sting like a bee. -Muhammad Ali
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ gem install ali
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ## Development
14
+
15
+ ### Setup
16
+
17
+ 1. Clone the project
18
+
19
+ ```sh
20
+ git clone git://github.com/hopsoft/ali.git
21
+ cd ali
22
+ ```
23
+
24
+ 1. Install dependencies and prepare environment for development
25
+
26
+ ```bash
27
+ bin/dev/setup
28
+
29
+ # or...
30
+ asdf install ruby 2.7.8
31
+ asdf local ruby 2.7.8
32
+ gem install bundler -v 1.17.3
33
+ ```
34
+
35
+ 1. Install GEM dependencies
36
+
37
+ ```bash
38
+ bin/dev/update
39
+
40
+ # or...
41
+ bundle _1.17.3_ update
42
+ ```
43
+
44
+ 1. Use the GEM and test your contribution
45
+
46
+ ```bash
47
+ bundle exec ali --help
48
+ ```
49
+
50
+ 1. Standardize your code before creating a Pull Request
51
+
52
+ ```bash
53
+ bin/dev/standardize
54
+ ```
55
+
56
+ ## Contributing
57
+
58
+ Bug reports and pull requests are welcome on GitHub at https://github.com/hopsoft/ali. 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/hopsoft/ali/blob/master/CODE_OF_CONDUCT.md).
59
+
60
+
61
+ ## Code of Conduct
62
+
63
+ Everyone interacting in the Ali project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/hopsoft/ali/blob/master/CODE_OF_CONDUCT.md).
64
+
65
+ ## Copyright
66
+
67
+ Copyright (c) 2023 Nathan Hopkins, @hopsoft. See [BSD 3-Clause License (Revised)](LICENSE.txt) for further details.
data/exe/ali ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "ali"
4
+
5
+ Ali::CLI.new.run
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "optparse"
4
+
5
+ class Ali::Arguments
6
+ attr_reader :unparsed, :task_name, :task_moniker, :task, :options
7
+
8
+ def initialize
9
+ @unparsed = ARGV.dup
10
+ @options = []
11
+
12
+ unparsed.dup.tap do |args|
13
+ parse_task args
14
+ parse_options args if task
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def parse_task_name_or_moniker(args)
21
+ args.first.start_with?("-") ?
22
+ @task_moniker = args.shift :
23
+ @task_name = args.shift
24
+ end
25
+
26
+ def parse_task(args)
27
+ parse_task_name_or_moniker args
28
+ @task = find_task&.new
29
+ end
30
+
31
+ def parse_options(args)
32
+ while args.any?
33
+ arg = args.shift
34
+
35
+ if arg.start_with?("-")
36
+ match = task.options.find { |o| o.flag == arg }
37
+ option = match&.dup
38
+ options << option if option
39
+ else
40
+ option = options.last || Ali::Option.new
41
+ option.values << arg
42
+ end
43
+ end
44
+
45
+ @options = Set.new(options).to_a
46
+ end
47
+
48
+ def find_task
49
+ Ali::Registry.instance.find { |key, task| task_match? key, task }&.last
50
+ end
51
+
52
+ def task_match?(key, task)
53
+ task_name_match?(key) || task_moniker_match?(task)
54
+ end
55
+
56
+ def task_name_match?(key)
57
+ task_name && key == task_name
58
+ end
59
+
60
+ def task_moniker_match?(task)
61
+ task_moniker && task.monikers.include?(task_moniker)
62
+ end
63
+ end
data/lib/ali/cli.rb ADDED
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Ali::CLI
4
+ attr_reader :arguments
5
+
6
+ def initialize
7
+ @arguments = Ali::Arguments.new
8
+ end
9
+
10
+ def run
11
+ @arguments.task.perform
12
+ end
13
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "liquid"
4
+ require "rainbow"
5
+
6
+ class Ali::Formatter
7
+ COLORS = (Rainbow::Color::Named.color_names + Rainbow::Color::X11Named.color_names).uniq.sort.freeze
8
+
9
+ MODIFIERS = %i[
10
+ background
11
+ bg
12
+ blink
13
+ bold
14
+ bright
15
+ color
16
+ cross_out
17
+ dark
18
+ faint
19
+ italic
20
+ strike
21
+ underline
22
+ ].freeze
23
+
24
+ STYLE_METHODS = (COLORS + MODIFIERS).uniq.sort.freeze
25
+
26
+ STYLE_METHODS.each do |name|
27
+ define_method name do |string|
28
+ string = Rainbow(string) unless string.is_a?(Rainbow::Presenter)
29
+ string.send name
30
+ end
31
+ end
32
+
33
+ module LiquidFilters
34
+ Ali::Formatter::STYLE_METHODS.each do |method|
35
+ define_method method do |input|
36
+ input = Rainbow(input) unless input.is_a?(Rainbow::Presenter)
37
+ input.public_send method
38
+ end
39
+ end
40
+
41
+ def rjust(input, size = 0, string = " ")
42
+ input.to_s.rjust size, string
43
+ end
44
+
45
+ Liquid::Template.register_filter self
46
+ end
47
+ end
data/lib/ali/option.rb ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Ali::Option
4
+ attr_reader :name, :flag, :values
5
+
6
+ def initialize(name: nil, description: nil, flag: nil, values: [])
7
+ @name = name
8
+ @description = description
9
+ @flag = flag
10
+ @values = values || Set.new(values).to_a
11
+ end
12
+ end
data/lib/ali/quotes.rb ADDED
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ali
4
+ module Quotes
5
+ class << self
6
+ delegate :sample, :take, to: :list
7
+
8
+ def list
9
+ @list ||= [
10
+ "A [person] who views the world the same at 50 as he did at 20 has wasted 30 years.",
11
+ "Age is whatever you think it is.",
12
+ "Don't quit. Suffer now, and live the rest of your life as a champion.",
13
+ "Don’t count the days; make the days count.",
14
+ "Float like a butterfly, sting like a bee.",
15
+ "I am the greatest. I said that before I knew I was the greatest. I just grew into it.",
16
+ "I am the greatest.",
17
+ "I don’t have to be what you want me to be.",
18
+ "I shook up the world.",
19
+ "I should be a postage stamp. That's the only way I'll ever get licked.",
20
+ "I'm not the greatest, I'm the most.",
21
+ "I'm not the greatest; I'm the double greatest.",
22
+ "I'm young; I'm handsome; I'm fast. I can't possibly be beat.",
23
+ "If my mind can conceive it, and my heart can believe it—then I can achieve it.",
24
+ "If you only dream at night, you'll live in the shadows of life.",
25
+ "Impossible is nothing.",
26
+ "It ain't over till it's over.",
27
+ "It isn't the mountains ahead to climb that wear you out; it's the pebble in your shoe.",
28
+ "It's hard to be humble when you're as great as I am.",
29
+ "It's not bragging if you can back it up.",
30
+ "It’s not the size of a [person] but the size of [their] heart that matters.",
31
+ "Live everyday as if it were your last.",
32
+ "Me? Whew! I like me. I'm my own favorite...",
33
+ "My road may be rough, but it's still my road.",
34
+ "Only a [person] who knows defeat can reach down and come up with extra power to win.",
35
+ "Service to others is the rent you pay for your room here on earth.",
36
+ "Silence is golden when you can't think of a good answer.",
37
+ "The [person] who has no imagination has no wings.",
38
+ "The [person] who views the world at 50 the same as he did at 20 has wasted 30 years.",
39
+ "The champion ain't afraid of losing. Everyone's afraid of losing. But the champion's afraid of not even trying.",
40
+ "The fight is won or lost far away from witnesses.",
41
+ "The mind is everything. What you think you become.",
42
+ "To be a great champion you must believe you are the best.",
43
+ "What you're thinking is what you're becoming.",
44
+ "[The person] who is not courageous enough to take risks will accomplish nothing."
45
+ ].freeze
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "singleton"
4
+ require "monitor"
5
+
6
+ class Ali::Registry
7
+ include Enumerable
8
+ include MonitorMixin
9
+ include Singleton
10
+
11
+ class Error < StandardError; end
12
+
13
+ def register(task)
14
+ synchronize do
15
+ key = task.name(for: :registry)
16
+ raise Error, "Task #{key} already exists!" if dictionary.key?(key)
17
+ dictionary[key] = task
18
+ end
19
+ end
20
+
21
+ def [](key)
22
+ scynchronize { dictionary[key.to_s] }
23
+ end
24
+
25
+ def each
26
+ synchronize do
27
+ dictionary.each { |key, task| yield key, task }
28
+ end
29
+ end
30
+
31
+ def to_a
32
+ synchronize { dictionary.values }
33
+ end
34
+
35
+ private
36
+
37
+ attr_reader :dictionary
38
+
39
+ def initialize
40
+ super
41
+ @dictionary = {}
42
+ end
43
+ end
data/lib/ali/task.rb ADDED
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Ali::Task
4
+ class << self
5
+ def inherited(subclass)
6
+ Ali::Registry.instance.register subclass
7
+ end
8
+
9
+ def name(options = {for: :class})
10
+ return super() if options[:for] == :class
11
+ super()
12
+ .then { |it| it.delete_prefix("Ali::Tasks::") }
13
+ .then { |it| it.split("::").map(&:parameterize).join(":") }
14
+ end
15
+
16
+ def description(value = nil)
17
+ return @description.to_s if value.nil?
18
+ @description = value
19
+ end
20
+
21
+ def monikers(*values)
22
+ return @monikers.to_a if values.none?
23
+ @monikers ||= Set.new(values.flatten.map(&:to_s))
24
+ end
25
+
26
+ def options(*values)
27
+ return @options.to_a if values.none?
28
+ @options ||= Set.new(values.flatten.select { |it| it.is_a?(Ali::Option) })
29
+ end
30
+
31
+ def inspect
32
+ value = <<~INSPECT
33
+ #<#{name}
34
+ name=#{name(for: :task).inspect}
35
+ monikers=#{monikers.inspect}
36
+ description=#{description.to_s.squish.inspect}
37
+ options=#{options.inspect}>
38
+ INSPECT
39
+ value.squish
40
+ end
41
+
42
+ def to_h
43
+ {
44
+ name: name(for: :task),
45
+ monikers: monikers,
46
+ description: description
47
+ # options: options
48
+ }.stringify_keys
49
+ end
50
+ end
51
+
52
+ attr_reader :template
53
+
54
+ def initialize
55
+ @template = Ali::Template.new(self)
56
+ end
57
+
58
+ def perform(*args)
59
+ raise NotImplementedError, "#perform must be implemented by subclass"
60
+ end
61
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Ali::Tasks::Help < Ali::Task
4
+ description "Prints this help message"
5
+ monikers %w[-h --help]
6
+
7
+ def perform
8
+ puts template.render
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Ali::Tasks::Version < Ali::Task
4
+ description "Prints the current library version"
5
+ monikers %w[-v --version]
6
+
7
+ def perform
8
+ puts template.render
9
+ end
10
+ end
data/lib/ali/tasks.rb ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ali::Tasks; end
4
+ Dir[File.join(__dir__, "tasks", "**", "*.rb")].each { |file| require file }
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "liquid"
4
+ require "rouge"
5
+ require "rouge/plugins/redcarpet"
6
+
7
+ class Ali::Template
8
+ attr_reader :task
9
+
10
+ def initialize(task)
11
+ @task = task
12
+ end
13
+
14
+ def source_location
15
+ task.method(:perform).source_location
16
+ end
17
+
18
+ def task_path
19
+ Pathname.new(source_location.first)
20
+ end
21
+
22
+ def liquid_path
23
+ path = File.join(task_path.dirname, "..", "templates", task_path.basename.sub_ext(".liquid"))
24
+ Pathname File.expand_path(path)
25
+ end
26
+
27
+ def liquid_template
28
+ return nil unless liquid_path.file?
29
+ Liquid::Template.parse File.read(liquid_path)
30
+ end
31
+
32
+ def render(liquid_template = self.liquid_template)
33
+ context = {
34
+ tasks: Ali::Registry.instance.to_a.map(&:to_h),
35
+ task: task,
36
+ quote: Ali::Quotes.sample,
37
+ version: Ali::VERSION
38
+ }
39
+ liquid_template&.render(context.stringify_keys)&.strip
40
+ end
41
+
42
+ def render_source
43
+ source = task.method(:perform).source
44
+ indent = source.scan(/\s+/).first&.size.to_i
45
+ formatter = Rouge::Formatters::Terminal256.new(theme: Rouge::Themes::Monokai.new)
46
+ lexer = Rouge::Lexers::Ruby.new
47
+ Rouge.highlight "\n#{"".ljust(indent, " ")}# #{task_path}:#{source_location.last}\n#{source}", lexer, formatter
48
+ end
49
+ end
@@ -0,0 +1,14 @@
1
+ {% assign count = 0 -%}
2
+
3
+ {{ quote | prepend: '"' | append: '"' | faint }} 🥊 {{ "Ali" | firebrick | bright }}
4
+ {% for task in tasks -%}
5
+ {% assign count = count | plus: 1 -%}
6
+
7
+ {% capture t -%}
8
+ {% assign num = count | rjust: 3, "0" | append: "." | faint -%}
9
+ {% assign call = "ali " | cyan | bright | append: task.name -%}
10
+ {{ num }} {{ call }} {{ "(" | faint }}{{ task.monikers | join: ", " }}{{ ")" | faint }}
11
+ {% endcapture -%}
12
+
13
+ {{ t | strip }} {{ task.description | darkcyan }}
14
+ {% endfor -%}
@@ -0,0 +1,5 @@
1
+ {% capture v -%}
2
+ {{ "ali" | cyan | bright }} {{ "v" | faint }}{{ version }}
3
+ {% endcapture -%}
4
+
5
+ {{ v | strip }} {{ quote | prepend: '"' | append: '"' | faint }} 🥊 {{ "Ali" | firebrick | bright }}
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ali
4
+ VERSION = "0.0.1"
5
+ end
data/lib/ali.rb ADDED
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/all"
4
+ require "zeitwerk"
5
+ require "pry-byebug" if ENV["DEBUG"]
6
+
7
+ module Ali
8
+ class << self
9
+ def root
10
+ Pathname.new File.expand_path(__dir__)
11
+ end
12
+ end
13
+ end
14
+
15
+ loader = Zeitwerk::Loader.for_gem
16
+ loader.inflector.inflect("cli" => "CLI")
17
+ loader.setup
18
+ loader.eager_load
metadata ADDED
@@ -0,0 +1,219 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ali-cli
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Nate Hopkins (@hopsoft)
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2023-12-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: liquid
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rouge
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rainbow
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: zeitwerk
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: magic_frozen_string_literal
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: minitest
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: minitest-reporters
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: pry-byebug
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: standardrb
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description: CLI tool suite for the Etision LLC suite subsidiary companies
168
+ email:
169
+ - natehop@gmail.com
170
+ executables:
171
+ - ali
172
+ extensions: []
173
+ extra_rdoc_files: []
174
+ files:
175
+ - LICENSE.txt
176
+ - README.md
177
+ - exe/ali
178
+ - lib/ali.rb
179
+ - lib/ali/arguments.rb
180
+ - lib/ali/cli.rb
181
+ - lib/ali/formatter.rb
182
+ - lib/ali/option.rb
183
+ - lib/ali/quotes.rb
184
+ - lib/ali/registry.rb
185
+ - lib/ali/task.rb
186
+ - lib/ali/tasks.rb
187
+ - lib/ali/tasks/help.rb
188
+ - lib/ali/tasks/version.rb
189
+ - lib/ali/template.rb
190
+ - lib/ali/templates/help.liquid
191
+ - lib/ali/templates/version.liquid
192
+ - lib/ali/version.rb
193
+ homepage: https://github.com/hopsoft/ali
194
+ licenses:
195
+ - BSD-3-Clause
196
+ metadata:
197
+ homepage_uri: https://github.com/hopsoft/ali
198
+ source_code_uri: https://github.com/hopsoft/ali
199
+ changelog_uri: https://github.com/hopsoft/ali/CHANGELOG.md
200
+ post_install_message:
201
+ rdoc_options: []
202
+ require_paths:
203
+ - lib
204
+ required_ruby_version: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: 2.7.8
209
+ required_rubygems_version: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - ">="
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ requirements: []
215
+ rubygems_version: 3.5.1
216
+ signing_key:
217
+ specification_version: 4
218
+ summary: CLI tool suite for the Etision LLC suite subsidiary companies
219
+ test_files: []