logaling-command 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,7 +4,7 @@ require 'thor'
4
4
  require "logaling/glossary"
5
5
 
6
6
  class Logaling::Command < Thor
7
- VERSION = "0.0.5"
7
+ VERSION = "0.0.6"
8
8
  LOGALING_CONFIG = '.logaling'
9
9
 
10
10
  map '-a' => :add,
@@ -13,12 +13,13 @@ class Logaling::Command < Thor
13
13
  '-l' => :lookup,
14
14
  '-n' => :new,
15
15
  '-r' => :register,
16
- '-U' => :unregister
16
+ '-U' => :unregister,
17
+ '-v' => :version
17
18
 
18
19
  class_option "glossary", type: :string, aliases: "-g"
19
20
  class_option "source-language", type: :string, aliases: "-S"
20
21
  class_option "target-language", type: :string, aliases: "-T"
21
- class_option "logaling-home", type: :string, required: false, aliases: "-h"
22
+ class_option "logaling-home", type: :string, aliases: "-h"
22
23
 
23
24
  desc 'new [PROJECT NAME] [SOURCE LANGUAGE] [TARGET LANGUAGE(optional)]', 'Create .logaling'
24
25
  method_option "no-register", type: :boolean, default: false
@@ -77,9 +78,10 @@ class Logaling::Command < Thor
77
78
  say e.message
78
79
  end
79
80
 
80
- desc 'delete [SOURCE TERM] [TARGET TERM]', 'Delete term.'
81
- def delete(source_term, target_term)
82
- glossary.delete(source_term, target_term)
81
+ desc 'delete [SOURCE TERM] [TARGET TERM(optional)] [--force(optional)]', 'Delete term.'
82
+ method_option "force", type: :boolean, default: false
83
+ def delete(source_term, target_term='')
84
+ glossary.delete(source_term, target_term, options["force"])
83
85
  rescue Logaling::CommandFailed, Logaling::TermError => e
84
86
  say e.message
85
87
  rescue Logaling::GlossaryNotFound => e
@@ -100,13 +102,13 @@ class Logaling::Command < Thor
100
102
  glossary.index
101
103
  terms = glossary.lookup(source_term)
102
104
 
103
- puts "\nlookup word : #{source_term}"
104
105
  unless terms.empty?
106
+ is_glossary_name_print = terms.map{|t| t[:name]}.uniq.size > 1 ? true : false
105
107
  terms.each do |term|
106
- puts "\n #{term[:source_term]}\n"
107
- puts " #{term[:target_term]}\n"
108
- puts " note:#{term[:note]}"
109
- puts " glossary:#{term[:name]}"
108
+ str_term = "#{term[:source_term]} : #{term[:target_term]}"
109
+ str_term << " # #{term[:note]}" unless term[:note].empty?
110
+ puts str_term
111
+ puts "(#{term[:name]})" if is_glossary_name_print
110
112
  end
111
113
  else
112
114
  "source-term <#{source_term}> not found"
@@ -115,6 +117,11 @@ class Logaling::Command < Thor
115
117
  say e.message
116
118
  end
117
119
 
120
+ desc 'version', 'Show version.'
121
+ def version
122
+ say "logaling-command version #{Logaling::Command::VERSION}"
123
+ end
124
+
118
125
  private
119
126
  def glossary
120
127
  config = load_config
@@ -21,24 +21,23 @@ module Logaling
21
21
  def add(source_term, target_term, note)
22
22
  FileUtils.touch(@path) unless File.exists?(@path)
23
23
 
24
- if bilingual_pair_exists?(source_term, target_term)
24
+ glossary = load_glossary(@path)
25
+ if bilingual_pair_exists?(glossary, source_term, target_term)
25
26
  raise TermError, "term '#{source_term}: #{target_term}' already exists in '#{@glossary}'"
26
27
  end
27
28
 
28
- glossary = load_glossary_yml(@path)
29
29
  glossary << build_term(source_term, target_term, note)
30
-
31
30
  dump_glossary(glossary)
32
31
  end
33
32
 
34
33
  def update(source_term, target_term, new_target_term, note)
35
34
  raise GlossaryNotFound unless File.exists?(@path)
36
35
 
37
- if bilingual_pair_exists?(source_term, new_target_term)
36
+ glossary = load_glossary(@path)
37
+ if bilingual_pair_exists?(glossary, source_term, new_target_term)
38
38
  raise TermError, "term '#{source_term}: #{target_term}' already exists in '#{@glossary}'"
39
39
  end
40
40
 
41
- glossary = load_glossary_yml(@path)
42
41
  target_index = find_term_index(glossary, source_term, target_term)
43
42
  if target_index
44
43
  glossary[target_index] = rebuild_term(glossary[target_index], source_term, new_target_term, note)
@@ -48,16 +47,29 @@ module Logaling
48
47
  end
49
48
  end
50
49
 
51
- def delete(source_term, target_term)
50
+ def delete(source_term, target_term='', force=false)
52
51
  raise GlossaryNotFound unless File.exists?(@path)
53
52
 
54
- glossary = load_glossary_yml(@path)
55
- target_index = find_term_index(glossary, source_term, target_term)
56
- if target_index
53
+ glossary = load_glossary(@path)
54
+ target_num = find_term_num(glossary, source_term)
55
+ if target_num == 0
56
+ raise TermError, "Can't found term '#{source_term} #{target_term}' in '#{@glossary}'"
57
+ elsif !target_term.empty? || target_num == 1
58
+ target_index = find_term_index(glossary, source_term, target_term)
59
+ raise TermError, "Can't found term '#{source_term} #{target_term}' in '#{@glossary}'" unless target_index
57
60
  glossary.delete_at(target_index)
58
61
  dump_glossary(glossary)
59
62
  else
60
- raise TermError, "Can't found term '#{source_term}: #{target_term}' in '#{@glossary}'"
63
+ if force
64
+ while target_index = find_term_index(glossary, source_term) do
65
+ glossary.delete_at(target_index)
66
+ dump_glossary(glossary)
67
+ end
68
+ else
69
+ raise TermError, "There are duplicate terms in glossary.\n" +
70
+ "If you really want to delete, please put `loga delete [SOURCE_TERM] --force`\n" +
71
+ " or `loga delete [SOURCE_TERM] [TARGET_TERM]`"
72
+ end
61
73
  end
62
74
  end
63
75
 
@@ -146,20 +158,27 @@ module Logaling
146
158
  build_term(source_term, target_term, note)
147
159
  end
148
160
 
149
- def find_term_index(glossary_yml, source_term, target_term)
150
- glossary_yml.find_index do |term|
151
- term['source_term'] == source_term && term['target_term'] == target_term
161
+ def find_term_index(glossary, source_term, target_term='')
162
+ glossary.find_index do |term|
163
+ if target_term.empty?
164
+ term['source_term'] == source_term
165
+ else
166
+ term['source_term'] == source_term && term['target_term'] == target_term
167
+ end
152
168
  end
153
169
  end
154
170
 
155
- def bilingual_pair_exists?(source_term, target_term)
156
- target_terms(source_term).any?{|data| data['target_term'] == target_term }
171
+ def find_term_num(glossary, source_term)
172
+ glossary.select{|term| term["source_term"] == source_term}.size
173
+ end
174
+
175
+ def bilingual_pair_exists?(glossary, source_term, target_term)
176
+ target_terms(glossary, source_term).any?{|data| data['target_term'] == target_term }
157
177
  end
158
178
 
159
- def target_terms(source_term, path=@path)
179
+ def target_terms(glossary, source_term)
160
180
  target_terms = []
161
- glossaly = YAML::load_file(path) || []
162
- glossaly.each do |term|
181
+ glossary.each do |term|
163
182
  target_terms << term if term['source_term'] == source_term
164
183
  end
165
184
  target_terms
@@ -69,7 +69,7 @@ module Logaling
69
69
  :target_language => term.target_language,
70
70
  :source_term => term.source_term,
71
71
  :target_term => term.target_term,
72
- :note => term.note,}
72
+ :note => term.note || ''}
73
73
  end
74
74
  end
75
75
 
@@ -232,7 +232,72 @@ describe Logaling::Command do
232
232
  end
233
233
 
234
234
  it 'succeed at find by term without command.index' do
235
- @stdout.should be_include "glossary:spec"
235
+ @stdout.should include "spec : スペック # 備考"
236
+ @stdout.should_not include "(spec)"
237
+ end
238
+ end
239
+ end
240
+
241
+ describe "#delete" do
242
+ before do
243
+ command.new('spec', 'en', 'ja')
244
+ command.add('spec', 'スペック', '備考')
245
+ command.add('user', 'ユーザ', '備考')
246
+ command.add('test', 'てすと1', '備考')
247
+ command.add('test', 'てすと2', '備考')
248
+ end
249
+
250
+ context 'with arguments exist term' do
251
+ before do
252
+ command.delete('spec', 'スペック')
253
+ @stdout = capture(:stdout) {command.lookup("spec")}
254
+ end
255
+
256
+ it 'should delete the term' do
257
+ @stdout.should_not include "spec : スペック # 備考"
258
+ end
259
+ end
260
+
261
+ context 'without target_term' do
262
+ context 'only 1 bilingual pair exist' do
263
+ before do
264
+ command.delete('user')
265
+ @stdout = capture(:stdout) {command.lookup("user")}
266
+ end
267
+
268
+ it 'should delete the term' do
269
+ @stdout.should_not include "user : ユーザ # 備考"
270
+ end
271
+ end
272
+
273
+ context 'some bilingual pair exist' do
274
+ context "called without '--force=true'" do
275
+ before do
276
+ @stdout = capture(:stdout) {command.delete('test')}
277
+ end
278
+
279
+ it "should print usage" do
280
+ @stdout.should == "There are duplicate terms in glossary.\n" +
281
+ "If you really want to delete, please put `loga delete [SOURCE_TERM] --force`\n" +
282
+ " or `loga delete [SOURCE_TERM] [TARGET_TERM]`\n"
283
+ end
284
+ end
285
+
286
+ context "and called with '--force=true'" do
287
+ before do
288
+ command.options = base_options.merge("force" => true)
289
+ command.new('spec', 'en', 'ja')
290
+ command.add('term', '用語1', '備考')
291
+ command.add('term', '用語2', '備考')
292
+ command.delete("term")
293
+ @stdout = capture(:stdout) {command.lookup("term")}
294
+ end
295
+
296
+ it 'should delete bilingual pairs' do
297
+ @stdout.should_not include "term : 用語1 # 備考"
298
+ @stdout.should_not include "term : 用語2 # 備考"
299
+ end
300
+ end
236
301
  end
237
302
  end
238
303
  end
@@ -74,14 +74,79 @@ module Logaling
74
74
  end
75
75
 
76
76
  describe '#delete' do
77
- before do
78
- glossary.add("user", "ユーザ", "ユーザーではない")
77
+ context 'given target_term' do
78
+ context 'bilingual pair exists' do
79
+ before do
80
+ glossary.add("delete", "てすと1", "備考")
81
+ glossary.add("delete", "てすと2", "備考")
82
+ glossary.delete("delete", "てすと1")
83
+ glossary.index
84
+ @result = glossary.lookup("delete")
85
+ end
86
+
87
+ it 'should delete the bilingual pair' do
88
+ @result.should include({:name=>"spec", :source_language=>"en", :target_language=>"ja", :source_term=>"delete", :target_term=>"てすと2", :note=>"備考"})
89
+ @result.should_not include({:name=>"spec", :source_language=>"en", :target_language=>"ja", :source_term=>"delete", :target_term=>"てすと1", :note=>"備考"})
90
+ end
91
+ end
92
+
93
+ context 'bilingual pair does not exist' do
94
+ before do
95
+ glossary.add("user", "ユーザ", "ユーザーではない")
96
+ end
97
+
98
+ it {
99
+ -> { glossary.delete("user", "ユーザー") }.should raise_error(Logaling::TermError)
100
+ }
101
+ end
79
102
  end
80
103
 
81
- context 'with arguments show not existing bilingual pair' do
82
- it {
83
- -> { glossary.delete("user", "ユーザー") }.should raise_error(Logaling::TermError)
84
- }
104
+ context 'not given target_term' do
105
+ context 'source_term not found' do
106
+ before do
107
+ glossary.add("user", "ユーザ", "備考")
108
+ end
109
+
110
+ it {
111
+ -> { glossary.delete("usr") }.should raise_error(Logaling::TermError)
112
+ }
113
+ end
114
+
115
+ context 'source_term found' do
116
+ context 'there is only 1 bilingual pair' do
117
+ before do
118
+ glossary.add("user", "ユーザ", "備考")
119
+ glossary.delete("user")
120
+ glossary.index
121
+ @result = glossary.lookup("user")
122
+ end
123
+
124
+ it 'should delete the term' do
125
+ @result.should_not include({:name=>"spec", :source_language=>"en", :target_language=>"ja", :source_term=>"user", :target_term=>"ユーザ", :note=>"備考"})
126
+ end
127
+ end
128
+
129
+ context 'there are more than 1 bilingual pair' do
130
+ before do
131
+ glossary.add("user", "ユーザ1", "備考")
132
+ glossary.add("user", "ユーザ2", "備考")
133
+ glossary.add("delete", "てすと1", "備考")
134
+ glossary.add("delete", "てすと2", "備考")
135
+ glossary.delete("delete", "", true)
136
+ glossary.index
137
+ @result = glossary.lookup("delete")
138
+ end
139
+
140
+ it {
141
+ -> { glossary.delete("user") }.should raise_error(Logaling::TermError)
142
+ }
143
+
144
+ it "should delete terms when force option is true" do
145
+ @result.should_not include({:name=>"spec", :source_language=>"en", :target_language=>"ja", :source_term=>"delete", :target_term=>"てすと1", :note=>"備考"})
146
+ @result.should_not include({:name=>"spec", :source_language=>"en", :target_language=>"ja", :source_term=>"delete", :target_term=>"てすと2", :note=>"備考"})
147
+ end
148
+ end
149
+ end
85
150
  end
86
151
  end
87
152
 
@@ -112,7 +177,7 @@ module Logaling
112
177
  subject {glossary.lookup("user")}
113
178
 
114
179
  it 'succeed at find by term' do
115
- should be_include({:name=>"spec", :source_language=>"en", :target_language=>"ja", :source_term=>"user", :target_term=>"ユーザー", :note=>nil})
180
+ should be_include({:name=>"spec", :source_language=>"en", :target_language=>"ja", :source_term=>"user", :target_term=>"ユーザー", :note=>''})
116
181
  end
117
182
 
118
183
  after do
@@ -157,7 +222,7 @@ module Logaling
157
222
  subject { logaling_db.open(db_home, "utf8"){|db| logaling_db.lookup("user")} }
158
223
 
159
224
  it 'glossaries should be indexed' do
160
- should == [{:name=>"spec", :source_language=>"en", :target_language=>"ja", :source_term=>"user", :target_term=>"ユーザ", :note=>nil}]
225
+ should == [{:name=>"spec", :source_language=>"en", :target_language=>"ja", :source_term=>"user", :target_term=>"ユーザ", :note=>''}]
161
226
  end
162
227
 
163
228
  after do
@@ -176,7 +241,7 @@ module Logaling
176
241
  subject { logaling_db.open(db_home, "utf8"){|db| logaling_db.lookup("test")} }
177
242
 
178
243
  it 'glossaries should be indexed' do
179
- should == [{:name=>"spec", :source_language=>"en", :target_language=>"ja", :source_term=>"test", :target_term=>"テスト", :note=>nil}]
244
+ should == [{:name=>"spec", :source_language=>"en", :target_language=>"ja", :source_term=>"test", :target_term=>"テスト", :note=>''}]
180
245
  end
181
246
 
182
247
  after do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logaling-command
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,11 +13,11 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2011-11-30 00:00:00.000000000Z
16
+ date: 2011-12-06 00:00:00.000000000Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: thor
20
- requirement: &2153858740 !ruby/object:Gem::Requirement
20
+ requirement: &2152321920 !ruby/object:Gem::Requirement
21
21
  none: false
22
22
  requirements:
23
23
  - - ! '>='
@@ -25,10 +25,10 @@ dependencies:
25
25
  version: 0.14.6
26
26
  type: :runtime
27
27
  prerelease: false
28
- version_requirements: *2153858740
28
+ version_requirements: *2152321920
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: bundler
31
- requirement: &2153857740 !ruby/object:Gem::Requirement
31
+ requirement: &2152321280 !ruby/object:Gem::Requirement
32
32
  none: false
33
33
  requirements:
34
34
  - - ! '>='
@@ -36,10 +36,10 @@ dependencies:
36
36
  version: '1.0'
37
37
  type: :runtime
38
38
  prerelease: false
39
- version_requirements: *2153857740
39
+ version_requirements: *2152321280
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: rake
42
- requirement: &2153837940 !ruby/object:Gem::Requirement
42
+ requirement: &2152320420 !ruby/object:Gem::Requirement
43
43
  none: false
44
44
  requirements:
45
45
  - - ! '>='
@@ -47,10 +47,10 @@ dependencies:
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
- version_requirements: *2153837940
50
+ version_requirements: *2152320420
51
51
  - !ruby/object:Gem::Dependency
52
52
  name: rspec
53
- requirement: &2153837240 !ruby/object:Gem::Requirement
53
+ requirement: &2152319460 !ruby/object:Gem::Requirement
54
54
  none: false
55
55
  requirements:
56
56
  - - ! '>='
@@ -58,7 +58,7 @@ dependencies:
58
58
  version: '0'
59
59
  type: :development
60
60
  prerelease: false
61
- version_requirements: *2153837240
61
+ version_requirements: *2152319460
62
62
  description: A command line interface for logaling.
63
63
  email:
64
64
  - koji.shimada@enishi-tech.com