-
Notifications
You must be signed in to change notification settings - Fork 3.2k
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
Add CLI - Integrate fakerbot 🤖 #1507
Changes from all commits
e34a04b
552de6e
2582f5d
38ec79c
c5e7224
5a65094
deb31a4
96b2dd1
a4b2bc2
9285086
63a24f1
fd9d986
203ef41
450dbaf
a800621
7ca6e5d
491b63a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
#!/usr/bin/env ruby | ||
# frozen_string_literal: true | ||
|
||
lib_path = File.expand_path('../lib', __dir__) | ||
$LOAD_PATH.unshift(lib_path) unless $LOAD_PATH.include?(lib_path) | ||
|
||
require 'cli' | ||
|
||
Signal.trap('INT') do | ||
warn("\n#{caller.join("\n")}: interrupted") | ||
exit(1) | ||
end | ||
|
||
begin | ||
Faker::CLI::Base.start | ||
rescue Faker::CLI::Base::Error => err | ||
puts "ERROR: #{err.message}" | ||
exit 1 | ||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'thor' | ||
|
||
require 'cli/commands/list' | ||
require 'cli/commands/search' | ||
require 'faker/version' | ||
|
||
module Faker | ||
module CLI | ||
class Base < Thor | ||
Error = Class.new(StandardError) | ||
# Skip default deprecation warning output; the CLI will display that. | ||
Gem::Deprecate.skip_during do | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Wrapping the |
||
desc 'version', 'Faker version' | ||
def version | ||
puts "v#{Faker::VERSION}" | ||
end | ||
map %w[--version -v] => :version | ||
|
||
desc 'list', 'List all Faker constants' | ||
method_option :help, aliases: '-h', type: :boolean, | ||
desc: 'Display usage information' | ||
method_option :show_methods, aliases: '-m', type: :boolean, default: true, | ||
desc: 'Display Faker constants with methods' | ||
method_option :verbose, aliases: '-v', type: :boolean, | ||
desc: 'Include sample Faker output' | ||
def list(*) | ||
if options[:help] | ||
invoke :help, ['list'] | ||
else | ||
Faker::CLI::Commands::List.new(options).execute | ||
end | ||
end | ||
|
||
desc 'search [Faker]', 'Search Faker method(s)' | ||
method_option :help, aliases: '-h', type: :boolean, | ||
desc: 'Display usage information' | ||
method_option :show_methods, aliases: '-m', type: :boolean, default: true, | ||
desc: 'Display Faker constants with methods' | ||
method_option :verbose, aliases: '-v', type: :boolean, | ||
desc: 'Include sample Faker output' | ||
def search(query) | ||
if options[:help] | ||
invoke :help, ['search'] | ||
else | ||
Faker::CLI::Commands::Search.new(options).execute(query) | ||
end | ||
end | ||
end | ||
end | ||
end | ||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
# faker (cli) | ||
|
||
## Usage | ||
|
||
1.) Run a quick lookup | ||
|
||
```bash | ||
$ faker search name | ||
# Faker::SwordArtOnline | ||
# └── real_name | ||
# └── game_name | ||
# Faker::Superhero | ||
# └── name | ||
# .... | ||
``` | ||
|
||
2.) List methods | ||
|
||
```sh | ||
$ faker list | ||
# Faker::BackToTheFuture | ||
# ├── quote | ||
# ├── date | ||
# └── character | ||
# Faker::Finance | ||
# └── credit_card | ||
# .... | ||
``` | ||
|
||
`faker` also includes an option to display sample output via the `--verbose` or `-v` flag. :wink: | ||
|
||
3.) | ||
|
||
```sh | ||
$ faker list -v | ||
# Faker::Appliance | ||
# ├── brand=> Whirlpool | ||
# └── equipment=> Sump pump | ||
# Faker::UmphreysMcgee | ||
# └── song=> Headphones & Snowcones | ||
$ faker search name -v | ||
# Faker::App | ||
# └── name=> Subin | ||
# Faker::Address | ||
# └── street_name=> Percy Landing | ||
# .... | ||
``` | ||
|
||
## Features! :sunglasses: :dancers: | ||
|
||
- [x] List classes with methods E.g. Faker::FunnyName is displayed with `.name`,`.first_name` e.t.c. | ||
- [x] Expand search to Faker::Base sub classes | ||
- [x] Paginate results :book: | ||
|
||
![screenshot 2019-01-05 at 03 02 08](https://user-images.githubusercontent.com/17295175/50717135-59d85780-1096-11e9-8d0d-eca95646644d.jpg) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'forwardable' | ||
|
||
require_relative 'renderer' | ||
|
||
module Faker | ||
module CLI | ||
class Command | ||
extend Forwardable | ||
|
||
def_delegators :command, :run | ||
attr_reader :options | ||
|
||
def initialize(options) | ||
@options = options | ||
end | ||
|
||
def render(result, output) | ||
Renderer.call(result, options, output) | ||
end | ||
end | ||
end | ||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
# frozen_string_literal: true | ||
|
||
require_relative '../command' | ||
require_relative '../reflectors/list' | ||
|
||
module Faker | ||
module CLI | ||
module Commands | ||
class List < Command | ||
def execute(output: $stdout) | ||
result = Reflectors::List.call(options) | ||
render(result, output) | ||
end | ||
end | ||
end | ||
end | ||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
# frozen_string_literal: true | ||
|
||
require_relative '../command' | ||
require_relative '../reflectors/search' | ||
|
||
module Faker | ||
module CLI | ||
module Commands | ||
class Search < Command | ||
def execute(input, output: $stdout) | ||
result = Reflectors::Search.call(input) | ||
render(result, output) | ||
end | ||
|
||
private | ||
|
||
def render(result, output) | ||
return not_found(output) if result.empty? | ||
|
||
super(result, output) | ||
end | ||
|
||
def not_found(output) | ||
output.puts "\nSorry, we couldn't find a match 😢", "\n" | ||
end | ||
end | ||
end | ||
end | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Adding these dependencies is a pretty big deal. Are we comfortable with them? I saw the terminal response. It's pretty cool.
Thoughts? @stympy
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's a valid concern, from my POV, these libraries go a long way in making the CLI interface easier to work with. 🙂 The alternative would be to write it all ourselves which I'm not sure about
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
FWIW, I find all these dependencies to be a big deal. I opened an issue about it (#1642) and plan to stay on 1.9.3 for the time being.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@myronmarston your concern is valid.
@akabiru would you agree to remove these dependencies and just show a formatted list of searched results?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hey folks, apologies for the very delayed response (on vacation). I think the move to a separate gem is the sensible approach. And allows users to opt-in into using the gem.
It did start as a separate gem , no strong objections on this one. 🙂
@vbrazo I'm happy to assist with the extraction &/migration as well.