boom 0.0.2 → 0.0.3

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.
@@ -81,6 +81,13 @@ can have multiple lists.
81
81
  blog: http://zachholman.com
82
82
  github: https://github.com
83
83
 
84
+ ** Manual edit **
85
+
86
+ If you want to edit the underlying JSON directly, make sure your `$EDITOR`
87
+ environment variable is set, and run:
88
+
89
+ $ boom edit
90
+
84
91
  ** It's just the command line, silly **
85
92
 
86
93
  So don't forget all your other favorites are there to help you, too:
data/bin/boom CHANGED
@@ -4,5 +4,4 @@ $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
4
4
 
5
5
  require 'boom'
6
6
 
7
- storage = Boom::Storage.new
8
- Boom::Command.execute(storage,*ARGV)
7
+ Boom::Command.execute(*ARGV)
@@ -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.2'
17
- s.date = '2010-11-24'
16
+ s.version = '0.0.3'
17
+ s.date = '2010-11-28'
18
18
  s.rubyforge_project = 'boom'
19
19
 
20
20
  ## Make sure your summary is short. The description may be as long
@@ -15,5 +15,9 @@ require 'boom/list'
15
15
  require 'boom/storage'
16
16
 
17
17
  module Boom
18
- VERSION = '0.0.2'
18
+ VERSION = '0.0.3'
19
+
20
+ def self.storage
21
+ @storage ||= Boom::Storage.new
22
+ end
19
23
  end
@@ -10,18 +10,18 @@ module Boom
10
10
  class Command
11
11
  class << self
12
12
 
13
- attr_accessor :storage
13
+ # Public: accesses the in-memory JSON representation.
14
+ #
15
+ # Returns a Storage instance.
16
+ def storage
17
+ Boom.storage
18
+ end
14
19
 
15
20
  # Public: executes a command.
16
21
  #
17
- # storage - The Storage instance off which to run commands. This is
18
- # likely just Boom::Storage.new, since Boom::Storage should
19
- # pick up the appropriate JSON file paths on its own.
20
22
  # args - The actual commands to operate on. Can be as few as zero
21
23
  # arguments or as many as three.
22
- def execute(storage,*args)
23
- @storage = storage
24
-
24
+ def execute(*args)
25
25
  command = args[0]
26
26
  major = args[1]
27
27
  minor = args[2]
@@ -67,7 +67,8 @@ module Boom
67
67
  #
68
68
  # Returns output based on method calls.
69
69
  def delegate(command, major, minor)
70
- return all if command == 'all'
70
+ return all if command == 'all'
71
+ return edit if command == 'edit'
71
72
 
72
73
  # if we're operating on a List
73
74
  if storage.list_exists?(command)
@@ -90,11 +91,11 @@ module Boom
90
91
 
91
92
  # Public: prints all Items over a List.
92
93
  #
93
- # list - the List object to iterate over
94
+ # name - the List object to iterate over
94
95
  #
95
96
  # Returns nothing.
96
- def list_detail(list_name)
97
- list = storage.lists.find { |list| list.name == list_name }
97
+ def list_detail(name)
98
+ list = List.find(name)
98
99
  list.items.sort{ |x,y| x.name <=> y.name }.each do |item|
99
100
  output " #{item.name}: #{item.value}"
100
101
  end
@@ -126,10 +127,9 @@ module Boom
126
127
  #
127
128
  # Returns nothing.
128
129
  def list_delete(name)
129
- lists = storage.lists.reverse.reject { |list| list.name == name }
130
130
  output "You sure you want to delete everything in \"#{name}\"? (y/n):"
131
131
  if $stdin.gets.chomp == 'y'
132
- storage.lists = lists
132
+ List.delete(name)
133
133
  output "Boom! Deleted all your #{name}."
134
134
  save!
135
135
  else
@@ -149,7 +149,7 @@ module Boom
149
149
  #
150
150
  # Returns the newly created Item.
151
151
  def add_item(list,name,value)
152
- list = storage.lists.find{|storage_list| storage_list.name == list}
152
+ list = List.find(list)
153
153
  list.add_item(Item.new(name,value))
154
154
  output "Boom! \"#{name}\" in \"#{list.name}\" is \"#{value}\". Got it."
155
155
  save!
@@ -194,7 +194,7 @@ module Boom
194
194
  #
195
195
  # Returns the matching Item.
196
196
  def search_list_for_item(list_name, item_name)
197
- list = storage.lists.first { |list| list.name == list_name }
197
+ list = List.find(list_name)
198
198
  item = list.items.first { |item| item.name == item_name }
199
199
 
200
200
  output Clipboard.copy(item)
@@ -207,6 +207,15 @@ module Boom
207
207
  storage.save!
208
208
  end
209
209
 
210
+ # Public: launches JSON file in an editor for you to edit manually. Uses
211
+ # the $EDITOR environment variable for editing.
212
+ #
213
+ # Returns nothing.
214
+ def edit
215
+ system "`echo $EDITOR` #{storage.json_file} &"
216
+ output "Boom! Make your edits, and do be sure to save."
217
+ end
218
+
210
219
  end
211
220
  end
212
221
  end
@@ -2,7 +2,8 @@
2
2
  # individual Items. The relationship is maintained in a simple array on the
3
3
  # List-level.
4
4
  #
5
- module Boom class List
5
+ module Boom
6
+ class List
6
7
 
7
8
  # Public: creates a new List instance in-memory.
8
9
  #
@@ -14,6 +15,13 @@ module Boom class List
14
15
  @name = name
15
16
  end
16
17
 
18
+ # Public: accesses the in-memory JSON representation.
19
+ #
20
+ # Returns a Storage instance.
21
+ def self.storage
22
+ Boom.storage
23
+ end
24
+
17
25
  # Public: lets you access the array of items contained within this List.
18
26
  #
19
27
  # Returns an Array of Items.
@@ -33,6 +41,26 @@ module Boom class List
33
41
  @items << item
34
42
  end
35
43
 
44
+ # Public: finds any given List by name.
45
+ #
46
+ # name - String name of the list to search for
47
+ #
48
+ # Returns the first instance of List that it finds.
49
+ def self.find(name)
50
+ storage.lists.find { |list| list.name == name }
51
+ end
52
+
53
+ # Public: deletes a List by name.
54
+ #
55
+ # name - String name of the list to delete
56
+ #
57
+ # Returns whether one or more lists were removed.
58
+ def self.delete(name)
59
+ previous = storage.lists.size
60
+ storage.lists = storage.lists.reject { |list| list.name == name }
61
+ previous != storage.lists.size
62
+ end
63
+
36
64
  # Public: a Hash representation of this List.
37
65
  #
38
66
  # Returns a Hash of its own data and its child Items.
@@ -75,7 +75,7 @@ module Boom
75
75
  #
76
76
  # Returns a String JSON representation of its Lists and their Items.
77
77
  def to_json
78
- Yajl::Encoder.encode(to_hash)
78
+ Yajl::Encoder.encode(to_hash, :pretty => true)
79
79
  end
80
80
 
81
81
  # Public: creates a Hash of the representation of the in-memory data
@@ -13,21 +13,8 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
13
13
 
14
14
  require 'boom'
15
15
 
16
- # test/spec/mini 3
17
- # http://gist.github.com/25455
18
- # chris@ozmm.org
19
- # file:lib/test/spec/mini.rb
20
- def context(*args, &block)
21
- return super unless (name = args.first) && block
22
- require 'test/unit'
23
- klass = Class.new(defined?(ActiveSupport::TestCase) ? ActiveSupport::TestCase : Test::Unit::TestCase) do
24
- def self.test(name, &block)
25
- define_method("test_#{name.gsub(/\W/,'_')}", &block) if block
26
- end
27
- def self.xtest(*args) end
28
- def self.setup(&block) define_method(:setup, &block) end
29
- def self.teardown(&block) define_method(:teardown, &block) end
30
- end
31
- (class << klass; self end).send(:define_method, :name) { name.gsub(/\W/,'_') }
32
- klass.class_eval &block
16
+ def boom_json(name)
17
+ Boom::Storage.any_instance.stubs(:json_file).
18
+ returns("test/examples/#{name}.json")
19
+ Boom.stubs(:storage).returns(Boom::Storage.new)
33
20
  end
@@ -24,15 +24,13 @@ end
24
24
  class TestCommand < Test::Unit::TestCase
25
25
 
26
26
  def setup
27
- Boom::Storage.any_instance.stubs(:json_file).
28
- returns('test/examples/urls.json')
29
- @storage = Boom::Storage.new
27
+ boom_json :urls
30
28
  end
31
29
 
32
30
  def command(cmd)
33
31
  cmd = cmd.split(' ') if cmd
34
32
  Boom::Command.capture_output
35
- Boom::Command.execute(@storage,*cmd)
33
+ Boom::Command.execute(*cmd)
36
34
  Boom::Command.captured_output
37
35
  end
38
36
 
@@ -82,4 +80,9 @@ class TestCommand < Test::Unit::TestCase
82
80
  def test_item_deletion
83
81
  assert_match /"github" is gone forever/, command('urls github delete')
84
82
  end
83
+
84
+ def test_edit
85
+ Boom::Command.stubs(:system).returns('')
86
+ assert_match 'Make your edits', command('edit')
87
+ end
85
88
  end
@@ -5,6 +5,7 @@ class TestList < Test::Unit::TestCase
5
5
  def setup
6
6
  @list = Boom::List.new('urls')
7
7
  @item = Boom::Item.new('github','https://github.com')
8
+ boom_json :urls
8
9
  end
9
10
 
10
11
  def test_name
@@ -23,4 +24,20 @@ class TestList < Test::Unit::TestCase
23
24
  assert_equal 1, @list.to_hash[@list.name].size
24
25
  end
25
26
 
27
+ def test_find
28
+ assert_equal 'urls', Boom::List.find('urls').name
29
+ end
30
+
31
+ def test_delete_success
32
+ assert_equal 1, Boom.storage.lists.size
33
+ assert Boom::List.delete('urls')
34
+ assert_equal 0, Boom.storage.lists.size
35
+ end
36
+
37
+ def test_delete_fail
38
+ assert_equal 1, Boom.storage.lists.size
39
+ assert !Boom::List.delete('robocop')
40
+ assert_equal 1, Boom.storage.lists.size
41
+ end
42
+
26
43
  end
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: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
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: 2010-11-24 00:00:00 -08:00
18
+ date: 2010-11-28 00:00:00 -08:00
19
19
  default_executable: boom
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency