ali-cli 0.0.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 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: []