chid 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +11 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +67 -0
- data/README.md +221 -0
- data/Rakefile +17 -0
- data/chid.gemspec +32 -0
- data/etc/img/stack.png +0 -0
- data/lib/chid.rb +100 -0
- data/lib/chid/chid_config.rb +127 -0
- data/lib/chid/currency_api.rb +69 -0
- data/lib/chid/github_api.rb +41 -0
- data/lib/chid/main.rb +112 -0
- data/lib/chid/news_api.rb +60 -0
- data/lib/chid/paginator.rb +57 -0
- data/lib/chid/stack_overflow_api.rb +35 -0
- data/lib/chid/version.rb +3 -0
- data/lib/chid/yandex_translate_api.rb +39 -0
- data/tasks/chid/config.rake +5 -0
- data/tasks/chid/init.rake +19 -0
- data/tasks/chid/start.rake +26 -0
- data/tasks/chid/update.rake +14 -0
- data/tasks/currency/convert.rake +9 -0
- data/tasks/currency/current.rake +11 -0
- data/tasks/currency/list.rake +10 -0
- data/tasks/github.rake +12 -0
- data/tasks/help.rake +8 -0
- data/tasks/install/node.rake +18 -0
- data/tasks/install/postgres.rake +18 -0
- data/tasks/install/rvm.rake +21 -0
- data/tasks/install/yadr_dotfiles.rake +26 -0
- data/tasks/news.rake +11 -0
- data/tasks/run/postgres.rake +12 -0
- data/tasks/stack_overflow.rake +20 -0
- data/tasks/tmux/config_windows.rake +21 -0
- data/tasks/tmux/new_session.rake +10 -0
- data/tasks/translate/yandex_list.rake +7 -0
- data/tasks/translate/yandex_translate.rake +8 -0
- data/tasks/update/os.rake +14 -0
- data/tasks/workstation/create.rake +23 -0
- data/tasks/workstation/destroy.rake +14 -0
- data/tasks/workstation/list.rake +10 -0
- data/tasks/workstation/open.rake +29 -0
- metadata +158 -0
@@ -0,0 +1,127 @@
|
|
1
|
+
class ChidConfig
|
2
|
+
|
3
|
+
attr_reader :chid_path, :home_path, :chid_config_path
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@chid_path = Dir.pwd
|
7
|
+
@home_path = File.expand_path("~/")
|
8
|
+
@chid_config_path = File.join(home_path, '.chid.config')
|
9
|
+
end
|
10
|
+
|
11
|
+
def configure
|
12
|
+
print "\nConfigurating the Chid app...\n"
|
13
|
+
|
14
|
+
create_chid_alias_on_bashrc
|
15
|
+
create_an_empty_chid_config_file
|
16
|
+
|
17
|
+
print "\nConfiguration done!\n"
|
18
|
+
end
|
19
|
+
|
20
|
+
def username
|
21
|
+
on_linux { return %x[echo $USER].strip }
|
22
|
+
on_osx { return %x[echo $(logname)].strip }
|
23
|
+
end
|
24
|
+
|
25
|
+
def on_linux
|
26
|
+
if platform =~ /Linux/
|
27
|
+
yield
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def on_osx
|
32
|
+
if platform =~ /Darwin/
|
33
|
+
yield
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def platform
|
38
|
+
%x{echo $(uname -s)}.strip
|
39
|
+
end
|
40
|
+
|
41
|
+
def chid_rake_path
|
42
|
+
data = YAML.load_file chid_config_path
|
43
|
+
data[:chid][:chid_path]
|
44
|
+
end
|
45
|
+
|
46
|
+
def all_workstations
|
47
|
+
data = YAML.load_file chid_config_path
|
48
|
+
data[:chid][:workstations]
|
49
|
+
end
|
50
|
+
|
51
|
+
def destroy_workstations(workstations = [])
|
52
|
+
data = YAML.load_file chid_config_path
|
53
|
+
|
54
|
+
workstations.each do |w|
|
55
|
+
data[:chid][:workstations].delete_if { |key, value| key == w }
|
56
|
+
end
|
57
|
+
|
58
|
+
File.open(chid_config_path, 'w') do |file|
|
59
|
+
YAML.dump(data, file)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def create_workstation(name, apps = [])
|
64
|
+
data = YAML.load_file chid_config_path
|
65
|
+
|
66
|
+
data[:chid][:workstations][:"#{name}"] = apps
|
67
|
+
|
68
|
+
File.open(chid_config_path, 'w') do |file|
|
69
|
+
YAML.dump(data, file)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
def create_chid_alias_on_bashrc
|
75
|
+
config_path = zshrc_file_exist? ? zshrc_path : bashrc_path
|
76
|
+
print "\nCreating the chid alias on your "
|
77
|
+
print "#{config_path}\n".blue
|
78
|
+
|
79
|
+
File.open(config_path, 'a') do |file|
|
80
|
+
file.write "\nalias chid='rake -f #{chid_path}/Rakefile'" unless chid_config_file_exist?
|
81
|
+
end
|
82
|
+
print "\nTo reload your "
|
83
|
+
print "profile ".green
|
84
|
+
print "should run: "
|
85
|
+
print "source #{config_path}\n".blue
|
86
|
+
end
|
87
|
+
|
88
|
+
def zshrc_file_exist?
|
89
|
+
File.exist?(zshrc_path)
|
90
|
+
end
|
91
|
+
|
92
|
+
def zshrc_path
|
93
|
+
File.join(home_path, '.zshrc')
|
94
|
+
end
|
95
|
+
|
96
|
+
def bashrc_path
|
97
|
+
File.join(home_path, '.bashrc')
|
98
|
+
end
|
99
|
+
|
100
|
+
def chid_config_file_exist?
|
101
|
+
File.exist?(chid_config_path)
|
102
|
+
end
|
103
|
+
|
104
|
+
def create_an_empty_chid_config_file
|
105
|
+
print "\nCreating or Updating the "
|
106
|
+
print "~/.chid.config ".blue
|
107
|
+
print "file\n"
|
108
|
+
|
109
|
+
base_config = {
|
110
|
+
chid: {
|
111
|
+
chid_path: chid_path,
|
112
|
+
workstations: {}
|
113
|
+
}
|
114
|
+
}
|
115
|
+
if chid_config_file_exist?
|
116
|
+
data = YAML.load_file chid_config_path
|
117
|
+
data[:chid][:chid_path] = data[:chid].fetch(:chid_path, chid_path)
|
118
|
+
data[:chid][:workstations] = data[:chid].fetch(:workstations, {})
|
119
|
+
base_config = data
|
120
|
+
end
|
121
|
+
|
122
|
+
File.open(chid_config_path, 'w') do |file|
|
123
|
+
YAML.dump(base_config, file)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
#require 'http'
|
2
|
+
|
3
|
+
class CurrencyApi
|
4
|
+
API_TOKEN = '61d0e853b52d82f00b393fdad228eb47'
|
5
|
+
|
6
|
+
Quotes = Struct.new(:currency, :amount)
|
7
|
+
|
8
|
+
# Reference Options: https://currency-api.appspot.com
|
9
|
+
SOURCES = {
|
10
|
+
ARS: 'Argentina Peso',
|
11
|
+
AUD: 'Australia Dollar',
|
12
|
+
BTC: 'Bitcoin',
|
13
|
+
BRL: 'Brazil Real',
|
14
|
+
CAD: 'Canada Dollar',
|
15
|
+
CLP: 'Chile Peso',
|
16
|
+
CNY: 'China Yuan Renminbi',
|
17
|
+
CZK: 'Czech Republic Koruna',
|
18
|
+
DKK: 'Denmark Krone',
|
19
|
+
EUR: 'Euro Member Countries',
|
20
|
+
FJD: 'Fiji Dollar',
|
21
|
+
HNL: 'Honduras Lempira',
|
22
|
+
HKD: 'Hong Kong Dollar',
|
23
|
+
HUF: 'Hungary Forint',
|
24
|
+
ISK: 'Iceland Krona',
|
25
|
+
INR: 'India Rupee',
|
26
|
+
IDR: 'Indonesia Rupiah',
|
27
|
+
ILS: 'Israel Shekel',
|
28
|
+
JPY: 'Japan Yen',
|
29
|
+
KRW: 'Korea (South) Won',
|
30
|
+
MYR: 'Malaysia Ringgit',
|
31
|
+
MXN: 'Mexico Peso',
|
32
|
+
NZD: 'New Zealand Dollar',
|
33
|
+
NOK: 'Norway Krone',
|
34
|
+
PKR: 'Pakistan Rupee',
|
35
|
+
PHP: 'Philippines Peso',
|
36
|
+
PLN: 'Poland Zloty',
|
37
|
+
RUB: 'Russia Ruble',
|
38
|
+
SGD: 'Singapore Dollar',
|
39
|
+
ZAR: 'South Africa Rand',
|
40
|
+
SEK: 'Sweden Krona',
|
41
|
+
CHF: 'Switzerland Franc',
|
42
|
+
TWD: 'Taiwan New Dollar',
|
43
|
+
THB: 'Thailand Baht',
|
44
|
+
TRY: 'Turkey Lira',
|
45
|
+
GBP: 'United Kingdom Pound',
|
46
|
+
USD: 'United States Dollar',
|
47
|
+
VND: 'Viet Nam Dong'
|
48
|
+
}
|
49
|
+
|
50
|
+
def self.convert(options = {})
|
51
|
+
amount = options.fetch(:amount, 1).to_f
|
52
|
+
from = options.fetch(:from, :USD).to_sym
|
53
|
+
to = options.fetch(:to, :BRL).to_sym
|
54
|
+
|
55
|
+
request = HTTP.get("http://www.apilayer.net/api/live?access_key=#{API_TOKEN}")
|
56
|
+
json = JSON.parse request
|
57
|
+
|
58
|
+
to_amount = json['quotes']["USD#{to}"]
|
59
|
+
from_amount = json['quotes']["USD#{from}"]
|
60
|
+
|
61
|
+
if to == :USD
|
62
|
+
amount / from_amount
|
63
|
+
else
|
64
|
+
to_amount * amount
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# Api Reference: https://developer.github.com/v3/search/#search-repositories
|
2
|
+
class GitHubApi
|
3
|
+
|
4
|
+
Owner = Struct.new(:login)
|
5
|
+
|
6
|
+
Repository = Struct.new(:name, :owner, :html_url, :clone_url, :language, :stargazers_count, :updated_at) do
|
7
|
+
def summary
|
8
|
+
last_activity = updated_at.nil? ? 'unkown' : updated_at.strftime('%a %d %b %Y')
|
9
|
+
print "\n"
|
10
|
+
print "--- Repo name -> #{name} ---"
|
11
|
+
print "\n\n"
|
12
|
+
print "Author #{owner.login}".gray.bold
|
13
|
+
print "\n\n"
|
14
|
+
print "Link:\t".gray
|
15
|
+
print "#{html_url}".cyan.underline
|
16
|
+
print "\n\n"
|
17
|
+
print "Link to clone:\t".gray
|
18
|
+
print "#{clone_url}".cyan.underline
|
19
|
+
print "\n\n"
|
20
|
+
print "Write in #{language}".green.bold
|
21
|
+
print "\n\n"
|
22
|
+
print "Stars #{stargazers_count}".cyan.bold
|
23
|
+
print "\n\n"
|
24
|
+
print "Last activity #{last_activity}"
|
25
|
+
print "\n\n"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.repositories(search_expression)
|
30
|
+
uri = URI("https://api.github.com/search/repositories?q=#{search_expression}&sort=stars&order=desc")
|
31
|
+
request = ::HTTP.get(uri)
|
32
|
+
json_repositories = JSON.parse request
|
33
|
+
|
34
|
+
json_repositories['items'].collect do |item|
|
35
|
+
updated_at = item['updated_at'].nil? ? nil : Date.parse(item['updated_at'])
|
36
|
+
owner = Owner.new(item['owner']['login'])
|
37
|
+
Repository.new(item['name'], owner, item['html_url'], item['clone_url'], item['language'],
|
38
|
+
item['stargazers_count'], updated_at)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/chid/main.rb
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
class Main
|
2
|
+
|
3
|
+
ActionWithArgs = Struct.new(:action, :args)
|
4
|
+
|
5
|
+
private
|
6
|
+
attr_reader :chid_config
|
7
|
+
|
8
|
+
public
|
9
|
+
def initialize(chid_config)
|
10
|
+
@chid_config = chid_config
|
11
|
+
end
|
12
|
+
|
13
|
+
def init(&execute_action_block)
|
14
|
+
puts "Hello #{chid_config.username}".blue
|
15
|
+
puts "How can I help you?"
|
16
|
+
|
17
|
+
run(&execute_action_block)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
def fn_get_input
|
22
|
+
-> () {
|
23
|
+
print "> "
|
24
|
+
STDIN.gets.strip
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
def run(&execute_action_block)
|
29
|
+
input = fn_get_input.()
|
30
|
+
if quit_command?(input)
|
31
|
+
puts 'Bye Bye'
|
32
|
+
return
|
33
|
+
end
|
34
|
+
get_action(input, &execute_action_block)
|
35
|
+
run(&execute_action_block)
|
36
|
+
end
|
37
|
+
|
38
|
+
def quit_command?(input)
|
39
|
+
input =~ /^:q/ || input =~ /^bye/ || input =~ /^quit/ || input =~ /^exit/
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_action(input, &execute_action_block)
|
43
|
+
actions_with_args = get_actions_with_args(input)
|
44
|
+
return not_found_msgs if actions_with_args.empty?
|
45
|
+
|
46
|
+
get_action_with_args(actions_with_args) do | action_with_args|
|
47
|
+
execute_action_block.(action_with_args.action, action_with_args.args)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
def get_actions_with_args(input)
|
53
|
+
actions_with_args = Chid::REGEX_ACTIONS.collect do |action, regexs|
|
54
|
+
action_with_args = nil
|
55
|
+
|
56
|
+
regex_match(input, regexs) do |captured_args|
|
57
|
+
action_with_args = ActionWithArgs.new(action, captured_args)
|
58
|
+
end
|
59
|
+
action_with_args
|
60
|
+
end.compact!
|
61
|
+
end
|
62
|
+
|
63
|
+
def regex_match(input, regexs, &block)
|
64
|
+
regexs.each do |regex|
|
65
|
+
matched = regex.match input
|
66
|
+
if matched
|
67
|
+
captured_args = matched.captures
|
68
|
+
block.(captured_args)
|
69
|
+
return
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def get_action_with_args(actions_with_args)
|
75
|
+
return if actions_with_args.nil?
|
76
|
+
|
77
|
+
if actions_with_args.count > 1
|
78
|
+
action_with_args = choose_multiple_action(actions_with_args)
|
79
|
+
else
|
80
|
+
action_with_args = actions_with_args.first
|
81
|
+
end
|
82
|
+
|
83
|
+
yield action_with_args if action_with_args
|
84
|
+
end
|
85
|
+
|
86
|
+
def choose_multiple_action(actions_with_args)
|
87
|
+
puts "You are trying to execute #{actions_with_args.count} actions at once."
|
88
|
+
puts "Please choose:"
|
89
|
+
puts "0 - none"
|
90
|
+
actions_with_args.each_with_index { |a, i| puts "#{i + 1} - #{a.action}" }
|
91
|
+
choose = fn_get_input.().to_i
|
92
|
+
if choose == 0
|
93
|
+
puts "Ok, canceled"
|
94
|
+
return nil
|
95
|
+
end
|
96
|
+
choose = choose - 1
|
97
|
+
actions_with_args[choose]
|
98
|
+
end
|
99
|
+
|
100
|
+
def not_found_msgs()
|
101
|
+
msgs = [
|
102
|
+
"Sorry, I did not found any action.",
|
103
|
+
"You should try another action. That does not exist. Sorry.",
|
104
|
+
"Maybe you typed wrongly. Please try again."
|
105
|
+
]
|
106
|
+
|
107
|
+
msg_number = rand(3) - 1
|
108
|
+
|
109
|
+
puts msgs[msg_number]
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# Api Reference: https://newsapi.org/#apiArticles
|
2
|
+
class NewsApi
|
3
|
+
API_TOKEN = 'ce81e7aeb6c4467880b2ee5e4e2d8492'
|
4
|
+
|
5
|
+
Source = Struct.new(:id, :name, :description, :category)
|
6
|
+
Article = Struct.new(:source, :author, :title, :description, :url, :publishedAt) do
|
7
|
+
def summary
|
8
|
+
published_at = publishedAt.nil? ? 'unkown' : publishedAt.strftime("%B %d, %Y")
|
9
|
+
print "\n"
|
10
|
+
print "--- #{title} ---".blue
|
11
|
+
print "\n"
|
12
|
+
print " Posted #{published_at} by ".brown
|
13
|
+
print "#{author}".green
|
14
|
+
print "\n\n"
|
15
|
+
print " #{description}"
|
16
|
+
print "\n\n"
|
17
|
+
print " Link: "
|
18
|
+
print "#{url}".cyan.underline
|
19
|
+
print "\n"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
SOURCES = [
|
24
|
+
:"reddit-r-all",
|
25
|
+
:'google-news',
|
26
|
+
:'bbc-news',
|
27
|
+
:'cnn',
|
28
|
+
:'espn',
|
29
|
+
:'mashable',
|
30
|
+
:techcrunch
|
31
|
+
]
|
32
|
+
|
33
|
+
def self.articles
|
34
|
+
sources = self.sources()
|
35
|
+
sources.collect do |s|
|
36
|
+
request = ::HTTP.get("https://newsapi.org/v1/articles?source=#{s.id}&apiKey=#{API_TOKEN}")
|
37
|
+
json_news = JSON.parse request
|
38
|
+
|
39
|
+
json_news[ 'articles' ].collect do |n|
|
40
|
+
published_at = n[ 'publishedAt' ].nil? ? nil : Date.parse(n[ 'publishedAt' ])
|
41
|
+
Article.new(json_news[ 'source' ], n[ 'author' ], n[ 'title' ],
|
42
|
+
n[ 'description' ], n[ 'url' ], published_at)
|
43
|
+
end
|
44
|
+
|
45
|
+
end.flatten
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.sources()
|
49
|
+
#request = HTTP.get("https://newsapi.org/v1/sources?language=en")
|
50
|
+
#json_sources = JSON.parse request
|
51
|
+
|
52
|
+
#json_sources[ 'sources' ].collect do |s|
|
53
|
+
# Source.new(s[ 'id' ], s[ 'name' ], s[ 'description' ], s[ 'category' ])
|
54
|
+
#end
|
55
|
+
SOURCES.collect do |s|
|
56
|
+
Source.new(s)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
class Paginator
|
2
|
+
|
3
|
+
private
|
4
|
+
attr_reader :current_page, :per_page, :list
|
5
|
+
|
6
|
+
public
|
7
|
+
def initialize(list)
|
8
|
+
@current_page = 1
|
9
|
+
@per_page = 3
|
10
|
+
@list = list.freeze
|
11
|
+
end
|
12
|
+
|
13
|
+
def paginate(&block)
|
14
|
+
begin_index = (current_page - 1) * per_page
|
15
|
+
end_index = (current_page * per_page) - 1
|
16
|
+
|
17
|
+
return if list.size < begin_index
|
18
|
+
|
19
|
+
paginated_list = list.slice(begin_index..end_index)
|
20
|
+
|
21
|
+
paginated_list.each do |object|
|
22
|
+
block.(object) if block_given?
|
23
|
+
end
|
24
|
+
|
25
|
+
ask_action(&block)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def ask_action(&block)
|
30
|
+
return if total_pages <= 1
|
31
|
+
|
32
|
+
puts "\n#{current_page} of #{total_pages}"
|
33
|
+
|
34
|
+
puts "\nPrevious(p) Next(n) Quit(q):"
|
35
|
+
print "> "
|
36
|
+
option = STDIN.gets.strip
|
37
|
+
|
38
|
+
return if (/^q/.match(option))
|
39
|
+
next_page if (/^n/.match(option))
|
40
|
+
previous_page if (/^p/.match(option))
|
41
|
+
|
42
|
+
paginate(&block)
|
43
|
+
end
|
44
|
+
|
45
|
+
def next_page
|
46
|
+
@current_page += 1
|
47
|
+
end
|
48
|
+
|
49
|
+
def previous_page
|
50
|
+
@current_page -= 1
|
51
|
+
end
|
52
|
+
|
53
|
+
def total_pages
|
54
|
+
list.size / per_page
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|