pry-note 0.2.1 → 0.2.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.
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ direc = File.dirname(__FILE__)
6
6
  PROJECT_NAME = "pry-note"
7
7
 
8
8
  require 'rake/clean'
9
- require 'rake/gempackagetask'
9
+ require 'rubygems/package_task'
10
10
  require "#{PROJECT_NAME}/version"
11
11
 
12
12
  CLOBBER.include("**/*~", "**/*#*", "**/*.log")
@@ -28,11 +28,21 @@ def apply_spec_defaults(s)
28
28
  s.test_files = `git ls-files -- test/*`.split("\n")
29
29
  end
30
30
 
31
+ desc "Set up and run tests"
32
+ task :default => [:test]
33
+
34
+
31
35
  desc "run pry with plugin enabled"
32
36
  task :pry do
33
37
  exec("pry -rubygems -I#{direc}/lib/ -r #{direc}/lib/#{PROJECT_NAME}")
34
38
  end
35
39
 
40
+ desc "Run tests"
41
+ task :test do
42
+ sh "bacon -Itest -rubygems -a -q"
43
+ end
44
+ task :spec => :test
45
+
36
46
  desc "Show version"
37
47
  task :version do
38
48
  puts "Pry-note version: #{PryNote::VERSION}"
@@ -47,7 +57,7 @@ namespace :ruby do
47
57
  s.platform = Gem::Platform::RUBY
48
58
  end
49
59
 
50
- Rake::GemPackageTask.new(spec) do |pkg|
60
+ Gem::PackageTask.new(spec) do |pkg|
51
61
  pkg.need_zip = false
52
62
  pkg.need_tar = false
53
63
  end
@@ -1,222 +1,27 @@
1
- Pry.config.notes_file = "./notes.yml"
2
-
3
- Pry::Commands.create_command "note" do
4
- description "Note stuff."
5
-
6
- banner <<-USAGE
7
- Usage: note [OPTIONS]
8
- Add notes to classes and methods.
9
-
10
- e.g note -a Pry#repl "this is my note" #=> add a note without opening editor
11
- e.g note -a Pry#repl #=> add a note (with editor) to Pry#repl method
12
- e.g note -d Pry#repl:1 #=> delete the 1st note from Pry#repl
13
- e.g note -d Pry#repl #=> delete all notes from Pry#repl
14
- e.g note -l #=> list all notes
15
- USAGE
16
-
17
- def options(opt)
18
- opt.on :a, :add, "Add a note to a method or class.", :argument => true
19
- opt.on :s, :show, "Show any notes associated with the given method or class.", :argument => true
20
- opt.on :d, :delete, "Delete notes for a method or class.", :argument => true
21
- opt.on "delete-all", "Delete all notes."
22
- opt.on :e, :export, "Export notes to a file.", :argument => :optional
23
- opt.on :load, "Load notes from a file.", :argument => :optional
24
- opt.on :l, :list, "List all notes."
25
- opt.on "list-all", "List all notes with content."
26
- end
27
-
28
- def setup
29
- if !state.initial_setup_complete
30
- add_reminders
31
- load_notes
32
- state.initial_setup_complete = true
33
- _pry_.hooks.add_hook(:after_session, :export_notes) { export_notes }
34
- end
35
- end
36
-
37
- def notes
38
- state.notes ||= {}
39
- end
40
-
41
- # edit a note in a temporary file and return note content
42
- def edit_note(obj_name)
43
- temp_file do |f|
44
- f.puts("Enter note content here for #{obj_name} (and erase this line)")
45
- f.flush
46
- f.close(false)
47
- invoke_editor(f.path, 1, false)
48
- File.read(f.path)
49
- end
50
- end
51
-
52
- def process
53
- if opts.present?(:add)
54
- add_note(opts[:a])
55
- elsif opts.present?(:show)
56
- show_note(opts[:s])
57
- elsif opts.present?(:list)
58
- list_notes
59
- elsif opts.present?(:export)
60
- export_notes(opts[:e])
61
- elsif opts.present?(:delete)
62
- delete_note(opts[:d])
63
- elsif opts.present?(:"delete-all")
64
- notes.replace({})
65
- elsif opts.present?(:"list-all")
66
- list_all
67
- elsif opts.present?(:load)
68
- load_notes(opts[:load])
69
- else
70
- meth = Pry::Method.from_binding(target)
71
- if internal_binding?(target) || !meth
72
- obj = target.eval("self")
73
- obj_name = obj.is_a?(Module) ? obj.name : obj.class.name
74
- add_note(obj_name)
75
- else
76
- add_note(meth.name_with_owner)
77
- end
78
- end
79
- end
80
-
81
- def retrieve_code_object_safely(name)
82
- code_object = retrieve_code_object_from_string(name, target)
83
-
84
- if !code_object
85
- raise Pry::CommandError, "No code object found named #{name}"
86
- elsif code_object.name.to_s == ""
87
- raise Pry::CommandError, "Object #{name} doesn't have a proper name, can't create note"
88
- end
89
-
90
- code_object
91
- end
92
-
93
- def code_object_name(co)
94
- co.is_a?(Pry::Method) ? co.name_with_owner : co.name
95
- end
96
-
97
- def add_note(name)
98
- co_name = code_object_name(retrieve_code_object_safely(name))
99
-
100
- if args.any?
101
- note = args.join(" ")
102
- else
103
- note = edit_note(co_name)
104
- end
105
-
106
- notes[co_name] ||= []
107
- notes[co_name] << note
108
-
109
- output.puts "Added note to #{co_name}!"
110
- end
111
-
112
- def delete_note(name)
113
- name, note_number = name.split(":")
114
- co_name = code_object_name(retrieve_code_object_safely(name))
1
+ require 'yaml'
2
+ require 'pry-note/version'
3
+ require 'pry-note/hooks'
4
+ require 'pry-note/commands'
115
5
 
116
- if !notes[co_name]
117
- output.puts "No notes to delete for #{co_name}!"
118
- elsif note_number
119
- notes[co_name].delete_at(note_number.to_i - 1)
120
- notes.delete(co_name) if notes[co_name].empty?
121
- output.puts "Deleted note #{note_number} for #{co_name}!"
122
- else
123
- notes.delete(co_name)
124
- output.puts "Deleted all notes for #{text.bold(co_name)}!"
125
- end
126
- end
127
-
128
- def show_note(name)
129
- code_object = retrieve_code_object_safely(name)
130
-
131
- co_name = code_object_name(code_object)
132
-
133
- if !notes.has_key?(co_name)
134
- output.puts "No notes saved for #{text.bold(co_name)}"
135
- return
136
- end
137
-
138
- output.puts text.bold("#{co_name}:\n--")
139
-
140
- notes[code_object_name(code_object)].each_with_index do |note, index|
141
- output.puts "\nNote #{text.bold((index + 1).to_s)}: #{note}"
142
- end
143
- end
144
-
145
- def export_notes(file_name=nil)
146
- require 'yaml'
147
- file_name ||= Pry.config.notes_file
6
+ Pry.config.notes_file = "./notes.yml"
148
7
 
149
- expanded_path = File.expand_path(file_name)
150
- File.open(expanded_path, "w") { |f| f.puts YAML.dump(notes) }
151
- output.puts "Exported notes to #{expanded_path}!"
152
- end
8
+ module PryNote
9
+ def self.notes() @notes ||= {}; end
10
+ def self.notes=(o) @notes = o; end
153
11
 
154
- def load_notes(file_name=nil)
155
- require 'yaml'
12
+ def self.load_notes(file_name=nil)
13
+ return if !file_name && !Pry.config.notes_file
156
14
  file_name ||= Pry.config.notes_file
157
-
158
15
  expanded_path = File.expand_path(file_name)
159
16
  if File.exists?(expanded_path)
160
- notes.replace YAML.load File.read(expanded_path)
161
- end
162
- end
163
-
164
- def list_all
165
- if notes.any?
166
- output.puts text.bold("Showing all available notes:\n\n")
167
- notes.each do |key, content|
168
- begin
169
- show_note(key)
170
- output.puts "\n"
171
- rescue
172
- end
173
- end
174
-
175
- output.puts "\nTo view notes for an item type, e.g: `note -s Klass#method`"
176
- else
177
- output.puts "No notes available."
17
+ PryNote.notes = YAML.load File.read(expanded_path)
178
18
  end
179
19
  end
180
20
 
181
- def list_notes
182
- if notes.any?
183
- output.puts text.bold("Showing all available notes:\n\n")
184
- notes.each do |key, content|
185
- if retrieve_code_object_from_string(key, target)
186
- output.puts "#{text.bold(key)} has #{content.count} notes"
187
- end
188
- end
189
-
190
- output.puts "\nTo view notes for an item type, e.g: `note -s Klass#method`"
191
- else
192
- output.puts "No notes available."
193
- end
194
- end
195
-
196
- def add_reminders
197
- me = self
198
- reminder = proc do
199
- begin
200
- code_object = retrieve_code_object_from_string(args.first.to_s, target)
201
- if me.notes.keys.include?(me.code_object_name(code_object))
202
- co_name = me.code_object_name(code_object)
203
- output.puts "\n\n#{text.bold("Notes:")}\n--\n\n"
204
-
205
- me.notes[me.code_object_name(code_object)].each_with_index do |note, index|
206
- clipped_note = note.lines.count < 3 ? note : note.lines.to_a[0..2].join +
207
- text.bold("<...clipped...>") + " Use `note -s #{co_name}` to view unelided notes."
208
- amended_note = clipped_note.lines.each_with_index.map do |line, idx|
209
- idx > 0 ? "#{' ' * ((index + 1).to_s.size + 2)}#{line}" : line
210
- end.join
211
- output.puts "#{text.bold((index + 1).to_s)}. #{amended_note}"
212
- end
213
-
214
- end
215
- rescue
216
- end
217
- end
218
-
219
- _pry_.commands.after_command("show-source", &reminder)
220
- _pry_.commands.after_command("show-doc", &reminder)
21
+ def self.export_notes(file_name=nil)
22
+ return if !file_name && !Pry.config.notes_file
23
+ file_name ||= Pry.config.notes_file
24
+ expanded_path = File.expand_path(file_name)
25
+ File.open(expanded_path, "w") { |f| f.puts YAML.dump(PryNote.notes) }
221
26
  end
222
27
  end
@@ -0,0 +1,242 @@
1
+ Pry::Commands.create_command "note" do
2
+ description "Note stuff."
3
+
4
+ banner <<-USAGE
5
+ Usage: note [OPTIONS]
6
+ Add notes to classes and methods.
7
+
8
+ e.g note -a Pry#repl "this is my note" #=> add a note without opening editor
9
+ e.g note -a Pry#repl #=> add a note (with editor) to Pry#repl method
10
+ e.g note -d Pry#repl:1 #=> delete the 1st note from Pry#repl
11
+ e.g note -d Pry#repl #=> delete all notes from Pry#repl
12
+ e.g note -l #=> list all notes
13
+ USAGE
14
+
15
+ def subcommands(cmd)
16
+ cmd.on :add do |opt|
17
+ opt.on :m, "message", "Provide the note inline (without opening an editor).", :argument => true
18
+ end
19
+
20
+ cmd.on :show do |opt|
21
+ opt.on :v, :verbose, "Show all notes together with source code."
22
+ end
23
+
24
+ cmd.on :list do |opt|
25
+ opt.on :v, :verbose, "List all notes and content with source code."
26
+ end
27
+ cmd.on :export
28
+ cmd.on :load
29
+ cmd.on :delete do |opt|
30
+ opt.on :all, "Delete all notes."
31
+ end
32
+
33
+ cmd.on :edit do |opt|
34
+ opt.on :m, "message", "Update the note inline (without opening an editor).", :argument => true
35
+ end
36
+ end
37
+
38
+ def notes() PryNote.notes ||= {} end
39
+ def notes=(o) PryNote.notes = o; end
40
+
41
+ # edit a note in a temporary file and return note content
42
+ def edit_note(obj_name, initial_content=nil)
43
+ initial_content ||= "Enter note content here for #{obj_name} (and erase this line)"
44
+ temp_file do |f|
45
+ f.puts(initial_content)
46
+ f.flush
47
+ f.close(false)
48
+ invoke_editor(f.path, 1, false)
49
+ File.read(f.path)
50
+ end
51
+ end
52
+
53
+ def process
54
+ if opts.command?(:add)
55
+ cmd_opts = opts[:add]
56
+ add_note(opts.arguments.first, cmd_opts[:message])
57
+ elsif opts.command?(:show)
58
+ cmd_opts = opts[:show]
59
+ stagger_output create_note_output(opts.arguments.first, cmd_opts[:verbose])
60
+ elsif opts.command?(:list)
61
+ cmd_opts = opts[:list]
62
+ if cmd_opts.present?(:verbose)
63
+ list_all
64
+ else
65
+ list_notes
66
+ end
67
+ elsif opts.command?(:edit)
68
+ cmd_opts = opts[:edit]
69
+ reedit_note(opts.arguments.first, cmd_opts[:message])
70
+ elsif opts.command?(:export)
71
+ f = opts.arguments.first
72
+ PryNote.export_notes(f)
73
+ output.puts "Exported notes to #{f}"
74
+ elsif opts.command?(:delete)
75
+ cmd_opts = opts[:delete]
76
+ if cmd_opts.present?(:all)
77
+ notes.replace({})
78
+ output.puts "Deleted all notes!"
79
+ else
80
+ delete_note(opts.arguments.first)
81
+ end
82
+ elsif opts.command?(:load)
83
+ PryNote.load_notes(opts.arguments.first)
84
+ else
85
+ output.puts opts.to_s
86
+ end
87
+ end
88
+
89
+ def retrieve_code_object_safely(name)
90
+ code_object = retrieve_code_object_from_string(name, target)
91
+
92
+ if !code_object
93
+ raise Pry::CommandError, "No code object found named #{name}"
94
+ elsif code_object.name.to_s == ""
95
+ raise Pry::CommandError, "Object #{name} doesn't have a proper name, can't create note"
96
+ end
97
+
98
+ code_object
99
+ end
100
+
101
+ def default_object_name
102
+ meth = Pry::Method.from_binding(target)
103
+ if internal_binding?(target) || !meth
104
+ obj = target.eval("self")
105
+ obj_name = obj.is_a?(Module) ? obj.name : obj.class.name
106
+ obj_name
107
+ else
108
+ meth.name_with_owner
109
+ end
110
+ end
111
+
112
+ def code_object_name(co)
113
+ co.is_a?(Pry::Method) ? co.name_with_owner : co.name
114
+ end
115
+
116
+ def add_note(name, message=nil)
117
+ name ||= default_object_name
118
+ co_name = code_object_name(retrieve_code_object_safely(name))
119
+
120
+ if message
121
+ note = message
122
+ else
123
+ note = edit_note(co_name)
124
+ end
125
+
126
+ notes[co_name] ||= []
127
+ notes[co_name] << note
128
+
129
+ output.puts "Added note to #{co_name}!"
130
+ end
131
+
132
+ def reedit_note(name, message=nil)
133
+ name, note_number_s = name.split(/:(\d+)$/)
134
+ co_name = code_object_name(retrieve_code_object_safely(name))
135
+ raise Pry::CommandError, "No notes to edit!" if !notes[co_name]
136
+
137
+ total_notes = notes[co_name].count
138
+ note_number = note_number_s.to_i
139
+
140
+ out = ""
141
+ if !notes[co_name]
142
+ out << "No notes to edit for #{co_name}!\n"
143
+ elsif !note_number_s
144
+ raise Pry::CommandError, "Must specify a note number. Allowable range is 1-#{total_notes}."
145
+ elsif note_number < 1 || note_number > total_notes
146
+ raise Pry::CommandError, "Invalid note number (#{note_number}). Allowable range is 1-#{total_notes}."
147
+ else
148
+ if message
149
+ new_content = message
150
+ else
151
+ old_content = notes[co_name][note_number.to_i - 1]
152
+ new_content = edit_note(co_name, old_content.to_s)
153
+ end
154
+
155
+ notes[co_name][note_number.to_i - 1] = new_content
156
+ out << "Updated note #{note_number} for #{co_name}!\n"
157
+ end
158
+ end
159
+
160
+ def delete_note(name)
161
+ name, note_number = name.split(/:(\d+)$/)
162
+ co_name = code_object_name(retrieve_code_object_safely(name))
163
+
164
+ out = ""
165
+ if !notes[co_name]
166
+ out << "No notes to delete for #{co_name}!\n"
167
+ elsif note_number
168
+ notes[co_name].delete_at(note_number.to_i - 1)
169
+ notes.delete(co_name) if notes[co_name].empty?
170
+ out << "Deleted note #{note_number} for #{co_name}!\n"
171
+ else
172
+ notes.delete(co_name)
173
+ out << "Deleted all notes for #{text.bold(co_name)}!\n"
174
+ end
175
+
176
+ stagger_output out
177
+ end
178
+
179
+ def create_note_output(name, verbose=false)
180
+ name ||= default_object_name
181
+ name, _ = name.split(/:(\d+)$/)
182
+ code_object = retrieve_code_object_safely(name)
183
+ co_name = code_object_name(code_object)
184
+
185
+ raise Pry::CommandError, "Please specify the name of a method or class." if !name
186
+
187
+ if !notes.has_key?(co_name)
188
+ raise Pry::CommandError, "No notes saved for #{text.bold(co_name)}"
189
+ end
190
+
191
+ out = ""
192
+ out << text.bold("#{co_name}:\n--\n")
193
+
194
+ if verbose
195
+ out << Pry::Code.new(code_object.source, code_object.source_line).with_line_numbers.to_s + "\n"
196
+ end
197
+ notes[code_object_name(code_object)].each_with_index do |note, index|
198
+ out << "\nNote #{text.bold((index + 1).to_s)}: #{note}"
199
+ end
200
+
201
+ out
202
+ end
203
+
204
+ def list_all
205
+ if notes.any?
206
+ out = ""
207
+ out << text.bold("Showing all available notes:\n\n")
208
+ notes.each do |key, content|
209
+ begin
210
+ out << create_note_output(key, true) << "\n"
211
+ rescue
212
+ end
213
+ end
214
+
215
+ else
216
+ out << "No notes available.\n"
217
+ end
218
+
219
+ stagger_output out
220
+ end
221
+
222
+ def list_notes
223
+ if notes.any?
224
+ out = ""
225
+ out << text.bold("Showing all available notes:\n\n")
226
+ notes.each do |key, content|
227
+ begin
228
+ if retrieve_code_object_from_string(key, target)
229
+ out << "#{text.bold(key)} has #{content.count} notes\n"
230
+ end
231
+ rescue
232
+ end
233
+ end
234
+
235
+ out << "\nTo view notes for a specific item, e.g: `note show Klass#method`\n"
236
+ else
237
+ out << "No notes available.\n"
238
+ end
239
+
240
+ stagger_output out
241
+ end
242
+ end
@@ -0,0 +1,31 @@
1
+ reminder = proc do
2
+ begin
3
+ co = Pry::Helpers::CommandHelpers.retrieve_code_object_from_string(args.first.to_s, target)
4
+ co_name = co.is_a?(Pry::Method) ? co.name_with_owner : co.name
5
+ if PryNote.notes.keys.include?(co_name)
6
+ output.puts "\n\n#{text.bold("Notes:")}\n--\n\n"
7
+
8
+ PryNote.notes[co_name].each_with_index do |note, index|
9
+ clipped_note = note.lines.count < 3 ? note : note.lines.to_a[0..2].join +
10
+ text.bold("<...clipped...>") + " Use `note show #{co_name}` to view unelided notes."
11
+ amended_note = clipped_note.lines.each_with_index.map do |line, idx|
12
+ idx > 0 ? "#{' ' * ((index + 1).to_s.size + 2)}#{line}" : line
13
+ end.join
14
+ output.puts "#{text.bold((index + 1).to_s)}. #{amended_note}"
15
+ end
16
+
17
+ end
18
+ rescue
19
+ end
20
+ end
21
+
22
+ Pry.commands.after_command("show-source", &reminder)
23
+ Pry.commands.after_command("show-doc", &reminder)
24
+
25
+ Pry.config.hooks.add_hook(:when_started, :load_notes) do
26
+ PryNote.load_notes if PryNote.notes.empty?
27
+ end
28
+
29
+ Pry.config.hooks.add_hook(:after_session, :export_notes) do
30
+ PryNote.export_notes
31
+ end
@@ -1,3 +1,3 @@
1
1
  module PryNote
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.3"
3
3
  end
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "pry-note"
5
+ s.version = "0.2.3"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["John Mair (banisterfiend)"]
9
+ s.date = "2012-12-01"
10
+ s.description = "Ease refactoring and exploration by attaching notes to methods and classes in Pry"
11
+ s.email = "jrmair@gmail.com"
12
+ s.files = ["Rakefile", "lib/pry-note.rb", "lib/pry-note/commands.rb", "lib/pry-note/hooks.rb", "lib/pry-note/version.rb", "pry-note.gemspec", "test/helper.rb", "test/test_pry_note.rb"]
13
+ s.homepage = "https://github.com/banister"
14
+ s.require_paths = ["lib"]
15
+ s.rubygems_version = "1.8.23"
16
+ s.summary = "Ease refactoring and exploration by attaching notes to methods and classes in Pry"
17
+ s.test_files = ["test/helper.rb", "test/test_pry_note.rb"]
18
+
19
+ if s.respond_to? :specification_version then
20
+ s.specification_version = 3
21
+
22
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
23
+ s.add_development_dependency(%q<rake>, ["~> 0.9"])
24
+ else
25
+ s.add_dependency(%q<rake>, ["~> 0.9"])
26
+ end
27
+ else
28
+ s.add_dependency(%q<rake>, ["~> 0.9"])
29
+ end
30
+ end
@@ -0,0 +1,26 @@
1
+ require 'pry/test/helper'
2
+
3
+ unless Object.const_defined? 'PryNote'
4
+ $:.unshift File.expand_path '../../lib', __FILE__
5
+ require 'pry-note'
6
+ end
7
+
8
+ # Ensure file is deleted before and after block
9
+ def cleanup_file(file_name)
10
+ f = File.expand_path(file_name)
11
+ File.unlink(f) if File.exists?(f)
12
+ yield
13
+ ensure
14
+ File.unlink(f) if File.exists?(f)
15
+ end
16
+
17
+ # Return any raised exceptino objects inside the block
18
+ def capture_exception
19
+ ex = nil
20
+ begin
21
+ yield
22
+ rescue Exception => e
23
+ ex = e
24
+ end
25
+ ex
26
+ end
@@ -0,0 +1,240 @@
1
+ require 'helper'
2
+
3
+ # useful test class
4
+ class PryNote::TestClass
5
+ def ping
6
+ binding
7
+ end
8
+ end
9
+
10
+ describe PryNote do
11
+ before do
12
+ Pad.obj = PryNote::TestClass.new
13
+ @t = pry_tester
14
+ PryNote.notes = {}
15
+ Pry.config.notes_file = nil
16
+ end
17
+
18
+ after do
19
+ Pad.clear
20
+ end
21
+
22
+ describe "note add" do
23
+ describe "opens an editor when -m flag not provided" do
24
+ it 'should open the editor' do
25
+ used_editor = nil
26
+ Pry.config.editor = proc { used_editor = true; nil }
27
+ @t.process_command "note add PryNote::TestClass"
28
+ used_editor.should == true
29
+ end
30
+
31
+ it 'should save the note' do
32
+ Pry.config.editor = proc { nil }
33
+ @t.process_command "note add PryNote::TestClass"
34
+ PryNote.notes["PryNote::TestClass"].count.should == 1
35
+ end
36
+
37
+ it 'should put default note content in file' do
38
+ Pry.config.editor = proc { nil }
39
+ @t.process_command "note add PryNote::TestClass"
40
+ PryNote.notes["PryNote::TestClass"].first.should =~ /Enter note content here/
41
+ end
42
+ end
43
+
44
+ describe "explicit object" do
45
+ it 'should add a new note for a method (bound method)' do
46
+ @t.process_command "note add Pad.obj.ping -m 'my note'"
47
+ @t.last_output.should =~ /Added note to PryNote::TestClass#ping/
48
+ PryNote.notes["PryNote::TestClass#ping"].first.should =~ /my note/
49
+ end
50
+
51
+ it 'should add a new note for a method (unbound method)' do
52
+ @t.process_command "note add PryNote::TestClass#ping -m 'my note'"
53
+ @t.last_output.should =~ /Added note to PryNote::TestClass#ping/
54
+ PryNote.notes["PryNote::TestClass#ping"].first.should =~ /my note/
55
+ end
56
+
57
+ it 'should add a new note for a class' do
58
+ @t.process_command "note add PryNote::TestClass -m 'my note'"
59
+ @t.last_output.should =~ /Added note to PryNote::TestClass/
60
+ PryNote.notes["PryNote::TestClass"].first.should =~ /my note/
61
+ end
62
+ end
63
+
64
+ describe "implicit object" do
65
+ it 'should add a new note for class of object implicitly (without specifying object)' do
66
+ @t.process_command "cd 0"
67
+ @t.process_command "note add -m 'my note'"
68
+ @t.last_output.should =~ /Added note to Fixnum/
69
+ PryNote.notes["Fixnum"].first.should =~ /my note/
70
+ end
71
+
72
+ it 'should add a new note for a method implicitly (without specifying object)' do
73
+ o = PryNote::TestClass.new
74
+ t = pry_tester(o.ping)
75
+ t.process_command "note add -m 'my note'"
76
+ t.last_output.should =~ /Added note to PryNote::TestClass#ping/
77
+ PryNote.notes["PryNote::TestClass#ping"].first.should =~ /my note/
78
+ end
79
+ end
80
+
81
+ describe "multiple notes can be added" do
82
+ it 'should add multiple notes' do
83
+ @t.process_command "note add PryNote::TestClass -m 'my note1'"
84
+ @t.process_command "note add PryNote::TestClass -m 'my note2'"
85
+ PryNote.notes["PryNote::TestClass"].count.should == 2
86
+ PryNote.notes["PryNote::TestClass"].first.should =~ /my note1/
87
+ PryNote.notes["PryNote::TestClass"].last.should =~ /my note2/
88
+ end
89
+ end
90
+ end
91
+
92
+ describe "note delete" do
93
+ it 'should delete all notes for an object' do
94
+ @t.process_command "note add PryNote::TestClass -m 'my note'"
95
+ PryNote.notes["PryNote::TestClass"].count.should == 1
96
+ @t.process_command "note delete PryNote::TestClass"
97
+ @t.last_output.should =~ /Deleted all notes for PryNote::TestClass/
98
+ PryNote.notes["PryNote::TestClass"].should == nil
99
+ end
100
+
101
+ it 'should NOT delete notes for unspecified object' do
102
+ @t.process_command "note add PryNote::TestClass -m 'my note'"
103
+ @t.process_command "note add PryNote::TestClass#ping -m 'my note'"
104
+ @t.process_command "note delete PryNote::TestClass"
105
+ PryNote.notes["PryNote::TestClass#ping"].count.should == 1
106
+ end
107
+
108
+ it 'should delete all notes for all objects' do
109
+ @t.process_command "note add PryNote::TestClass -m 'my note'"
110
+ @t.process_command "note add PryNote::TestClass#ping -m 'my note'"
111
+ PryNote.notes.keys.count.should == 2
112
+ @t.process_command "note delete --all"
113
+ @t.last_output.should =~ /Deleted all notes/
114
+ PryNote.notes.empty?.should == true
115
+ end
116
+
117
+ describe "deleting specific notes for an object" do
118
+ it 'should delete first note for an object' do
119
+ @t.process_command "note add PryNote::TestClass -m 'my note1'"
120
+ @t.process_command "note add PryNote::TestClass -m 'my note2'"
121
+ PryNote.notes["PryNote::TestClass"].count.should == 2
122
+ @t.process_command "note delete PryNote::TestClass:1"
123
+ @t.last_output.should =~ /Deleted note 1 for PryNote::TestClass/
124
+ PryNote.notes["PryNote::TestClass"].count.should == 1
125
+ PryNote.notes["PryNote::TestClass"].first.should =~ /my note2/
126
+ end
127
+
128
+ it 'should delete middle note for an object' do
129
+ @t.process_command "note add PryNote::TestClass -m 'my note1'"
130
+ @t.process_command "note add PryNote::TestClass -m 'my note2'"
131
+ @t.process_command "note add PryNote::TestClass -m 'my note3'"
132
+ PryNote.notes["PryNote::TestClass"].count.should == 3
133
+ @t.process_command "note delete PryNote::TestClass:2"
134
+ @t.last_output.should =~ /Deleted note 2 for PryNote::TestClass/
135
+ PryNote.notes["PryNote::TestClass"].count.should == 2
136
+ PryNote.notes["PryNote::TestClass"].first.should =~ /my note1/
137
+ PryNote.notes["PryNote::TestClass"].last.should =~ /my note3/
138
+ end
139
+ end
140
+ end
141
+
142
+ describe "note edit" do
143
+ describe "errors" do
144
+ it 'should error when not given a note number' do
145
+ @t.process_command "note add PryNote::TestClass -m 'my note1'"
146
+
147
+ capture_exception do
148
+ @t.process_command "note edit PryNote::TestClass -m 'bing'"
149
+ end.message.should =~ /Must specify a note number/
150
+ end
151
+
152
+ it 'should error when given out of range note number' do
153
+ @t.process_command "note add PryNote::TestClass -m 'my note1'"
154
+
155
+ capture_exception do
156
+ @t.process_command "note edit PryNote::TestClass:2 -m 'bing'"
157
+ end.message.should =~ /Invalid note number/
158
+ end
159
+
160
+ it 'should error when editing object with no notes' do
161
+ capture_exception do
162
+ @t.process_command "note edit PryNote::TestClass:2 -m 'bing'"
163
+ end.message.should =~ /No notes to edit/
164
+ end
165
+ end
166
+
167
+ describe "-m switch" do
168
+ it 'should amend the content of a note' do
169
+ @t.process_command "note add PryNote::TestClass -m 'my note1'"
170
+ @t.process_command "note edit PryNote::TestClass:1 -m 'bing'"
171
+ PryNote.notes["PryNote::TestClass"].count.should == 1
172
+ PryNote.notes["PryNote::TestClass"].first.should =~ /bing/
173
+ end
174
+ end
175
+ end
176
+
177
+ describe "note show" do
178
+ it 'should display method source when -v flag is used' do
179
+ @t.process_command "note add PryNote::TestClass -m 'my note1'"
180
+ @t.process_command "note show PryNote::TestClass -v"
181
+ @t.last_output.should =~ /ping/
182
+ end
183
+
184
+ it 'should just display number of notes by default' do
185
+ @t.process_command "note add PryNote::TestClass -m 'my note1'"
186
+ @t.process_command "note add PryNote::TestClass -m 'my note2'"
187
+ @t.process_command "note show PryNote::TestClass"
188
+ @t.last_output.should =~ /2/
189
+ @t.last_output.should.not =~ /ping/
190
+ end
191
+
192
+ it 'should ignore :number suffix (as used in edit and delete)' do
193
+ @t.process_command "note add PryNote::TestClass -m 'my note2'"
194
+ @t.process_command "note show PryNote::TestClass:99"
195
+ @t.last_output.should =~ /1/
196
+ end
197
+
198
+ it 'should implicitly display notes for current object (class)' do
199
+ @t.process_command "note add PryNote::TestClass -m 'my note1'"
200
+ @t.process_command "note add PryNote::TestClass -m 'my note2'"
201
+ @t.process_command "cd PryNote::TestClass"
202
+ @t.process_command "note show -v"
203
+ @t.last_output.should =~ /ping/
204
+ end
205
+
206
+ it 'should implicitly display notes for current object (method)' do
207
+ t = pry_tester(Pad.obj.ping)
208
+ t.process_command "note add PryNote::TestClass#ping -m 'my note1'"
209
+ t.process_command "note add PryNote::TestClass#ping -m 'my note2'"
210
+ t.process_command "note show -v"
211
+ t.last_output.should =~ /binding/
212
+ end
213
+ end
214
+
215
+ describe "note export" do
216
+ it 'should export to Pry.config.notes_file by default' do
217
+ cleanup_file("bing.yml") do
218
+ Pry.config.notes_file = "bing.yml"
219
+ @t.process_command "note add PryNote::TestClass -m 'my note1'"
220
+ @t.process_command "note add PryNote::TestClass -m 'my note2'"
221
+ @t.process_command "note export"
222
+
223
+ o = YAML.load(File.read("bing.yml"))
224
+ o["PryNote::TestClass"].should == ['my note1', 'my note2']
225
+
226
+ Pry.config.notes_file = nil
227
+ end
228
+ end
229
+
230
+ it 'should export to specified file' do
231
+ cleanup_file("blah.yml") do
232
+ @t.process_command "note add PryNote::TestClass -m 'my note1'"
233
+ @t.process_command "note add PryNote::TestClass -m 'my note2'"
234
+ @t.process_command "note export blah.yml"
235
+ o = YAML.load(File.read("blah.yml"))
236
+ o["PryNote::TestClass"].should == ['my note1', 'my note2']
237
+ end
238
+ end
239
+ end
240
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pry-note
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-22 00:00:00.000000000 Z
12
+ date: 2012-12-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -36,7 +36,12 @@ extra_rdoc_files: []
36
36
  files:
37
37
  - Rakefile
38
38
  - lib/pry-note.rb
39
+ - lib/pry-note/commands.rb
40
+ - lib/pry-note/hooks.rb
39
41
  - lib/pry-note/version.rb
42
+ - pry-note.gemspec
43
+ - test/helper.rb
44
+ - test/test_pry_note.rb
40
45
  homepage: https://github.com/banister
41
46
  licenses: []
42
47
  post_install_message:
@@ -62,4 +67,6 @@ signing_key:
62
67
  specification_version: 3
63
68
  summary: Ease refactoring and exploration by attaching notes to methods and classes
64
69
  in Pry
65
- test_files: []
70
+ test_files:
71
+ - test/helper.rb
72
+ - test/test_pry_note.rb