termtter 1.1.3 → 1.2.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.
@@ -4,5 +4,9 @@ module Termtter::Client
4
4
  call_commands('reload')
5
5
  end
6
6
 
7
- call_commands('reload')
7
+ register_hook(
8
+ :name => :auto_reload_init,
9
+ :point => :initialize,
10
+ :exec => lambda { call_commands('reload') }
11
+ )
8
12
  end
@@ -23,8 +23,8 @@ module Termtter::Client
23
23
  :help => ['open_url (TYPABLE|ID|@USER)', 'Open url'],
24
24
  :exec_proc => lambda {|arg|
25
25
  Thread.new(arg) do |arg|
26
- if public_storage[:typable_id] && status = typable_id_status(arg)
27
- status.text.gsub(URI.regexp) {|uri|
26
+ if status = Termtter::Client.typable_id_to_data(arg)
27
+ status.text.gsub(URI.regexp(['http', 'https'])) {|uri|
28
28
  open_uri(uri)
29
29
  }
30
30
  else
@@ -33,27 +33,23 @@ module Termtter::Client
33
33
  user = $1
34
34
  statuses = Termtter::API.twitter.user_timeline(user)
35
35
  return if statuses.empty?
36
- statuses[0].text.gsub(URI.regexp) {|uri| open_uri(uri) }
36
+ statuses[0].text.gsub(URI.regexp(['http', 'https'])) {|uri| open_uri(uri) }
37
37
  when /^\d+/
38
- Termtter::API.twitter.show(arg).text.gsub(URI.regexp) {|uri| open_uri(uri) }
38
+ Termtter::API.twitter.show(arg).text.gsub(URI.regexp(['http', 'https'])) {|uri| open_uri(uri) }
39
39
  end
40
40
  end
41
41
  end
42
42
  },
43
43
  :completion_proc => lambda {|cmd, arg|
44
- if public_storage[:typable_id] && typable_id?(arg)
45
- "#{cmd} #{typable_id_convert(arg)}"
46
- else
47
- case arg
48
- when /@(.*)/
49
- find_user_candidates $1, "#{cmd} @%s"
50
- when /(\d+)/
51
- find_status_ids(arg).map{|id| "#{cmd} #{$1}"}
52
- end
44
+ case arg
45
+ when /@(.*)/
46
+ find_user_candidates $1, "#{cmd} @%s"
47
+ when /(\d+)/
48
+ find_status_ids(arg).map{|id| "#{cmd} #{$1}"}
53
49
  end
54
50
  }
55
51
  )
56
52
  end
57
53
 
58
54
  #Optional Setting
59
- # config.plugins.open_url.browser = firefox
55
+ # config.plugins.open_url.browser = 'firefox'
@@ -0,0 +1,9 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ Termtter::Client.register_hook(
4
+ :name => :protected_filter,
5
+ :point => :filter_for_output,
6
+ :exec => lambda { |statuses, event|
7
+ statuses.select { |s| !s.user.protected }
8
+ }
9
+ )
@@ -11,37 +11,27 @@ module Termtter::Client
11
11
 
12
12
  register_command(
13
13
  :name => :reload,
14
- :exec_proc => lambda {|arg|
15
- begin
16
- args = @since_id ? [{:since_id => @since_id}] : []
17
- statuses = Termtter::API.twitter.friends_timeline(*args)
18
- unless statuses.empty?
19
- print "\e[1K\e[0G" unless win?
20
- @since_id = statuses[0].id
21
- output(statuses, :update_friends_timeline)
22
- Readline.refresh_line
23
- end
24
- rescue OpenURI::HTTPError => e
25
- if e.message == '401 Unauthorized'
26
- puts 'Could not login'
27
- puts 'plese check your account settings'
28
- exit!
29
- end
30
- rescue => e
31
- handle_error(e)
14
+ :exec => lambda {|arg|
15
+ args = @since_id ? [{:since_id => @since_id}] : []
16
+ statuses = Termtter::API.twitter.friends_timeline(*args)
17
+ unless statuses.empty?
18
+ print "\e[1K\e[0G" unless win?
19
+ @since_id = statuses[0].id
20
+ output(statuses, :update_friends_timeline)
21
+ Readline.refresh_line
32
22
  end
33
23
  }
34
24
  )
35
25
 
36
26
  register_command(
37
- :name => :update, :aliases => [:u],
38
- :exec_proc => lambda {|arg|
27
+ :name => :update, :alias => :u,
28
+ :exec => lambda {|arg|
39
29
  unless arg.empty?
40
30
  result = Termtter::API.twitter.update(arg)
41
31
  puts TermColor.parse("updated => #{result.text} <90>#{result.id}</90>")
42
32
  end
43
33
  },
44
- :completion_proc => lambda {|cmd, args|
34
+ :completion => lambda {|cmd, args|
45
35
  if /(.*)@([^\s]*)$/ =~ args
46
36
  find_user_candidates $2, "#{cmd} #{$1}@%s"
47
37
  end
@@ -184,9 +174,13 @@ module Termtter::Client
184
174
  register_command(
185
175
  :name => :replies, :aliases => [:r],
186
176
  :exec_proc => lambda {|arg|
187
- output(Termtter::API.twitter.replies, :replies)
177
+ res = Termtter::API.twitter.replies
178
+ unless arg.empty?
179
+ res = res.map {|e| e.user.screen_name == arg ? e : nil }.compact
180
+ end
181
+ output(res, :replies)
188
182
  },
189
- :help => ["replies,r", "List the most recent @replies for the authenticating user"]
183
+ :help => ["replies,r", "List the replies"]
190
184
  )
191
185
 
192
186
  register_command(
@@ -268,7 +262,11 @@ module Termtter::Client
268
262
  word = $1
269
263
  raise "Not implemented yet."
270
264
  else
271
- return
265
+ if public_storage[:typable_id] && typable_id?(arg)
266
+ id = typable_id_convert(arg)
267
+ else
268
+ return
269
+ end
272
270
  end
273
271
 
274
272
  r = Termtter::API.twitter.favorite id
@@ -281,10 +279,14 @@ module Termtter::Client
281
279
  when /(\d+)/
282
280
  find_status_ids(arg).map{|id| "#{cmd} #{id}"}
283
281
  else
284
- %w(favorite).grep(/^#{Regexp.quote arg}/)
282
+ if data = Termtter::Client.typable_id_to_data(arg)
283
+ "#{cmd} #{data}"
284
+ else
285
+ %w(favorite).grep(/^#{Regexp.quote arg}/)
286
+ end
285
287
  end
286
288
  },
287
- :help => ['favorite,fav (ID|@USER|/WORD)', 'Mark a status as a favorite']
289
+ :help => ['favorite,fav (ID|@USER|TYPABLE|/WORD)', 'Mark a status as a favorite']
288
290
  )
289
291
 
290
292
  def self.show_settings(conf, level = 0)
@@ -417,7 +419,7 @@ module Termtter::Client
417
419
  public_storage[:plugins].sort
418
420
  end
419
421
  },
420
- :help => ['plugin FILE', 'Load a plugin']
422
+ :help => ['plug FILE', 'Load a plugin']
421
423
  )
422
424
 
423
425
  register_command(
@@ -453,7 +455,7 @@ module Termtter::Client
453
455
  when /^\s*(\d+)\s+(.+)$/
454
456
  s = Termtter::API.twitter.show($1) rescue nil
455
457
  if s
456
- update_with_user_and_id($2, s.user.screen_name, id)
458
+ update_with_user_and_id($2, s.user.screen_name, s.id)
457
459
  end
458
460
  when /^\s*@(\w+)/
459
461
  in_reply_to_status_id = Termtter::API.twitter.user($1).status.id rescue nil
@@ -7,14 +7,51 @@ require 'tempfile'
7
7
  config.plugins.stdout.set_default(:colors, (31..36).to_a + (91..96).to_a)
8
8
  config.plugins.stdout.set_default(
9
9
  :timeline_format,
10
- '<90><%=time%></90> <<%=color%>><%=s.user.screen_name%>: <%=text%></<%=color%>> ' +
11
- '<90><%=reply_to ? reply_to + " " : ""%><%=s.id%> <%=source%></90>'
10
+ '<90><%=time%> [<%=status_id%>]</90> <<%=color%>><%=s.user.screen_name%>: <%=text%></<%=color%>> ' +
11
+ '<90><%=reply_to_status_id ? " (reply_to [#{reply_to_status_id}]) " : ""%><%=source%></90>'
12
12
  )
13
13
  config.plugins.stdout.set_default(:enable_pager, true)
14
14
  config.plugins.stdout.set_default(:pager, 'less -R -f +G')
15
15
  config.plugins.stdout.set_default(:window_height, 50)
16
+ config.plugins.stdout.set_default(:typable_ids, ('aa'..'zz').to_a)
17
+ config.plugins.stdout.set_default(:typable_id_prefix, '$')
16
18
 
17
19
  module Termtter
20
+ class TypableIdGenerator
21
+ def initialize(ids)
22
+ if not ids.kind_of?(Array)
23
+ raise ArgumentError, 'ids should be an Array'
24
+ elsif ids.empty?
25
+ raise ArgumentError, 'ids should not be empty'
26
+ end
27
+ @ids = ids
28
+ @table = {}
29
+ end
30
+
31
+ def next(data)
32
+ id = @ids.shift
33
+ @ids.push id
34
+ @table[id] = data
35
+ id
36
+ end
37
+
38
+ def get(id)
39
+ @table[id]
40
+ end
41
+ end
42
+
43
+ module Client
44
+ @typable_id_generator = TypableIdGenerator.new(config.plugins.stdout.typable_ids)
45
+
46
+ def self.data_to_typable_id(data)
47
+ id = config.plugins.stdout.typable_id_prefix + @typable_id_generator.next(data)
48
+ end
49
+
50
+ def self.typable_id_to_data(id)
51
+ @typable_id_generator.get(id)
52
+ end
53
+ end
54
+
18
55
  class StdOut < Hook
19
56
  def initialize
20
57
  super(:name => :stdout, :points => [:output])
@@ -43,7 +80,14 @@ module Termtter
43
80
  statuses.each do |s|
44
81
  text = TermColor.escape(s.text)
45
82
  color = config.plugins.stdout.colors[s.user.id.to_i % config.plugins.stdout.colors.size]
46
- reply_to = s.in_reply_to_status_id ? "(reply to #{s.in_reply_to_status_id})" : nil
83
+ status_id = Termtter::Client.data_to_typable_id(s.id)
84
+ reply_to_status_id =
85
+ if s.in_reply_to_status_id.nil?
86
+ nil
87
+ else
88
+ Termtter::Client.data_to_typable_id(s.in_reply_to_status_id)
89
+ end
90
+
47
91
  time = "(#{Time.parse(s.created_at).strftime(time_format)})"
48
92
  source =
49
93
  case s.source
@@ -68,10 +112,26 @@ module Termtter
68
112
  end
69
113
 
70
114
  Client.register_hook(StdOut.new)
115
+
116
+ Client.register_hook(
117
+ :name => :stdout_typable_id,
118
+ :point => /^modify_arg_for_.*/,
119
+ :exec => lambda { |cmd, arg|
120
+ if arg
121
+ prefix = config.plugins.stdout.typable_id_prefix
122
+ arg.gsub(/#{Regexp.quote(prefix)}\w+/) do |id|
123
+ Termtter::Client.typable_id_to_data(id[1..-1]) || id
124
+ end
125
+ else
126
+ arg
127
+ end
128
+ }
129
+ )
71
130
  end
72
131
 
73
132
  # stdout.rb
74
133
  # output statuses to stdout
75
134
  # example config
76
135
  # config.plugins.stdout.colors = [:none, :red, :green, :yellow, :blue, :magenta, :cyan]
77
- # config.plugins.stdout.timeline_format = '<90><%=time%></90> <<%=status_color%>><%=status%></<%=status_color%>> <90><%=id%></90>'
136
+ # config.plugins.stdout.timeline_format = '<90><%=time%> [<%=status_id%>]</90> <<%=color%>><%=s.user.screen_name%>: <%=text%></<%=color%>> ' +
137
+ # '<90><%=reply_to_status_id ? " (reply_to [#{reply_to_status_id}]) " : ""%><%=source%></90>'
@@ -8,39 +8,43 @@ module Termtter::Client
8
8
  :points => [:output],
9
9
  :exec_proc => lambda {|statuses, event|
10
10
  statuses.each do |s|
11
- public_storage[:uris] += s[:text].scan(%r|https?://[^\s]+|)
11
+ public_storage[:uris] = s[:text].scan(%r|https?://[^\s]+|) + public_storage[:uris]
12
12
  end
13
13
  }
14
14
  )
15
15
 
16
16
  def self.open_uri(uri)
17
- unless config.plugins.uri_open.browser.empty?
18
- system config.plugins.uri_open.browser, uri
19
- else
20
- case RUBY_PLATFORM
21
- when /linux/
22
- system 'firefox', uri
23
- when /mswin(?!ce)|mingw|bccwin/
24
- system 'explorer', uri
17
+ cmd =
18
+ unless config.plugins.uri_open.browser.empty?
19
+ config.plugins.uri_open.browser
25
20
  else
26
- system 'open', uri
21
+ case RUBY_PLATFORM
22
+ when /linux/; 'firefox'
23
+ when /mswin(?!ce)|mingw|bccwin/; 'explorer'
24
+ else; 'open'
25
+ end
27
26
  end
28
- end
27
+ system cmd, uri
29
28
  end
30
29
 
31
30
  register_command(
32
31
  :name => :'uri-open', :aliases => [:uo],
33
- :exec_proc => lambda{|arg|
32
+ :exec_proc => lambda {|arg|
34
33
  case arg
35
- when /^\s+$/
36
- public_storage[:uris].each do |uri|
37
- open_uri(uri)
38
- end
39
- public_storage[:uris].clear
34
+ when ''
35
+ open_uri public_storage[:uris].shift
36
+ when /^\s*all\s*$/
37
+ public_storage[:uris].
38
+ each {|uri| open_uri(uri) }.
39
+ clear
40
40
  when /^\s*list\s*$/
41
- public_storage[:uris].each_with_index do |uri, index|
42
- puts "#{index}: #{uri}"
43
- end
41
+ public_storage[:uris].
42
+ enum_for(:each_with_index).
43
+ to_a.
44
+ reverse.
45
+ each do |uri, index|
46
+ puts "#{index}: #{uri}"
47
+ end
44
48
  when /^\s*delete\s+(\d+)\s*$/
45
49
  puts 'delete'
46
50
  public_storage[:uris].delete_at($1.to_i)
@@ -48,19 +52,20 @@ module Termtter::Client
48
52
  public_storage[:uris].clear
49
53
  puts "clear uris"
50
54
  when /^\s*(\d+)\s*$/
51
- open_uri(public_storage[:uris][$1.to_i])
52
- public_storage[:uris].delete_at($1.to_i)
55
+ open_uri(public_storage[:uris].delete_at($1.to_i))
56
+ else
57
+ puts "**parse error in uri-open**"
53
58
  end
54
59
  },
55
- :completion_proc => lambda{|cmd, arg|
56
- %w(list delete clear).grep(/^#{Regexp.quote arg}/).map{|a| "#{cmd} #{a}"}
60
+ :completion_proc => lambda {|cmd, arg|
61
+ %w(all list delete clear).grep(/^#{Regexp.quote arg}/).map {|a| "#{cmd} #{a}" }
57
62
  }
58
63
  )
59
64
  end
60
- # ~/.termtter
65
+ # ~/.termtter/config
61
66
  # plugin 'uri-open'
62
67
  #
63
- # see also: http://ujihisa.nowa.jp/entry/c3dd00c4e0
68
+ # see also: http://ujihisa.blogspot.com/2009/05/fixed-uri-open-of-termtter.html
64
69
  #
65
70
  # KNOWN BUG
66
- # * In Debian, exit or C-c in the termtter kills your firefox.
71
+ # * In Debian, exit or C-c in the termtter would kill your firefox.
@@ -21,6 +21,9 @@ module Termtter
21
21
  config.set_default(:update_interval, 300)
22
22
  config.set_default(:prompt, '> ')
23
23
  config.set_default(:devel, false)
24
+ config.set_default(:stdout, true)
25
+ config.set_default(:standard_commands, true)
26
+ config.set_default(:auto_reload, true)
24
27
 
25
28
  Thread.abort_on_exception = true
26
29
 
@@ -74,18 +77,33 @@ module Termtter
74
77
  end
75
78
  end
76
79
 
77
- def register_command(arg)
80
+ def register_command(arg, opts = {}, &block)
78
81
  command = case arg
79
82
  when Command
80
83
  arg
81
84
  when Hash
82
85
  Command.new(arg)
86
+ when String
87
+ options = { :name => arg }
88
+ options.merge!(opts)
89
+ options[:exec_proc] = block
90
+ Command.new(options)
83
91
  else
84
- raise ArgumentError, 'must be given Termtter::Command or Hash'
92
+ raise ArgumentError, 'must be given Termtter::Command, Hash or String with block'
85
93
  end
86
94
  @commands[command.name] = command
87
95
  end
88
96
 
97
+ def add_command(name)
98
+ if block_given?
99
+ command = Command.new(:name => name)
100
+ yield command
101
+ @commands[command.name] = command
102
+ else
103
+ raise ArgumentError, 'must be given block to set parameters'
104
+ end
105
+ end
106
+
89
107
  def clear_command
90
108
  @commands.clear
91
109
  end
@@ -120,11 +138,11 @@ module Termtter
120
138
  statuses = statuses.sort_by{|s|s.id}
121
139
  call_hooks(:pre_filter, statuses, event)
122
140
 
123
- filtered = statuses.map(&:dup)
141
+ filtered = apply_filters_for_hook(:filter_for_output, statuses.map(&:dup), event)
142
+
124
143
  @filters.each do |f| # TODO: code for compatibility. delete someday.
125
- statuses = f.call(statuses, event)
144
+ filtered = f.call(filtered, event)
126
145
  end
127
- apply_filters_for_hook(:filter_for_output, statuses, event)
128
146
 
129
147
  call_hooks(:post_filter, filtered, event)
130
148
  get_hooks(:output).each do |hook|
@@ -325,12 +343,9 @@ module Termtter
325
343
 
326
344
  @init_block.call(self) if @init_block
327
345
 
328
- unless @init_block # compatibility for old style config file
329
- plug 'stdout'
330
- plug 'standard_commands'
331
- plug 'auto_reload'
332
- end
333
-
346
+ plug 'stdout' if config.stdout
347
+ plug 'standard_commands' if config.standard_commands
348
+ plug 'auto_reload' if config.auto_reload
334
349
  plug 'devel' if config.devel
335
350
 
336
351
  config.system.load_plugins.each do |plugin|
@@ -1,19 +1,18 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  module Termtter
4
-
5
4
  class Command
6
-
7
5
  attr_accessor :name, :aliases, :exec_proc, :completion_proc, :help
8
6
 
9
7
  # args
10
- # name: Symbol as command name
8
+ # name: (required) Symbol as command name
11
9
  # aliases: Array of command alias (ex. ['u', 'up'])
12
10
  # exec_proc: Proc for procedure of the command. If need the proc must return object for hook.
13
11
  # completion_proc: Proc for input completion. The proc must return Array of candidates (Optional)
14
12
  # help: help text for the command (Optional)
15
13
  def initialize(args)
16
14
  raise ArgumentError, ":name is not given." unless args.has_key?(:name)
15
+ args = args.dup
17
16
  args[:exec_proc] ||= args[:exec]
18
17
  args[:completion_proc] ||= args[:completion]
19
18
  args[:aliases] ||= [args[:alias]].compact
@@ -27,14 +26,16 @@ module Termtter
27
26
  set cfg
28
27
  end
29
28
 
29
+ # set :: Hash -> ()
30
30
  def set(cfg)
31
- @name = cfg[:name].to_sym
32
- @aliases = cfg[:aliases].map {|e| e.to_sym }
33
- @exec_proc = cfg[:exec_proc]
34
- @completion_proc = cfg[:completion_proc]
35
- @help = cfg[:help]
31
+ self.name = cfg[:name].to_sym
32
+ self.aliases = cfg[:aliases]
33
+ self.exec_proc = cfg[:exec_proc]
34
+ self.completion_proc = cfg[:completion_proc]
35
+ self.help = cfg[:help]
36
36
  end
37
37
 
38
+ # complement :: String -> [String]
38
39
  def complement(input)
39
40
  if match?(input) && input =~ /^[^\s]+\s/
40
41
  if completion_proc
@@ -48,6 +49,7 @@ module Termtter
48
49
  end
49
50
  end
50
51
 
52
+ # call :: ???
51
53
  def call(cmd = nil, arg = nil, original_text = nil)
52
54
  arg = case arg
53
55
  when nil
@@ -60,19 +62,32 @@ module Termtter
60
62
  exec_proc.call(arg)
61
63
  end
62
64
 
65
+ # match? :: String -> Boolean
63
66
  def match?(input)
64
- (pattern =~ input) != nil
67
+ !(pattern !~input)
65
68
  end
66
69
 
70
+ # pattern :: Regexp
67
71
  def pattern
68
72
  commands_regex = commands.map {|name| Regexp.quote(name.to_s) }.join('|')
69
73
  /^((#{commands_regex})|(#{commands_regex})\s+(.*?))\s*$/
70
74
  end
71
75
 
76
+ # commands :: [Symbol]
72
77
  def commands
73
78
  [name] + aliases
74
79
  end
75
80
 
81
+ def aliases=(as)
82
+ @aliases = as.map { |a| a.to_sym }
83
+ end
84
+
85
+ # alias= :: Symbol -> ()
86
+ def alias=(a)
87
+ self.aliases = [a]
88
+ end
89
+
90
+ # split_command_line :: String -> (String, String)
76
91
  def self.split_command_line(line)
77
92
  line.strip.split(/\s+/, 2)
78
93
  end
@@ -51,6 +51,10 @@ module Termtter
51
51
  @store.dup
52
52
  end
53
53
 
54
+ def __clear__
55
+ @store.clear
56
+ end
57
+
54
58
  __instance = self.new
55
59
  (class << self; self end).
56
60
  __send__(:define_method, :instance) { __instance }
@@ -9,10 +9,7 @@ config.password = '<%= password %>'
9
9
  #config.proxy.password = 'proxy password'
10
10
 
11
11
  Termtter::Client.init do |t|
12
- <%- standard_plugins.each do |plugin| -%>
13
- t.plug '<%= plugin %>'
14
- <%- end -%>
15
12
  <%- (plugins - standard_plugins).each do |plugin| -%>
16
- # t.plug '<%= plugin %>'
13
+ # t.plug '<%= plugin %>'
17
14
  <%- end -%>
18
15
  end
@@ -1,4 +1,4 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  module Termtter
3
- VERSION = '1.1.3'
3
+ VERSION = '1.2.0'
4
4
  end
@@ -21,6 +21,47 @@ module Termtter
21
21
  Client.get_command(:test).name.should == :test
22
22
  end
23
23
 
24
+ it 'should take register_command as block' do
25
+ process = lambda {}
26
+ Client.register_command('test', &process)
27
+ command = Client.get_command(:test)
28
+ command.name.should == :test
29
+ command.exec_proc.should == process
30
+ end
31
+
32
+ it 'should take register_command as block with options' do
33
+ process = lambda {}
34
+ Client.register_command('test', :help => 'help', &process)
35
+ command = Client.get_command(:test)
36
+ command.name.should == :test
37
+ command.exec_proc.should == process
38
+ command.help.should == 'help'
39
+ end
40
+
41
+ it 'should take add_command as block' do
42
+ Client.add_command('test') do |c|
43
+ c.aliases = ['t']
44
+ c.help = 'test command is a test'
45
+ end
46
+ command = Client.get_command(:test)
47
+ command.name.should == :test
48
+ command.aliases.should == [:t]
49
+ command.help.should == 'test command is a test'
50
+ end
51
+
52
+ it 'should take add_command as block without past config' do
53
+ Client.add_command('past') do |c|
54
+ c.help = 'past help'
55
+ end
56
+ Client.get_command(:past).help.should == 'past help'
57
+ Client.add_command('new') {}
58
+ Client.get_command(:new).help.should_not == 'past help'
59
+ end
60
+
61
+ it 'raises ArgumentError when call add_command without block' do
62
+ lambda { Client.add_command('past') }.should raise_error(ArgumentError)
63
+ end
64
+
24
65
  it 'should call command' do
25
66
  command_arg = nil
26
67
  command = Command.new(:name => :test, :exec_proc => lambda {|arg| command_arg = arg})
@@ -3,52 +3,73 @@
3
3
  require File.dirname(__FILE__) + '/../spec_helper'
4
4
 
5
5
  module Termtter
6
+ describe 'Command#initialize' do
7
+ it 'requires the name element in the argument hash' do
8
+ lambda { Command.new(:nama => 1) }.should raise_error(ArgumentError)
9
+ lambda { Command.new(:name => 1) }.should_not raise_error(ArgumentError)
10
+ end
6
11
 
7
- describe Command do
12
+ it 'does not destroy the argument hash' do
13
+ hash = {
14
+ :name => 1,
15
+ :exec => 3
16
+ }
17
+ Command.new hash
18
+
19
+ hash.should eql(hash)
20
+ hash[:name].should == 1
21
+ hash[:exec].should == 3
22
+ hash[:exec_proc].should be_nil
23
+ end
24
+ end
8
25
 
26
+ describe Command do
9
27
  before do
10
28
  params = {
11
- :name => 'update',
12
- :aliases => ['u', 'up'],
13
- :exec_proc => lambda {|arg| arg },
14
- :completion_proc => lambda {|command, arg| ['complete1', 'complete2'] },
15
- :help => ['update,u TEXT', 'test command']
29
+ :name => 'update',
30
+ :aliases => ['u', 'up'],
31
+ :exec_proc => lambda {|arg| arg },
32
+ :completion_proc => lambda {|command, arg| %w[complete1 complete2] },
33
+ :help => ['update,u TEXT', 'test command']
16
34
  }
17
35
  @command = Command.new(params)
18
36
  end
19
37
 
20
- it 'should return command regex' do
21
- @command.pattern.should == /^((update|u|up)|(update|u|up)\s+(.*?))\s*$/
38
+ describe '#pattern' do
39
+ it 'returns command regex' do
40
+ @command.pattern.
41
+ should == /^((update|u|up)|(update|u|up)\s+(.*?))\s*$/
42
+ end
22
43
  end
23
44
 
24
- it 'should be given name as String or Symbol' do
45
+ it 'is given name as String or Symbol' do
25
46
  Command.new(:name => 'foo').name.should == :foo
26
47
  Command.new(:name => :foo).name.should == :foo
27
48
  end
28
49
 
29
- it 'should return name' do
50
+ it 'returns name' do
30
51
  @command.name.should == :update
31
52
  end
32
53
 
33
- it 'should return aliases' do
54
+ it 'returns aliases' do
34
55
  @command.aliases.should == [:u, :up]
35
56
  end
36
57
 
37
- it 'should return commands' do
58
+ it 'returns commands' do
38
59
  @command.commands.should == [:update, :u, :up]
39
60
  end
40
61
 
41
- it 'should return help' do
62
+ it 'returns help' do
42
63
  @command.help.should == ['update,u TEXT', 'test command']
43
64
  end
44
65
 
45
- it 'should return candidates for completion' do
66
+ it 'returns candidates for completion' do
46
67
  # complement
47
68
  [
48
69
  ['upd', ['update']],
49
70
  [' upd', []],
50
71
  [' upd ', []],
51
- ['update a', ['complete1', 'complete2']],
72
+ ['update a', ['complete1', 'complete2']],
52
73
  [' update ', []],
53
74
  ['u foo', ['complete1', 'complete2']],
54
75
  ].each do |input, comp|
@@ -56,7 +77,7 @@ module Termtter
56
77
  end
57
78
  end
58
79
 
59
- it 'should return command_info when call method "match?"' do
80
+ it 'returns command_info when call method "match?"' do
60
81
  [
61
82
  ['update', true],
62
83
  ['up', true],
@@ -75,33 +96,45 @@ module Termtter
75
96
  end
76
97
  end
77
98
 
78
- it 'should raise ArgumentError when constructor arguments are deficient' do
79
- lambda { Command.new }.should raise_error(ArgumentError)
80
- lambda { Command.new(:exec_proc => lambda {|args|}) }.should raise_error(ArgumentError)
81
- lambda { Command.new(:aliases => ['u']) }.should raise_error(ArgumentError)
82
- end
83
-
84
- it 'should call exec_proc when call method "call"' do
99
+ it 'calls exec_proc when call method "call"' do
85
100
  @command.call('foo', 'test', 'foo test').should == 'test'
86
101
  @command.call('foo', ' test', 'foo test').should == ' test'
87
102
  @command.call('foo', ' test ', 'foo test ').should == ' test '
88
103
  @command.call('foo', 'test test', 'foo test test').should == 'test test'
89
104
  end
90
105
 
91
- it 'should raise ArgumentError at call' do
92
- lambda { @command.call('foo', nil, 'foo') }.should_not raise_error(ArgumentError)
93
- lambda { @command.call('foo', 'foo', 'foo') }.should_not raise_error(ArgumentError)
94
- lambda { @command.call('foo', false, 'foo') }.should raise_error(ArgumentError)
95
- lambda { @command.call('foo', Array.new, 'foo') }.should raise_error(ArgumentError)
106
+ it 'raises ArgumentError at call' do
107
+ lambda { @command.call('foo', nil, 'foo') }.
108
+ should_not raise_error(ArgumentError)
109
+ lambda { @command.call('foo', 'foo', 'foo') }.
110
+ should_not raise_error(ArgumentError)
111
+ lambda { @command.call('foo', false, 'foo') }.
112
+ should raise_error(ArgumentError)
113
+ lambda { @command.call('foo', Array.new, 'foo') }.
114
+ should raise_error(ArgumentError)
96
115
  end
97
116
 
98
- it 'split command line' do
99
- Command.split_command_line('test foo bar').should == ['test', 'foo bar']
100
- Command.split_command_line('test foo bar').should == ['test', 'foo bar']
101
- Command.split_command_line('test foo bar').should == ['test', 'foo bar']
102
- Command.split_command_line(' test foo bar').should == ['test', 'foo bar']
103
- Command.split_command_line(' test foo bar ').should == ['test', 'foo bar']
117
+ describe '#alias=' do
118
+ it 'wraps aliases=' do
119
+ a = :ujihisa
120
+ @command.should_receive(:aliases=).with([a])
121
+ @command.alias = a
122
+ end
123
+ end
124
+
125
+ describe '.split_command_line' do
126
+ it 'splits from a command line string to the command name and the arg' do
127
+ Command.split_command_line('test foo bar').
128
+ should == ['test', 'foo bar']
129
+ Command.split_command_line('test foo bar').
130
+ should == ['test', 'foo bar']
131
+ Command.split_command_line('test foo bar').
132
+ should == ['test', 'foo bar']
133
+ Command.split_command_line(' test foo bar').
134
+ should == ['test', 'foo bar']
135
+ Command.split_command_line(' test foo bar ').
136
+ should == ['test', 'foo bar']
137
+ end
104
138
  end
105
139
  end
106
140
  end
107
-
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: termtter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - jugyo
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-04-30 00:00:00 +09:00
13
+ date: 2009-05-17 00:00:00 +09:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -114,6 +114,7 @@ files:
114
114
  - lib/plugins/post_exec_hook_sample.rb
115
115
  - lib/plugins/pre_exec_hook_sample.rb
116
116
  - lib/plugins/primes.rb
117
+ - lib/plugins/protected_filter.rb
117
118
  - lib/plugins/quicklook.rb
118
119
  - lib/plugins/random.rb
119
120
  - lib/plugins/reblog.rb