tr4n5l4te 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 25ecf2991af5a49fac8fed51de97b3fe9d0a2edc
4
+ data.tar.gz: 84d757c37311c97a4cf69523aa6167d900cda92a
5
+ SHA512:
6
+ metadata.gz: e1ab45725bc6561564949defd66b2b2f81639e57b8a39b22d225efd65c11ec58b34c57bacd67a61fb4962af395838d7aa63e1aba249e521650e518d3b1899ce5
7
+ data.tar.gz: 1357683e1e1c68a39a24e44eba023061e3fa3094c85d0028678cefeea8784b31b9812d3a8562e75c1713775f53abbdb543bbd4c8baeb5599a21207c590601a85
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ test.html
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.4
4
+ before_install: gem install bundler -v 1.11.2
data/CHANGELOG ADDED
@@ -0,0 +1,3 @@
1
+ *0.1.0* (March 15, 2016)
2
+
3
+ * Initial gem release
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in tr4n5l4te.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Chris Blackburn
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,71 @@
1
+ # Tr4n5l4te
2
+
3
+ Use Google Translate without an API key.
4
+
5
+ Like me, maybe you've found that Google makes it a pain to work with their API. Tr4n5l4te gets around all that.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'tr4n5l4te'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install tr4n5l4te
22
+
23
+ ## Usage
24
+
25
+ In your code:
26
+
27
+ ```ruby
28
+ translator = Tr4n5l4te::Translator.new
29
+ english_strings = %w(
30
+ hello
31
+ how are you
32
+ )
33
+ english_strings.each do |text|
34
+ puts translator.translate(text, :en, :es)
35
+ end
36
+ # => hola
37
+ # => cómo estás
38
+ ```
39
+
40
+ To translate a YAML file:
41
+
42
+ $ ./exe/translate -y /path/to/yml/file -l "destination-language"
43
+
44
+ To list all known languages
45
+
46
+ $ ./exe/translate -t
47
+
48
+ ## Development
49
+
50
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
51
+
52
+ ### Specs
53
+
54
+ The specs are sprinkled with integration tests which will actually go out and hit the live web. To run them:
55
+
56
+ $ INTEGRATION=1 rake spec
57
+
58
+ Please be kind or Google is likely to ban your IP address.
59
+
60
+ #### Spec Coverage
61
+
62
+ $ INTEGRATION=1 COVERAGE=1 rake spec
63
+ $ open coverage/index.html # if you are on OSX
64
+
65
+ ## Contributing
66
+
67
+ Bug reports and pull requests are welcome on GitHub at https://github.com/midwire/tr4n5l4te.
68
+
69
+ ## License
70
+
71
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rspec/core/rake_task'
4
+ RSpec::Core::RakeTask.new(:spec)
5
+ task default: :spec
6
+
7
+ begin
8
+ require 'midwire_common/rake_tasks'
9
+ rescue StandardError => e
10
+ puts(">>> Can't load midwire_common/rake_tasks.")
11
+ puts(">>> Did you 'bundle exec'?: #{e.message}")
12
+ exit
13
+ end
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "tr4n5l4te"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/exe/translate ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+
6
+ require 'tr4n5l4te'
7
+ require 'tr4n5l4te/runner'
8
+
9
+ Tr4n5l4te::Runner.instance.run
@@ -0,0 +1,88 @@
1
+ require 'capybara'
2
+ require 'capybara/poltergeist'
3
+ require 'yaml'
4
+
5
+ module Tr4n5l4te
6
+ Capybara.register_driver :poltergeist do |app|
7
+ Capybara::Poltergeist::Driver.new(app, js_errors: false)
8
+ end
9
+ Capybara.default_driver = :poltergeist
10
+ Capybara.javascript_driver = :poltergeist
11
+
12
+ class Agent
13
+ # rubocop:disable Metrics/LineLength
14
+ DEFAULT_UA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/601.4.4 (KHTML, like Gecko) Version/9.0.3 Safari/601.4.4'.freeze
15
+ # rubocop:enable Metrics/LineLength
16
+
17
+ attr_reader :browser
18
+
19
+ def initialize(options = {})
20
+ Capybara.ignore_hidden_elements = false
21
+ @browser = options[:browser] || Capybara.current_session
22
+ browser.driver.headers = { 'User-Agent' => DEFAULT_UA }
23
+ end
24
+
25
+ # rubocop:disable Metrics/AbcSize, Lint/AssignmentInCondition
26
+ def load_cookies(cookie_file)
27
+ return false unless cookie_hash = YAML.load(File.read(cookie_file))
28
+ browser.driver.clear_cookies
29
+ cookie_hash.each do |key, cookie_obj|
30
+ browser.driver.set_cookie(
31
+ key,
32
+ cookie_obj.value,
33
+ domain: cookie_obj.domain,
34
+ path: cookie_obj.path,
35
+ secure: cookie_obj.secure?,
36
+ httponly: cookie_obj.httponly?,
37
+ expires: cookie_obj.expires
38
+ )
39
+ end
40
+ end
41
+ # rubocop:enable Metrics/AbcSize, Lint/AssignmentInCondition
42
+
43
+ def store_cookies(cookie_file)
44
+ FileUtils.mkdir_p(File.dirname(cookie_file))
45
+ data = YAML.dump(browser.driver.cookies)
46
+ File.open(cookie_file, 'w') { |f| f.write(data) }
47
+ end
48
+
49
+ def set_cookie(name, value, options = {})
50
+ browser.driver.set_cookie(
51
+ name.to_s,
52
+ value.to_s,
53
+ domain: options.fetch(:domain, nil),
54
+ path: options.fetch(:path, nil),
55
+ secure: options.fetch(:secure, false),
56
+ httponly: options.fetch(:httponly, false),
57
+ expires: options.fetch(:expires, time_plus_years)
58
+ )
59
+ end
60
+
61
+ def cookies
62
+ browser.driver.cookies
63
+ end
64
+
65
+ def visit(url)
66
+ response = browser.visit(url)
67
+ response.recursively_symbolize_keys!
68
+ end
69
+
70
+ def body
71
+ browser.body
72
+ end
73
+
74
+ def elements(selector_string)
75
+ browser.all(selector_string)
76
+ end
77
+
78
+ private
79
+
80
+ def time_plus_years(years = 30)
81
+ Time.now + days(365) * years
82
+ end
83
+
84
+ def days(num)
85
+ num * 86_400
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,136 @@
1
+ module Tr4n5l4te
2
+ class Language
3
+ TABLE = {
4
+ "af" => "Afrikaans",
5
+ "sq" => "Albanian",
6
+ "am" => "Amharic",
7
+ "ar" => "Arabic",
8
+ "hy" => "Armenian",
9
+ "az" => "Azerbaijani",
10
+ "eu" => "Basque",
11
+ "be" => "Belarusian",
12
+ "bn" => "Bengali",
13
+ "bs" => "Bosnian",
14
+ "bg" => "Bulgarian",
15
+ "ca" => "Catalan",
16
+ "ceb" => "Cebuano",
17
+ "ny" => "Chichewa",
18
+ "zh-CN" => "Chinese",
19
+ "co" => "Corsican",
20
+ "hr" => "Croatian",
21
+ "cs" => "Czech",
22
+ "da" => "Danish",
23
+ "nl" => "Dutch",
24
+ "en" => "English",
25
+ "eo" => "Esperanto",
26
+ "et" => "Estonian",
27
+ "tl" => "Filipino",
28
+ "fi" => "Finnish",
29
+ "fr" => "French",
30
+ "fy" => "Frisian",
31
+ "gl" => "Galician",
32
+ "ka" => "Georgian",
33
+ "de" => "German",
34
+ "el" => "Greek",
35
+ "gu" => "Gujarati",
36
+ "ht" => "Haitian Creole",
37
+ "ha" => "Hausa",
38
+ "haw" => "Hawaiian",
39
+ "iw" => "Hebrew",
40
+ "hi" => "Hindi",
41
+ "hmn" => "Hmong",
42
+ "hu" => "Hungarian",
43
+ "is" => "Icelandic",
44
+ "ig" => "Igbo",
45
+ "id" => "Indonesian",
46
+ "ga" => "Irish",
47
+ "it" => "Italian",
48
+ "ja" => "Japanese",
49
+ "jw" => "Javanese",
50
+ "kn" => "Kannada",
51
+ "kk" => "Kazakh",
52
+ "km" => "Khmer",
53
+ "ko" => "Korean",
54
+ "ku" => "Kurdish (Kurmanji)",
55
+ "ky" => "Kyrgyz",
56
+ "lo" => "Lao",
57
+ "la" => "Latin",
58
+ "lv" => "Latvian",
59
+ "lt" => "Lithuanian",
60
+ "lb" => "Luxembourgish",
61
+ "mk" => "Macedonian",
62
+ "mg" => "Malagasy",
63
+ "ms" => "Malay",
64
+ "ml" => "Malayalam",
65
+ "mt" => "Maltese",
66
+ "mi" => "Maori",
67
+ "mr" => "Marathi",
68
+ "mn" => "Mongolian",
69
+ "my" => "Myanmar (Burmese)",
70
+ "ne" => "Nepali",
71
+ "no" => "Norwegian",
72
+ "ps" => "Pashto",
73
+ "fa" => "Persian",
74
+ "pl" => "Polish",
75
+ "pt" => "Portuguese",
76
+ "pa" => "Punjabi",
77
+ "ro" => "Romanian",
78
+ "ru" => "Russian",
79
+ "sm" => "Samoan",
80
+ "gd" => "Scots Gaelic",
81
+ "sr" => "Serbian",
82
+ "st" => "Sesotho",
83
+ "sn" => "Shona",
84
+ "sd" => "Sindhi",
85
+ "si" => "Sinhala",
86
+ "sk" => "Slovak",
87
+ "sl" => "Slovenian",
88
+ "so" => "Somali",
89
+ "es" => "Spanish",
90
+ "su" => "Sundanese",
91
+ "sw" => "Swahili",
92
+ "sv" => "Swedish",
93
+ "tg" => "Tajik",
94
+ "ta" => "Tamil",
95
+ "te" => "Telugu",
96
+ "th" => "Thai",
97
+ "tr" => "Turkish",
98
+ "uk" => "Ukrainian",
99
+ "ur" => "Urdu",
100
+ "uz" => "Uzbek",
101
+ "vi" => "Vietnamese",
102
+ "cy" => "Welsh",
103
+ "xh" => "Xhosa",
104
+ "yi" => "Yiddish",
105
+ "yo" => "Yoruba",
106
+ "zu" => "Zulu"
107
+ }.freeze
108
+
109
+ class << self
110
+ def code(string)
111
+ TABLE.invert[string]
112
+ end
113
+
114
+ def ensure_code(string)
115
+ fail("Invalid language: [#{string}]") unless valid?(string)
116
+ code(string) || string
117
+ end
118
+
119
+ def valid?(lang_code)
120
+ code_valid?(lang_code) || string_valid?(lang_code)
121
+ end
122
+
123
+ def list
124
+ TABLE.values
125
+ end
126
+
127
+ def code_valid?(lang_code)
128
+ !TABLE.fetch(lang_code, nil).nil?
129
+ end
130
+
131
+ def string_valid?(string)
132
+ !code(string).nil?
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,115 @@
1
+ require 'trollop'
2
+ require 'colored'
3
+ require 'fileutils'
4
+ require 'midwire_common/string'
5
+
6
+ require 'pry'
7
+
8
+ module Tr4n5l4te
9
+ class Runner
10
+ attr_accessor :logger, :options, :count
11
+
12
+ def self.instance
13
+ @instance ||= new
14
+ end
15
+
16
+ def initialize
17
+ @options = collect_args
18
+ validate_args
19
+ end
20
+
21
+ def run
22
+ start_time = Time.now
23
+ log_identifier(start_time)
24
+ @count = 0
25
+
26
+ hash = YAML.load_file(options[:yaml_file])
27
+ translated = process(hash)
28
+ store_translation(translated)
29
+
30
+ puts("Processed #{@count} strings in [#{Time.now - start_time}] seconds.".yellow)
31
+ end
32
+
33
+ private
34
+
35
+ def process(hash)
36
+ hash.each_with_object({}) do |pair, h|
37
+ key, value = pair
38
+ h[key] = value.is_a?(Hash) ? process(value) : translate(value)
39
+ h
40
+ end
41
+ end
42
+
43
+ def translate(string)
44
+ @count += 1
45
+ puts("[#{string}]")
46
+ translator.translate(string, from_lang, options[:lang])
47
+ end
48
+
49
+ def translator
50
+ @translator ||= Translator.new(sleep_time: options[:sleep_time])
51
+ end
52
+
53
+ def from_lang
54
+ File.basename(options[:yaml_file], '.yml')
55
+ end
56
+
57
+ def store_translation(translated)
58
+ data = YAML.dump(translated)
59
+ dir = File.dirname(options[:yaml_file])
60
+ File.open(File.join(dir, "#{options[:lang]}.yml"), 'w') { |f| f.write(data) }
61
+ end
62
+
63
+ # rubocop:disable Metrics/MethodLength
64
+ def collect_args
65
+ Trollop.options do
66
+ opt(
67
+ :yaml_file,
68
+ "A YAML locale file - filename determines source language 'en.yml' - English",
69
+ type: :string, required: false, short: 'y')
70
+ opt(
71
+ :lang,
72
+ 'Destination language',
73
+ type: :string, required: false, short: 'l')
74
+ opt(
75
+ :list,
76
+ 'List known languages',
77
+ type: :boolean, required: false, short: 't')
78
+ opt(
79
+ :sleep_time,
80
+ 'Sleep time',
81
+ type: :integer, default: 2, short: 's')
82
+ opt(
83
+ :verbose,
84
+ 'Be verbose with output',
85
+ type: :boolean, required: false, short: 'v', default: false)
86
+ end
87
+ end
88
+ # rubocop:enable Metrics/MethodLength
89
+
90
+ # rubocop:disable Metrics/AbcSize
91
+ def validate_args
92
+ if options[:list]
93
+ puts('Valid languages:'.yellow + "\n\n")
94
+ puts(Language.list.join(', ').yellow + "\n\n")
95
+ exit
96
+ end
97
+ if !options[:lang_given] || !Language.valid?(options[:lang])
98
+ puts('Valid languages:'.red + "\n\n")
99
+ puts(Language.list.join(', ').yellow + "\n\n")
100
+ Trollop.die(:lang, "'#{options[:lang]}' language unknown".red)
101
+ end
102
+ if !options[:yaml_file_given] || !File.exist?(options[:yaml_file])
103
+ puts('A YAML file is required:'.red + "\n\n")
104
+ Trollop.die(:yaml_file, "'#{options[:yaml_file]}' not found".red)
105
+ end
106
+ options[:lang] = Language.ensure_code(options[:lang])
107
+ end
108
+ # rubocop:enable Metrics/AbcSize
109
+
110
+ def log_identifier(start_time)
111
+ timestr = start_time.strftime('%H:%M:%S.%3N')
112
+ puts("Starting Tr4n5l4te v#{Tr4n5l4te::VERSION} @#{timestr}".green)
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,45 @@
1
+ require 'open-uri'
2
+
3
+ module Tr4n5l4te
4
+ class Translator
5
+ START_PAGE = 'https://translate.google.com/'.freeze
6
+
7
+ attr_reader :sleep_time, :agent
8
+
9
+ def initialize(args = {})
10
+ @sleep_time = args.fetch(:sleep_time, 2)
11
+ @agent = Agent.new
12
+ load_cookies
13
+ agent.visit(START_PAGE)
14
+ sleep_default
15
+ store_cookies
16
+ end
17
+
18
+ def translate(text, from_lang, to_lang)
19
+ encoded_text = URI.encode(text)
20
+ url = "https://translate.google.com/##{from_lang}/#{to_lang}/#{encoded_text}"
21
+ agent.visit(url)
22
+ sleep_default
23
+ result_box = browser.find('#result_box')
24
+ result_box.text
25
+ end
26
+
27
+ private
28
+
29
+ def store_cookies
30
+ agent.store_cookies(Tr4n5l4te.cookie_file)
31
+ end
32
+
33
+ def load_cookies
34
+ agent.load_cookies(Tr4n5l4te.cookie_file)
35
+ end
36
+
37
+ def sleep_default
38
+ sleep(sleep_time)
39
+ end
40
+
41
+ def browser
42
+ agent.browser
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,3 @@
1
+ module Tr4n5l4te
2
+ VERSION = '0.1.0'
3
+ end
data/lib/tr4n5l4te.rb ADDED
@@ -0,0 +1,48 @@
1
+ require 'tr4n5l4te/version'
2
+
3
+ require 'midwire_common/string'
4
+ require 'midwire_common/yaml_setting'
5
+ require 'midwire_common/hash'
6
+
7
+ module Tr4n5l4te
8
+ class << self
9
+ def root
10
+ Pathname.new(File.dirname(__FILE__)).parent
11
+ end
12
+
13
+ def string_id
14
+ to_s.snakerize
15
+ end
16
+
17
+ def default_config_directory
18
+ ".#{string_id}"
19
+ end
20
+
21
+ def default_cookie_filename
22
+ 'cookies.yml'
23
+ end
24
+
25
+ def home_directory
26
+ ENV.fetch('HOME')
27
+ end
28
+
29
+ # If you don't have a HOME directory defined, you are on an OS that is
30
+ # retarded, and this call will fail.
31
+ def cookie_file
32
+ dir = File.join(home_directory, default_config_directory)
33
+ module_string = string_id.upcase
34
+ file = ENV.fetch(
35
+ "#{module_string}_COOKIES",
36
+ File.join(dir, default_cookie_filename)
37
+ )
38
+ FileUtils.mkdir_p(dir)
39
+ FileUtils.touch(file)
40
+ file
41
+ end
42
+ end
43
+
44
+ autoload :Agent, 'tr4n5l4te/agent'
45
+ autoload :Language, 'tr4n5l4te/language'
46
+ autoload :Runner, 'tr4n5l4te/runner'
47
+ autoload :Translator, 'tr4n5l4te/translator'
48
+ end
data/tr4n5l4te.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'tr4n5l4te/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'tr4n5l4te'
8
+ spec.version = Tr4n5l4te::VERSION
9
+ spec.authors = ['Chris Blackburn']
10
+ spec.email = ['87a1779b@opayq.com']
11
+
12
+ spec.summary = 'Use Google Translate without an API key.'
13
+ spec.description = spec.summary
14
+ spec.homepage = 'https://github.com/midwire/tr4n5l4te'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec)/}) }
18
+ spec.bindir = 'exe'
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.add_development_dependency 'bundler', '~> 1.11'
23
+ spec.add_development_dependency 'rake', '~> 10.0'
24
+ spec.add_development_dependency 'rspec', '~> 3.0'
25
+ spec.add_development_dependency 'simplecov', '~> 0.11'
26
+ spec.add_development_dependency 'pry-nav'
27
+
28
+ spec.add_dependency 'midwire_common', '~> 0.1'
29
+ spec.add_dependency 'capybara', '~> 2.6'
30
+ spec.add_dependency 'poltergeist', '~> 1.9'
31
+ spec.add_dependency 'trollop', '~> 2.1'
32
+ spec.add_dependency 'colored', '~> 1'
33
+ end
metadata ADDED
@@ -0,0 +1,203 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tr4n5l4te
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Chris Blackburn
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-03-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.11'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.11'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry-nav
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
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: midwire_common
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.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.1'
97
+ - !ruby/object:Gem::Dependency
98
+ name: capybara
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.6'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.6'
111
+ - !ruby/object:Gem::Dependency
112
+ name: poltergeist
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.9'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.9'
125
+ - !ruby/object:Gem::Dependency
126
+ name: trollop
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '2.1'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '2.1'
139
+ - !ruby/object:Gem::Dependency
140
+ name: colored
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '1'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1'
153
+ description: Use Google Translate without an API key.
154
+ email:
155
+ - 87a1779b@opayq.com
156
+ executables:
157
+ - translate
158
+ extensions: []
159
+ extra_rdoc_files: []
160
+ files:
161
+ - ".gitignore"
162
+ - ".rspec"
163
+ - ".travis.yml"
164
+ - CHANGELOG
165
+ - Gemfile
166
+ - LICENSE.txt
167
+ - README.md
168
+ - Rakefile
169
+ - bin/console
170
+ - bin/setup
171
+ - exe/translate
172
+ - lib/tr4n5l4te.rb
173
+ - lib/tr4n5l4te/agent.rb
174
+ - lib/tr4n5l4te/language.rb
175
+ - lib/tr4n5l4te/runner.rb
176
+ - lib/tr4n5l4te/translator.rb
177
+ - lib/tr4n5l4te/version.rb
178
+ - tr4n5l4te.gemspec
179
+ homepage: https://github.com/midwire/tr4n5l4te
180
+ licenses:
181
+ - MIT
182
+ metadata: {}
183
+ post_install_message:
184
+ rdoc_options: []
185
+ require_paths:
186
+ - lib
187
+ required_ruby_version: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - ">="
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ required_rubygems_version: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - ">="
195
+ - !ruby/object:Gem::Version
196
+ version: '0'
197
+ requirements: []
198
+ rubyforge_project:
199
+ rubygems_version: 2.4.5.1
200
+ signing_key:
201
+ specification_version: 4
202
+ summary: Use Google Translate without an API key.
203
+ test_files: []