togglate 0.0.4 → 0.1.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
  SHA1:
3
- metadata.gz: d573daf3d95b1c968fffaa6e2f82ef0fd93cefa7
4
- data.tar.gz: 61addd322ccd6d0596eba3a02cedd430ee14c6b4
3
+ metadata.gz: f0bd54100b950a27e6a14dc0726059bb3c685b73
4
+ data.tar.gz: 31260ffc060f2eacef3e0c50d109c09f1aca348e
5
5
  SHA512:
6
- metadata.gz: 9281cc535ab9cdc9e9401a24d29aaa85db22c9286a775d33d085b7b9595696805dd603e4708b6641c32042aac8f68c48bcce46df2b4d828c5f2217a3924f2f66
7
- data.tar.gz: b1a3aa396ba32ba7b4b50885da5938e6d0141666faaf4d87f40fc5320641935db2334c33e3a8560f2da61e6e4b3bc3f05651a6cfa763c77cd542da7db662a487
6
+ metadata.gz: a0b5fc69dd995054151e8facb47833b3cf1c2c61b3243287810cf8d61cecd3b7a25db9e84861178415dc261f6c43ae842a30c1c03ba945f90ea972e47224c277
7
+ data.tar.gz: 53bb9896d923f5fb8a325fbd76e59a325a763bbadacb5b5254771129d004d6dd77e6db3ea8585c68a410ad5db272fa36134060dc83bb4e995ee4b73604bd91ec
@@ -1,11 +1,18 @@
1
+ require "timeout"
2
+
1
3
  class Togglate::BlockWrapper
2
4
  def initialize(text,
3
- wrapper:%W([translation\ here]\n\n<!--original -->),
5
+ wrapper:%w(<!--original -->),
6
+ pretext:"[translation here]",
4
7
  wrap_exceptions:[],
5
8
  **opts)
6
9
  @text = text
7
10
  @wrapper = wrapper
11
+ @pretext = pretext
8
12
  @wrap_exceptions = wrap_exceptions
13
+ @translate = set_translate_opt(opts[:translate])
14
+ @timeout = opts.fetch(:timeout, 3)
15
+ @email = opts[:email]
9
16
  end
10
17
 
11
18
  def run
@@ -22,12 +29,55 @@ class Togglate::BlockWrapper
22
29
  end
23
30
 
24
31
  def wrap_with(chunks)
25
- chunks.inject([]) do |m, (is_space, lines)|
32
+ wrap_lines = chunks.inject([]) do |m, (is_space, lines)|
26
33
  if is_space || @wrap_exceptions.any? { |ex| lines[0].match ex }
27
34
  m.push *lines
28
35
  else
29
- m.push @wrapper[0], "\n", *lines, @wrapper[1], "\n"
36
+ if @translate
37
+ hash_value = lines.join.hash
38
+ sentences_to_translate[hash_value] = lines.join
39
+ m.push hash_value
40
+ else
41
+ m.push @pretext
42
+ end
43
+ m.push "\n\n", @wrapper[0], "\n", *lines, @wrapper[1], "\n"
44
+ end
45
+ end
46
+ @translate ? hash_to_translation(wrap_lines).join : wrap_lines.join
47
+ end
48
+
49
+ def set_translate_opt(opt)
50
+ case opt
51
+ when Hash, FalseClass, NilClass
52
+ opt
53
+ when TrueClass
54
+ {to: :ja}
55
+ else
56
+ raise ArgumentError
57
+ end
58
+ end
59
+
60
+ def sentences_to_translate
61
+ @sentences_to_translate ||= {}
62
+ end
63
+
64
+ def hash_to_translation(lines)
65
+ translates = request_translation
66
+ lines.map { |line| translates[line] || line }
67
+ end
68
+
69
+ using CoreExt
70
+
71
+ def request_translation
72
+ Mymemory.config.email = @email if @email
73
+ res = {}
74
+ sentences_to_translate.thread_with do |k, text|
75
+ begin
76
+ timeout(@timeout) { res[k] = ::Mymemory.translate(text, @translate) }
77
+ rescue Timeout::Error
78
+ res[k] = @pretext
30
79
  end
31
- end.join
80
+ end
81
+ res
32
82
  end
33
83
  end
data/lib/togglate/cli.rb CHANGED
@@ -7,9 +7,12 @@ module Togglate
7
7
  option :embed_code, aliases:'-e', default:true, type: :boolean, desc:"Enable code embeding to false"
8
8
  option :toggle_link_text, type: :array, default:["*", "hide"]
9
9
  option :code_block, aliases:'-c', default:false, type: :boolean, desc:"Enable code blocks not to be wrapped"
10
+ option :translate, aliases:'-t', type: :hash, default:{}, desc:"Embed machine translated text. ex.-t=to:ja"
11
+ option :email, desc:"Passing a valid email extends a limit of Mymemory anonymous usage from 100 to 1000 requests/day"
10
12
  def create(file)
11
13
  opts = symbolize_keys(options)
12
14
  opts.update(wrap_exceptions:[/^```/, /^ {4}/]) if opts[:code_block]
15
+ opts.update(translate:nil) if opts[:translate].empty?
13
16
  puts Togglate.create(file, opts)
14
17
  end
15
18
 
@@ -35,7 +38,14 @@ module Togglate
35
38
 
36
39
  no_tasks do
37
40
  def symbolize_keys(options)
38
- options.inject({}) { |h, (k,v)| h[k.intern] = v; h }
41
+ options.inject({}) do |h, (k,v)|
42
+ h[k.intern] =
43
+ case v
44
+ when Hash then symbolize_keys(v)
45
+ else v
46
+ end
47
+ h
48
+ end
39
49
  end
40
50
  end
41
51
  end
@@ -0,0 +1,13 @@
1
+ module CoreExt
2
+ refine Hash do
3
+ def thread_with
4
+ mem = []
5
+ map do |*item|
6
+ Thread.new(*item) do |*_item|
7
+ mem << yield(*_item)
8
+ end
9
+ end.each(&:join)
10
+ mem
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module Togglate
2
- VERSION = "0.0.4"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/togglate.rb CHANGED
@@ -1,4 +1,7 @@
1
+ require "mymemory"
2
+
1
3
  require "togglate/version"
4
+ require "togglate/core_ext"
2
5
  require "togglate/block_wrapper"
3
6
  require "togglate/cli"
4
7
 
@@ -1,6 +1,6 @@
1
1
  # Title
2
2
 
3
- Title is a tool.
3
+ Programming is fun.
4
4
 
5
5
  % ruby title.rb
6
6
 
@@ -0,0 +1 @@
1
+ {"responseData":{"translatedText":"プログラミングは楽しいです。"},"responseDetails":"", "responseStatus":200, "responderId":"234", "matches":[{"id":"0", "segment":"Programming is fun.", "translation":"プログラミングは楽しいです。", "quality":"70", "reference":"Machine Translation provided by Google, Microsoft, Worldlingo or MyMemory customized engine.", "usage-count":1, "subject":"All", "created-by":"MT!", "last-updated-by":"MT!", "create-date":"2014-02-23", "last-update-date":"2014-02-23", "match":0.85}, {"id":"427501654", "segment":"Programming", "translation":"プログラミング", "quality":"80", "reference":"\/\/ja.wikipedia.org\/wiki\/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0", "usage-count":6, "subject":"All", "created-by":"Wikipedia", "last-updated-by":"Wikipedia", "create-date":"2013-08-24 08:51:26", "last-update-date":"2013-08-24 08:51:26", "match":0.66}, {"id":"427408903", "segment":"Programming", "translation":"打ち込み", "quality":"80", "reference":"\/\/en.wikipedia.org\/wiki\/Programming_(music)", "usage-count":3, "subject":"All", "created-by":"", "last-updated-by":"Wikipedia", "create-date":"2012-08-19 22:36:30", "last-update-date":"2012-08-19 22:36:30", "match":0.65}]}
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
2
  require 'togglate'
3
3
  require "stringio"
4
+ require "fakeweb"
4
5
 
5
6
  class String
6
7
  def ~
@@ -17,4 +18,9 @@ end
17
18
 
18
19
  RSpec.configure do |c|
19
20
  c.include Helpers
21
+ c.before do
22
+ FakeWeb.clean_registry
23
+ body = File.read(File.join(source_root, 'translated_text.json'))
24
+ FakeWeb.register_uri(:get, %r(http://mymemory\.translated\.net), body:body)
25
+ end
20
26
  end
@@ -60,6 +60,13 @@ describe Togglate::CLI do
60
60
  expect($stdout.string).to match(/<script.*showme.*<\/script>/m)
61
61
  end
62
62
  end
63
+
64
+ context "translate option with Mymemory API" do
65
+ it "embeds translated text as its pretext" do
66
+ Togglate::CLI.start(['create', 'README.md', '--translate', 'to:ja'])
67
+ expect($stdout.string).to match(/プログラミングは楽しい/)
68
+ end
69
+ end
63
70
  end
64
71
 
65
72
  describe "#append_code" do
@@ -7,10 +7,13 @@ describe Togglate do
7
7
  end
8
8
 
9
9
  describe Togglate::BlockWrapper do
10
+ before do
11
+ @text = "#title\n\n\ntext\n"
12
+ end
13
+
10
14
  describe "#chunk_by_space" do
11
15
  it "returns chunked array" do
12
- text = "#title\n\n\ntext\n"
13
- wrapper = Togglate::BlockWrapper.new(text)
16
+ wrapper = Togglate::BlockWrapper.new(@text)
14
17
  exp = [[false, ["#title\n"]],
15
18
  [true, ["\n", "\n"]],
16
19
  [false, ["text\n"]]]
@@ -20,11 +23,46 @@ describe Togglate::BlockWrapper do
20
23
 
21
24
  describe "#wrap_with" do
22
25
  it "returns wrapped text" do
23
- text = "#title\n\n\ntext\n"
24
- wrapper = Togglate::BlockWrapper.new(text)
26
+ wrapper = Togglate::BlockWrapper.new(@text)
25
27
  chunks = wrapper.send(:chunk_by_space)
26
28
  exp = "[translation here]\n\n<!--original\n#title\n-->\n\n\n[translation here]\n\n<!--original\ntext\n-->\n"
27
29
  expect(wrapper.send(:wrap_with, chunks)).to eq exp
28
30
  end
31
+
32
+ context "optional pre-text" do
33
+ it "returns wrapped text with a custom text" do
34
+ wrapper = Togglate::BlockWrapper.new(@text, pretext:"-- translation --")
35
+ chunks = wrapper.send(:chunk_by_space)
36
+ exp = "-- translation --\n\n<!--original\n"
37
+ expect(wrapper.send(:wrap_with, chunks)).to match(exp)
38
+ end
39
+ end
40
+ end
41
+
42
+ describe "Embed results of MyMemory translation service" do
43
+ describe ".new with translate option" do
44
+ it "sets en-ja option when passed true" do
45
+ wrapper = Togglate::BlockWrapper.new('I need you.', translate:true)
46
+ opt = {to: :ja}
47
+ expect(wrapper.instance_variable_get('@translate')).to eq opt
48
+ end
49
+
50
+ it "sets passed options" do
51
+ opt = {from: :en, to: :it, email:true}
52
+ wrapper = Togglate::BlockWrapper.new('I need you.', translate:opt)
53
+ expect(wrapper.instance_variable_get('@translate')).to eq opt
54
+ end
55
+ end
56
+
57
+ describe "#wrap_with" do
58
+ it "sets translated sentences to pretext" do
59
+ text = "#Title\n\nProgramming is fun.\n"
60
+ opt = {from: :en, to: :ja}
61
+ wrapper = Togglate::BlockWrapper.new(text, translate:opt)
62
+ chunks = wrapper.send(:chunk_by_space)
63
+ exp = /プログラミングは楽しいです.*<!--original/m
64
+ expect(wrapper.send(:wrap_with, chunks)).to match(exp)
65
+ end
66
+ end
29
67
  end
30
68
  end
data/togglate.gemspec CHANGED
@@ -16,9 +16,12 @@ Gem::Specification.new do |spec|
16
16
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
+ spec.required_ruby_version = '>=2.1.0'
19
20
 
20
21
  spec.add_dependency "thor"
22
+ spec.add_dependency "mymemory"
21
23
  spec.add_development_dependency "bundler", "~> 1.5"
22
24
  spec.add_development_dependency "rake"
23
25
  spec.add_development_dependency "rspec"
26
+ spec.add_development_dependency "fakeweb"
24
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: togglate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kyoendo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-21 00:00:00.000000000 Z
11
+ date: 2014-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mymemory
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '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'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +80,20 @@ dependencies:
66
80
  - - ">="
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: fakeweb
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
69
97
  description:
70
98
  email:
71
99
  - postagie@gmail.com
@@ -85,8 +113,10 @@ files:
85
113
  - lib/togglate.rb
86
114
  - lib/togglate/block_wrapper.rb
87
115
  - lib/togglate/cli.rb
116
+ - lib/togglate/core_ext.rb
88
117
  - lib/togglate/version.rb
89
118
  - spec/fixtures/README.md
119
+ - spec/fixtures/translated_text.json
90
120
  - spec/spec_helper.rb
91
121
  - spec/togglate_cli_spec.rb
92
122
  - spec/togglate_spec.rb
@@ -103,7 +133,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
103
133
  requirements:
104
134
  - - ">="
105
135
  - !ruby/object:Gem::Version
106
- version: '0'
136
+ version: 2.1.0
107
137
  required_rubygems_version: !ruby/object:Gem::Requirement
108
138
  requirements:
109
139
  - - ">="
@@ -117,6 +147,7 @@ specification_version: 4
117
147
  summary: Create base text for translation, in which original is togglable
118
148
  test_files:
119
149
  - spec/fixtures/README.md
150
+ - spec/fixtures/translated_text.json
120
151
  - spec/spec_helper.rb
121
152
  - spec/togglate_cli_spec.rb
122
153
  - spec/togglate_spec.rb