papago 1.0.9 → 1.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 89655ddfbce6f30231bc51303aa14f9f4fdacb5e150ebd1be3ca21a251519251
4
- data.tar.gz: 68c281a7638c1b8bfae301e80297f28a2595b5822072002dfbf024fc0bfbd9e6
3
+ metadata.gz: 1974f1980eecef75f2f0f095f4740294839c1eddbd6cae7a3fd59ae550116d83
4
+ data.tar.gz: 0074c89724c97de92e666ed9c81288f6b7fa9630c7bab48ffb530306d8bdd02c
5
5
  SHA512:
6
- metadata.gz: d7b25abab7dbfe25f0f048e43a7f84cb31133e3b66e5016034bd0ca7d390aa9754ace422a11f4de21e3cc73850dcb9da38b5cbc955f00ef39dd92d1918272543
7
- data.tar.gz: 6992b0a1c641e99898a1b87d51df287e0927516b9d3077e60de4222d9a4af8dee9175c548613060049cb08d97b492fb6c70f5c2711015c743b48df9ff36a23ee
6
+ metadata.gz: 15dbb550862faa7611d8586bf9bfb672fa24a5373de18d30005da07fb4d7f053bcfd5bb4ee753a2b5b8b91426548a94aba5114991f5a33cc2fec98f5ea028ed8
7
+ data.tar.gz: 272cc413c83aa0b1c4978d552274228ea88563a8e82aea6e8eda4056d75e079932cde5e05f8cb0b63b8e1702ab3b184924672c830c1260e6b0af517436a6e9f9
data/bin/papago CHANGED
@@ -1,3 +1,35 @@
1
1
  #!/usr/bin/env ruby
2
-
2
+ require 'mercenary'
3
3
  require 'papago'
4
+
5
+ Mercenary.program(:papago) do |program|
6
+ program.version Papago::VERSION
7
+ program.syntax 'papago <text> [options]'
8
+
9
+ program.option 'switch', '-s', '--switch', 'Select a service'
10
+ program.option 'input', '-i', '--input PATH', String, 'Set file path'
11
+ program.option 'dest', '--dest IDENT', String, 'Set target language'
12
+
13
+ program.action do |args, options|
14
+ if options['switch']
15
+ Papago::Actions::Switch
16
+ .process(config: Papago.config)
17
+ else
18
+ text = args.join(' ').strip
19
+ path = options['input']
20
+
21
+ if path and File.file?(path)
22
+ text = File.read(path)
23
+ .gsub(/\n/, ' ')
24
+ .strip
25
+ end
26
+
27
+ if text.empty?
28
+ puts 'No content'
29
+ else
30
+ Papago::Actions::Run
31
+ .process(text: text, dest: options['dest'])
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,42 @@
1
+ module Papago
2
+ module Actions
3
+ class Run
4
+ attr_reader :printer
5
+ attr_reader :service
6
+
7
+ def initialize
8
+ @printer = Papago::Printer.new
9
+ @service = create_service(Papago.service_name || 'youdao')
10
+ end
11
+
12
+ private
13
+
14
+ def create_service(name)
15
+ if name.to_sym == :openai
16
+ Papago::OpenAIService.new(config: Papago.config)
17
+ else
18
+ DolphinKit.create_service(name)
19
+ end
20
+ end
21
+
22
+ def self.process(text:, dest:)
23
+ instance = self.new
24
+ printer = instance.printer
25
+ service = instance.service
26
+
27
+ case service.name
28
+ when :baidu, :qcloud
29
+ printer.println(
30
+ service.name,
31
+ service.call(text: text, target: dest)
32
+ )
33
+ else
34
+ printer.println(
35
+ service.name,
36
+ service.call(text: text)
37
+ )
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,22 @@
1
+ module Papago
2
+ module Actions
3
+ class Switch
4
+ CHOICES = %w{baidu openai qcloud youdao}
5
+
6
+ def self.process(config:)
7
+ prompt = TTY::Prompt.new
8
+ choice = prompt.select('Choose a service?', CHOICES)
9
+
10
+ config.set('translator.service_name', value: choice)
11
+ config.write(force: true)
12
+
13
+ if choice == 'openai' and (config.fetch('openai.endpoint').nil? or prompt.yes?('Update endpoint?'))
14
+ if endpoint = prompt.ask('OpenAI endpoint:')
15
+ config.set('openai.endpoint', value: endpoint)
16
+ config.write(force: true)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,68 @@
1
+ module Papago
2
+ class Printer
3
+ def println(name, data)
4
+ puts send(:"result_#{name}", data)
5
+ end
6
+
7
+ private
8
+
9
+ def result_baidu(data)
10
+ result = data['trans_result']&.first
11
+ return data if result.nil?
12
+
13
+ tree_format({
14
+ name: result['src'],
15
+ contents: [
16
+ {
17
+ name: result['dst']
18
+ }
19
+ ]
20
+ })
21
+ end
22
+
23
+ def result_openai(data)
24
+ result = data['choices']&.first['text']
25
+ return data if result.nil?
26
+
27
+ tree_format({
28
+ name: result&.strip
29
+ })
30
+ end
31
+
32
+ def result_qcloud(data)
33
+ result = data['TargetText']
34
+ return data if result.nil?
35
+
36
+ tree_format({
37
+ name: result
38
+ })
39
+ end
40
+
41
+ def result_youdao(data)
42
+ return data unless data['errorCode'].zero?
43
+
44
+ explains = data.fetch('web', []).map { |explain|
45
+ {
46
+ name: "#{explain.fetch('key')}: #{explain.fetch('value').join(' ')}"
47
+ }
48
+ }
49
+
50
+ result = {
51
+ name: "#{data['query']} [#{data.dig('basic', 'phonetic')}]".gsub(' []', ''),
52
+ contents: [
53
+ {
54
+ name: data.fetch('translation').join(' '),
55
+ contents: (data.dig('basic', 'explains') || []).map { |explain| { name: explain } }
56
+ }
57
+ ] + explains
58
+ }
59
+
60
+ tree_format(result)
61
+ end
62
+
63
+ def tree_format(data)
64
+ result = StringIO.new(Treely.tree([data]).to_s)
65
+ Lol.cat(result, freq: 0.25, spread: 8.0, os: rand(128))
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,41 @@
1
+ require 'securerandom'
2
+
3
+ module Papago
4
+ class OpenAIService
5
+ attr_reader :name
6
+
7
+ def initialize(api_key: nil, config:)
8
+ @endpoint = config.fetch('openai.endpoint')
9
+ @token = api_key || ENV['OPENAI_FANYI_API_KEY']
10
+
11
+ @config = config
12
+ @name = :openai
13
+ end
14
+
15
+ def call(text:, user: nil)
16
+ user ||= generate_user_id
17
+ require 'http' unless defined?(HTTP)
18
+
19
+ response = HTTP
20
+ .auth("Token #{@token}")
21
+ .post(@endpoint, json: { prompt: text, user: user })
22
+
23
+ JSON.parse(response.body)
24
+ end
25
+
26
+ private
27
+
28
+ def generate_user_id
29
+ @user_id ||= @config.fetch('user_id')
30
+
31
+ if @user_id.nil?
32
+ @user_id = SecureRandom.hex
33
+
34
+ @config.set('user_id', value: @user_id)
35
+ @config.write(force: true)
36
+ end
37
+
38
+ @user_id
39
+ end
40
+ end
41
+ end
@@ -1,3 +1,3 @@
1
1
  module Papago
2
- VERSION = '1.0.9'
2
+ VERSION = '1.1.0'
3
3
  end
data/lib/papago.rb ADDED
@@ -0,0 +1,55 @@
1
+ require 'json'
2
+ require 'lolcat'
3
+ require 'treely'
4
+ require 'stringio'
5
+ require 'fileutils'
6
+ require 'tty-config'
7
+ require 'tty-prompt'
8
+ require 'dolphin_kit'
9
+
10
+ require 'papago/version'
11
+ require 'papago/services/openai_service'
12
+ require 'papago/actions/switch'
13
+ require 'papago/actions/run'
14
+ require 'papago/printer'
15
+
16
+ module Papago
17
+ class Application
18
+ attr_reader :config
19
+
20
+ def initialize
21
+ @config = TTY::Config.new
22
+ @config_dir = File.dirname(config_file)
23
+
24
+ unless File.exist?(@config_dir)
25
+ FileUtils.mkdir(@config_dir)
26
+ end
27
+
28
+ @config.append_path @config_dir
29
+
30
+ if File.exist?(config_file)
31
+ @config.read
32
+ else
33
+ @config.write
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def config_file
40
+ @config_file ||= "#{Dir.home}/.papago/config.yml"
41
+ end
42
+ end
43
+
44
+ def self.service_name
45
+ config.fetch('translator.service_name')
46
+ end
47
+
48
+ def self.application
49
+ @application ||= Application.new
50
+ end
51
+
52
+ def self.config
53
+ @config ||= application.config
54
+ end
55
+ end
metadata CHANGED
@@ -1,41 +1,130 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: papago
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.9
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
- - oneureka
7
+ - razeos at tossdev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-10-06 00:00:00.000000000 Z
11
+ date: 2023-06-20 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mercenary
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.4.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.4.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: tty-config
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.6.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.6.0
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: tty-prompt
15
43
  requirement: !ruby/object:Gem::Requirement
16
44
  requirements:
17
45
  - - "~>"
18
46
  - !ruby/object:Gem::Version
19
- version: '0.23'
47
+ version: 0.23.1
20
48
  type: :runtime
21
49
  prerelease: false
22
50
  version_requirements: !ruby/object:Gem::Requirement
23
51
  requirements:
24
52
  - - "~>"
25
53
  - !ruby/object:Gem::Version
26
- version: '0.23'
54
+ version: 0.23.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: dolphin_kit
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: lolcat
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '100.0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '100.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: treely
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: http
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '5.1'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '5.1'
27
111
  description:
28
- email: oneureka@github.io
112
+ email:
29
113
  executables:
30
114
  - papago
31
115
  extensions: []
32
116
  extra_rdoc_files: []
33
117
  files:
34
118
  - bin/papago
119
+ - lib/papago.rb
120
+ - lib/papago/actions/run.rb
121
+ - lib/papago/actions/switch.rb
122
+ - lib/papago/printer.rb
123
+ - lib/papago/services/openai_service.rb
35
124
  - lib/papago/version.rb
36
- homepage: https://dub.sh/papago
125
+ homepage: https://papago.vercel.app
37
126
  licenses:
38
- - BSD-1-Clause
127
+ - MIT
39
128
  metadata: {}
40
129
  post_install_message:
41
130
  rdoc_options: []
@@ -45,15 +134,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
45
134
  requirements:
46
135
  - - ">="
47
136
  - !ruby/object:Gem::Version
48
- version: '3.0'
137
+ version: '0'
49
138
  required_rubygems_version: !ruby/object:Gem::Requirement
50
139
  requirements:
51
140
  - - ">="
52
141
  - !ruby/object:Gem::Version
53
142
  version: '0'
54
143
  requirements: []
55
- rubygems_version: 3.5.22
144
+ rubygems_version: 3.1.2
56
145
  signing_key:
57
146
  specification_version: 4
58
- summary: A translation toolkit
147
+ summary: A simple command-line translator
59
148
  test_files: []