boom 0.0.9 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.markdown CHANGED
@@ -1,6 +1,15 @@
1
1
  # boom changes
2
2
 
3
3
  ## head
4
+ - `boom open` will open the Item's URL in a browser, or it'll open all the URLs
5
+ in a List for you. Thanks [lwe](https://github.com/lwe).
6
+ - Values for item creation can have spaces, and then they get concat'ed as one
7
+ value. Thanks [lwe](https://github.com/lwe).
8
+ - Replacing an item no longer dupes the item; it'll just replace the value.
9
+ Thank god, finally. Thanks [thbishop](https://github.com/thbishop).
10
+ - Also started `completion/`, a place to drop in scripts to set up completion
11
+ support for boom. Starting out with [thbishop](https://github.com/thbishop)'s
12
+ bash script, but if anyone has something for zsh I'd kiss them a bit.
4
13
 
5
14
  ## 0.0.9
6
15
  - Backport `Symbol#to_proc` for 1.8.6 support (thanks
data/README.markdown CHANGED
@@ -81,6 +81,26 @@ can have multiple lists.
81
81
  blog: http://zachholman.com
82
82
  github: https://github.com
83
83
 
84
+ ** Open in browser **
85
+
86
+ $ boom open facebook-stalking
87
+ Boom! We just opened all of "shoes" for you.
88
+
89
+ In other words, this will open all the links in `facebook-stalking` in your
90
+ browser. You creep. You can also just open up one:
91
+
92
+ $ boom open twitter
93
+ Boom! We just opened http://twitter.com for you.
94
+
95
+ ** Echo an item**
96
+
97
+ # boom echo <list> <name>
98
+ # boom echo <name>
99
+ $ git clone $(boom echo github)holman/boom
100
+ Cloning into boom...
101
+
102
+ Impossible... no. It's silly, but not impossible.
103
+
84
104
  ** Help **
85
105
 
86
106
  $ boom help
data/boom.gemspec CHANGED
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
13
13
  ## If your rubyforge_project name is different, then edit it and comment out
14
14
  ## the sub! line in the Rakefile
15
15
  s.name = 'boom'
16
- s.version = '0.0.9'
17
- s.date = '2011-01-10'
16
+ s.version = '0.0.10'
17
+ s.date = '2011-01-26'
18
18
  s.rubyforge_project = 'boom'
19
19
 
20
20
  ## Make sure your summary is short. The description may be as long
@@ -71,12 +71,14 @@ Gem::Specification.new do |s|
71
71
  Rakefile
72
72
  bin/boom
73
73
  boom.gemspec
74
+ completion/boom.bash
75
+ completion/boom.zsh
74
76
  lib/boom.rb
75
- lib/boom/clipboard.rb
76
77
  lib/boom/command.rb
77
78
  lib/boom/core_ext/symbol.rb
78
79
  lib/boom/item.rb
79
80
  lib/boom/list.rb
81
+ lib/boom/platform.rb
80
82
  lib/boom/storage.rb
81
83
  test/examples/urls.json
82
84
  test/helper.rb
@@ -0,0 +1,23 @@
1
+ _boom_complete() {
2
+ local cur prev lists
3
+ COMPREPLY=()
4
+ cur="${COMP_WORDS[COMP_CWORD]}"
5
+ prev="${COMP_WORDS[COMP_CWORD-1]}"
6
+
7
+ lists=`boom | awk '{print $1}'`
8
+
9
+ case "${prev}" in
10
+ boom)
11
+ COMPREPLY=( $(compgen -W "${lists}" -- ${cur}) )
12
+ return 0
13
+ ;;
14
+ *)
15
+ for ((i = 0; i < ${#lists}; i++)); do
16
+ local items=`boom $prev | awk '{print $1}' | sed -e 's/://'`
17
+ COMPREPLY=( $(compgen -W "${items}" -- ${cur}))
18
+ return 0
19
+ done
20
+ ;;
21
+ esac
22
+ }
23
+ complete -F _boom_complete boom
@@ -0,0 +1,18 @@
1
+ # oh hai!
2
+ #
3
+ # someone should fork this and add autocompletion for zsh
4
+ #
5
+ # you'd be pretty cool
6
+ #
7
+ # and I'd give you a high-five
8
+ #
9
+ #
10
+ #
11
+ # and maybe a whiskey
12
+ #
13
+ #
14
+ #
15
+ #
16
+ #
17
+ #
18
+ # a couple of whiskeys
data/lib/boom/command.rb CHANGED
@@ -24,9 +24,9 @@ module Boom
24
24
  # args - The actual commands to operate on. Can be as few as zero
25
25
  # arguments or as many as three.
26
26
  def execute(*args)
27
- command = args[0]
28
- major = args[1]
29
- minor = args[2]
27
+ command = args.shift
28
+ major = args.shift
29
+ minor = args.empty? ? nil : args.join(' ')
30
30
 
31
31
  return overview unless command
32
32
  delegate(command, major, minor)
@@ -73,6 +73,8 @@ module Boom
73
73
  return edit if command == 'edit'
74
74
  return help if command == 'help'
75
75
  return help if command[0] == 45 || command[0] == '-' # any - dash options are pleas for help
76
+ return echo(major,minor) if command == 'echo' || command == 'e'
77
+ return open(major,minor) if command == 'open'
76
78
 
77
79
  # if we're operating on a List
78
80
  if storage.list_exists?(command)
@@ -105,6 +107,39 @@ module Boom
105
107
  end
106
108
  end
107
109
 
110
+ # Public: opens the Item.
111
+ #
112
+ # Returns nothing.
113
+ def open(major, minor)
114
+ if storage.list_exists?(major)
115
+ list = List.find(major)
116
+ list.items.each { |item| Platform.open(item) }
117
+ output "Boom! We just opened all of \"#{major}\" for you."
118
+ else
119
+ item = storage.items.detect { |item| item.name == major }
120
+ output Platform.open(item)
121
+ end
122
+ end
123
+
124
+ # Public: echoes only the Item's value without copying
125
+ #
126
+ # item_name - the String term to search for in all Item names
127
+ #
128
+ # Returns nothing
129
+ def echo(major, minor)
130
+ unless minor
131
+ item = storage.items.detect do |item|
132
+ item.name == major
133
+ end
134
+ return output "\"#{major}\" not found" unless item
135
+ else
136
+ list = List.find(major)
137
+ item = list.find_item(minor)
138
+ return output "\"#{minor}\" not found in \"#{major}\"" unless item
139
+ end
140
+ output item.value
141
+ end
142
+
108
143
  # Public: add a new List.
109
144
  #
110
145
  # name - the String name of the List.
@@ -187,7 +222,7 @@ module Boom
187
222
  item.name == name
188
223
  end
189
224
 
190
- output Clipboard.copy(item)
225
+ output Platform.copy(item)
191
226
  end
192
227
 
193
228
  # Public: search for an Item in a particular list by name. Drops the
@@ -202,7 +237,7 @@ module Boom
202
237
  item = list.find_item(item_name)
203
238
 
204
239
  if item
205
- output Clipboard.copy(item)
240
+ output Platform.copy(item)
206
241
  else
207
242
  output "\"#{item_name}\" not found in \"#{list_name}\""
208
243
  end
@@ -243,6 +278,10 @@ module Boom
243
278
  boom <list> <name> <value> create a new list item
244
279
  boom <name> copy item's value to clipboard
245
280
  boom <list> <name> copy item's value to clipboard
281
+ boom open <name> open item's url in browser
282
+ boom open <list> <name> open all item's url in browser for a list
283
+ boom echo <name> echo the item's value without copying
284
+ boom echo <list> <name> echo the item's value without copying
246
285
  boom <list> <name> delete deletes an item
247
286
 
248
287
  all other documentation is located at:
data/lib/boom/item.rb CHANGED
@@ -53,6 +53,14 @@ module Boom
53
53
  name.length > 15 ? '' : ' '*(15-name.length+1)
54
54
  end
55
55
 
56
+ # Public: only return url part of value - if no url has been
57
+ # detected returns value.
58
+ #
59
+ # Returns a String which preferably is a URL.
60
+ def url
61
+ @url ||= value.split(/\s+/).detect { |v| v =~ %r{\A[a-z0-9]+:\S+}i } || value
62
+ end
63
+
56
64
  # Public: creates a Hash for this Item.
57
65
  #
58
66
  # Returns a Hash of its data.
data/lib/boom/list.rb CHANGED
@@ -34,12 +34,14 @@ module Boom
34
34
  # Returns the String name.
35
35
  attr_accessor :name
36
36
 
37
- # Public: associates an Item with this List.
37
+ # Public: associates an Item with this List. If the item name is already
38
+ # defined, then the value will be replaced
38
39
  #
39
40
  # item - the Item object to associate with this List.
40
41
  #
41
42
  # Returns the current set of items.
42
43
  def add_item(item)
44
+ delete_item(item.name) if find_item(item.name)
43
45
  @items << item
44
46
  end
45
47
 
@@ -0,0 +1,54 @@
1
+ # coding: utf-8
2
+
3
+ # Platform is a centralized point to shell out platform specific functionality
4
+ # like clipboard access or commands to open URLs.
5
+ #
6
+ #
7
+ # Clipboard is a centralized point to shell out to each individual platform's
8
+ # clipboard, pasteboard, or whatever they decide to call it.
9
+ #
10
+ module Boom
11
+ class Platform
12
+ class << self
13
+
14
+ # Public: tests if currently running on darwin.
15
+ #
16
+ # Returns true if running on darwin (MacOS X), else false
17
+ def darwin?
18
+ !!(RUBY_PLATFORM =~ /darwin/)
19
+ end
20
+
21
+ # Public: returns the command used to open a file or URL
22
+ # for the current platform.
23
+ #
24
+ # Currently only supports MacOS X and Linux with `xdg-open`.
25
+ #
26
+ # Returns a String with the bin
27
+ def open_command
28
+ darwin? ? 'open' : 'xdg-open'
29
+ end
30
+
31
+ # Public: opens a given Item's value in the browser. This
32
+ # method is designed to handle multiple platforms.
33
+ #
34
+ # Returns a String explaining what was done
35
+ def open(item)
36
+ `#{open_command} '#{item.url.gsub("\'","\\'")}'`
37
+
38
+ "Boom! We just opened #{item.value} for you."
39
+ end
40
+
41
+ # Public: copies a given Item's value to the clipboard. This method is
42
+ # designed to handle multiple platforms.
43
+ #
44
+ # Returns a String explaining what was done
45
+ def copy(item)
46
+ copy_command = darwin? ? "pbcopy" : "xclip -selection clipboard"
47
+
48
+ `echo '#{item.value.gsub("\'","\\'")}' | tr -d "\n" | #{copy_command}`
49
+
50
+ "Boom! We just copied #{item.value} to your clipboard."
51
+ end
52
+ end
53
+ end
54
+ end
data/lib/boom.rb CHANGED
@@ -10,7 +10,7 @@ require 'yajl'
10
10
 
11
11
  $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
12
12
 
13
- require 'boom/clipboard'
13
+ require 'boom/platform'
14
14
  require 'boom/command'
15
15
  require 'boom/item'
16
16
  require 'boom/list'
@@ -19,7 +19,7 @@ require 'boom/storage'
19
19
  require 'boom/core_ext/symbol'
20
20
 
21
21
  module Boom
22
- VERSION = '0.0.9'
22
+ VERSION = '0.0.10'
23
23
 
24
24
  def self.storage
25
25
  @storage ||= Boom::Storage.new
data/test/test_command.rb CHANGED
@@ -63,12 +63,29 @@ class TestCommand < Test::Unit::TestCase
63
63
  assert_match /copied https:\/\/github\.com to your clipboard/,
64
64
  command('urls github')
65
65
  end
66
+
67
+ def test_item_open_url
68
+ Boom::Platform.stubs(:open_command).returns("echo")
69
+ assert_match /opened https:\/\/github\.com for you/,
70
+ command('open github')
71
+ end
72
+
73
+ def test_item_open_lists
74
+ Boom::Platform.stubs(:open_command).returns("echo")
75
+ assert_match /opened all of \"urls\" for you/,
76
+ command('open urls')
77
+ end
66
78
 
67
79
  def test_item_creation
68
80
  assert_match /"twitter" in "urls"/,
69
81
  command('urls twitter http://twitter.com/holman')
70
82
  end
71
83
 
84
+ def test_item_creation_long_value
85
+ assert_match /is "tanqueray hendricks bombay"/,
86
+ command('urls gins tanqueray hendricks bombay')
87
+ end
88
+
72
89
  def test_list_deletion_no
73
90
  STDIN.stubs(:gets).returns('n')
74
91
  assert_match /Just kidding then/, command('urls delete')
@@ -102,4 +119,24 @@ class TestCommand < Test::Unit::TestCase
102
119
  def test_nonexistent_item_access_scoped_by_list
103
120
  assert_match /"twitter" not found in "urls"/, command('urls twitter')
104
121
  end
122
+
123
+ def test_echo_item
124
+ assert_match /https:\/\/github\.com/, command('echo github')
125
+ end
126
+
127
+ def test_echo_item_shorthand
128
+ assert_match /https:\/\/github\.com/, command('e github')
129
+ end
130
+
131
+ def test_echo_item_does_not_exist
132
+ assert_match /"wrong" not found/, command('echo wrong')
133
+ end
134
+
135
+ def test_echo_list_item
136
+ assert_match /https:\/\/github\.com/, command('echo urls github')
137
+ end
138
+
139
+ def test_echo_list_item_does_not_exist
140
+ assert_match /"wrong" not found in "urls"/, command('echo urls wrong')
141
+ end
105
142
  end
data/test/test_item.rb CHANGED
@@ -38,4 +38,17 @@ class TestItem < Test::Unit::TestCase
38
38
  assert_equal 1, @item.to_hash.size
39
39
  end
40
40
 
41
+ def test_url
42
+ assert_equal 'https://github.com', @item.url
43
+ end
44
+
45
+ def test_url_with_additional_description
46
+ @item = Boom::Item.new('github', 'social coding https://github.com')
47
+ assert_equal 'https://github.com', @item.url
48
+ end
49
+
50
+ def test_url_without_url
51
+ @item = Boom::Item.new('didum', 'dadam lol omg')
52
+ assert_equal 'dadam lol omg', @item.url
53
+ end
41
54
  end
data/test/test_list.rb CHANGED
@@ -20,6 +20,16 @@ class TestList < Test::Unit::TestCase
20
20
  assert_equal 1, @list.items.size
21
21
  end
22
22
 
23
+ def test_add_item_with_duplicate_name
24
+ @list.add_item(@item)
25
+ assert_equal 1, @list.items.size
26
+ assert_equal 'https://github.com', @list.find_item('github').value
27
+ @diff_item = Boom::Item.new('github', 'https://github.com/home')
28
+ @list.add_item(@diff_item)
29
+ assert_equal 1, @list.items.size
30
+ assert_equal 'https://github.com/home', @list.find_item('github').value
31
+ end
32
+
23
33
  def test_to_hash
24
34
  assert_equal 0, @list.to_hash[@list.name].size
25
35
  @list.add_item(@item)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: boom
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 11
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 9
10
- version: 0.0.9
9
+ - 10
10
+ version: 0.0.10
11
11
  platform: ruby
12
12
  authors:
13
13
  - Zach Holman
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-10 00:00:00 -08:00
18
+ date: 2011-01-26 00:00:00 -08:00
19
19
  default_executable: boom
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -73,12 +73,14 @@ files:
73
73
  - Rakefile
74
74
  - bin/boom
75
75
  - boom.gemspec
76
+ - completion/boom.bash
77
+ - completion/boom.zsh
76
78
  - lib/boom.rb
77
- - lib/boom/clipboard.rb
78
79
  - lib/boom/command.rb
79
80
  - lib/boom/core_ext/symbol.rb
80
81
  - lib/boom/item.rb
81
82
  - lib/boom/list.rb
83
+ - lib/boom/platform.rb
82
84
  - lib/boom/storage.rb
83
85
  - test/examples/urls.json
84
86
  - test/helper.rb
@@ -1,29 +0,0 @@
1
- # coding: utf-8
2
-
3
- # Clipboard is a centralized point to shell out to each individual platform's
4
- # clipboard, pasteboard, or whatever they decide to call it.
5
- #
6
- module Boom
7
- class Clipboard
8
- class << self
9
-
10
- # Public: copies a given Item's value to the clipboard. This method is
11
- # designed to handle multiple platforms.
12
- #
13
- # Returns nothing.
14
- def copy(item)
15
- copy_command =
16
- if RUBY_PLATFORM =~ /darwin/
17
- "pbcopy"
18
- else
19
- "xclip -selection clipboard"
20
- end
21
-
22
- `echo '#{item.value.gsub("\'","\\'")}' | tr -d "\n" | #{copy_command}`
23
-
24
- "Boom! We just copied #{item.value} to your clipboard."
25
- end
26
-
27
- end
28
- end
29
- end