matheus 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0f58d7287ef588ecd9a19da562f85a0c94cecb1911b07c1b3e079b620c37d7de
4
- data.tar.gz: f45c9ed2d4d192ead57a91562eecc52153c0dd35b6241fab31afcafa73050add
3
+ metadata.gz: 8f0188994d160b9cfc3ce6ab06610e4f42102ddf828dc01e1c917cdf02ac77c6
4
+ data.tar.gz: 0cf90a3177f25047f2b15fcf5198eb0de8ea3439116107576b7fdd7daab5bddf
5
5
  SHA512:
6
- metadata.gz: c2ab16abdc86aedba2c0ef30f1614091e17165d11bad1d8c95d3170619104e7e6a62c33785cc34abe516e3d3929434a5eac7f77550f17b2c639174c1d23aba03
7
- data.tar.gz: 0a241ef204280b9a5e08f379d82823bd670a9fd352e20fe633055e0a788ee1adaa15af5c7f8956c5c2bc1e032089eff502973e21839d6b318f166d7a455a0eba
6
+ metadata.gz: 364f6273dfdbc464d491b3ce29d670351c5c4c007524c0aa6ad46e1d44e810bf4e7dfa083821a20ae2f0058d01e45a601f7b68c70b9d42ed156df3e6205af895
7
+ data.tar.gz: d8c641cbaeca884aff2d5782b0abbe720ddaf08af0057676d85ea9bdb9bb0adff33f81c8b158d8a18ba32879dd2f7e30f667c9e400ca4e9862befcae44409366
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.4.0]
4
+
5
+ _Released 2024-10-02_
6
+
7
+ - Save past questions with `q` and retrieve them with the `qs` command.
8
+ - Reuse answers for the same questions.
9
+
3
10
  ## [0.3.0]
4
11
 
5
12
  _Released 2024-08-27_
data/README.md CHANGED
@@ -11,7 +11,7 @@ A bunch of CLI tools I made for my own use.
11
11
  ### `alert-me`
12
12
 
13
13
  ```sh
14
- $ alert-me sleep 1 && echo "Done!"
14
+ $ alert-me 'sleep 1 && echo "Done!"'
15
15
  Done!
16
16
  # plays a sound after the command finishes
17
17
  ```
data/Rakefile CHANGED
@@ -45,3 +45,5 @@ end
45
45
 
46
46
  # Ensure the generate_executables task runs before the build task
47
47
  task build: :generate_executables
48
+ # Ensure tests are run before releasing the gem
49
+ task release: :spec
data/exe/qs ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift("#{__dir__}/../lib")
4
+
5
+ require "matheus"
6
+
7
+ Matheus::Qs.call ARGV
@@ -1,11 +1,10 @@
1
1
  module Matheus
2
2
  class AlertMe < Command
3
3
  # Usage:
4
- # $ alert-me sleep 1 && echo 'Done!'
4
+ # $ alert-me "sleep 1 && echo 'Done!'"
5
5
  # Runs the command and plays a sound based on its success or failure after it finishes.
6
6
  def call(*args)
7
- command = args.join(" ")
8
- if system(command)
7
+ if system(args.join(" "))
9
8
  system("afplay /System/Library/Sounds/Glass.aiff")
10
9
  else
11
10
  system("afplay /System/Library/Sounds/Sosumi.aiff")
data/lib/matheus/q.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require "openai"
2
2
  require "tty-markdown"
3
+ require "tty-prompt"
4
+ require "json"
3
5
 
4
6
  module Matheus
5
7
  # Usage:
@@ -9,7 +11,17 @@ module Matheus
9
11
  BASE_PROMPT = "Answer this question in a short and concise way. You can use markdown in the response: "
10
12
 
11
13
  def call(question)
12
- ask_llm(question).then { print_markdown _1 }
14
+ question = question.join(" ")
15
+ existing_entry = search_question_in_history(question)
16
+
17
+ if existing_entry && use_existing_answer?
18
+ answer = existing_entry['answer']
19
+ else
20
+ answer = ask_llm(question)
21
+ save_qa(question, answer)
22
+ end
23
+
24
+ print_markdown(answer)
13
25
  rescue => e
14
26
  Failure(e.message)
15
27
  end
@@ -40,5 +52,26 @@ module Matheus
40
52
  def client
41
53
  OpenAI::Client.new(access_token: ENV.fetch("OPENAI_API_KEY"))
42
54
  end
55
+
56
+ def save_qa(question, answer)
57
+ history = load_history
58
+ history << { question:, answer:, timestamp: Time.now.to_s }
59
+ File.write(QUESTION_HISTORY_FILE, JSON.pretty_generate(history))
60
+ end
61
+
62
+ def load_history
63
+ File.exist?(QUESTION_HISTORY_FILE) ? JSON.parse(File.read(QUESTION_HISTORY_FILE)) : []
64
+ end
65
+
66
+ def search_question_in_history(question)
67
+ load_history.reverse.find { |entry| entry['question'].downcase.strip == question.downcase.strip }
68
+ end
69
+
70
+ def use_existing_answer?
71
+ prompt = TTY::Prompt.new
72
+ prompt.yes?("An existing answer was found. Do you want to use it?") do |q|
73
+ q.default true
74
+ end
75
+ end
43
76
  end
44
77
  end
data/lib/matheus/qs.rb ADDED
@@ -0,0 +1,40 @@
1
+ require "json"
2
+ require "tty-prompt"
3
+ require "tty-markdown"
4
+
5
+ module Matheus
6
+ # Usage:
7
+ # $ qs
8
+ # Lists the questions asked and their answers.
9
+ class Qs < Command
10
+ def call(_)
11
+ return puts "No questions found in history." if history.empty?
12
+
13
+ answer = prompt.select("Question:", choices, per_page: 10)
14
+ print_markdown(answer)
15
+ rescue => e
16
+ Failure(e.message)
17
+ end
18
+
19
+ private
20
+ def choices
21
+ history.map do |entry|
22
+ {entry['question'] => entry['answer'] }
23
+ end
24
+ end
25
+
26
+
27
+ def history
28
+ @history ||= File.exist?(QUESTION_HISTORY_FILE) ? JSON.parse(File.read(QUESTION_HISTORY_FILE)) : []
29
+ end
30
+
31
+ def prompt
32
+ @prompt ||= TTY::Prompt.new(interrupt: :exit)
33
+ end
34
+
35
+ def print_markdown(answer)
36
+ puts
37
+ puts TTY::Markdown.parse(answer)
38
+ end
39
+ end
40
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Matheus
4
- VERSION = "0.3.0"
4
+ VERSION = "0.4.0"
5
5
  end
data/lib/matheus.rb CHANGED
@@ -9,4 +9,5 @@ Dotenv.load("~/.env")
9
9
  Zeitwerk::Loader.for_gem.setup
10
10
 
11
11
  module Matheus
12
+ QUESTION_HISTORY_FILE = File.expand_path("~/.qa_history.json")
12
13
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: matheus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matheus Richard
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-08-27 00:00:00.000000000 Z
11
+ date: 2024-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: zeitwerk
@@ -66,6 +66,34 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 0.7.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: tty-table
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.12.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.12.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: tty-prompt
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.23.1
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.23.1
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: dotenv
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -88,6 +116,7 @@ executables:
88
116
  - date-of-last
89
117
  - puts
90
118
  - q
119
+ - qs
91
120
  extensions: []
92
121
  extra_rdoc_files: []
93
122
  files:
@@ -101,12 +130,14 @@ files:
101
130
  - exe/date-of-last
102
131
  - exe/puts
103
132
  - exe/q
133
+ - exe/qs
104
134
  - lib/matheus.rb
105
135
  - lib/matheus/alert_me.rb
106
136
  - lib/matheus/command.rb
107
137
  - lib/matheus/date_of_last.rb
108
138
  - lib/matheus/puts.rb
109
139
  - lib/matheus/q.rb
140
+ - lib/matheus/qs.rb
110
141
  - lib/matheus/result.rb
111
142
  - lib/matheus/string_format.rb
112
143
  - lib/matheus/version.rb