class_notes 1.0.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.
- checksums.yaml +7 -0
- data/README.md +35 -0
- data/lib/class_notes.rb +21 -0
- data/lib/class_notes/note.rb +73 -0
- data/lib/class_notes/notebook.rb +58 -0
- data/test/simple_math.rb +13 -0
- data/test/test_class_notes.rb +32 -0
- metadata +49 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: eab5805e4b978258c9dc4c0f1c59a5b319855db9
|
4
|
+
data.tar.gz: f9a5eecefd88a15d7385f07105653d65027bd947
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a5b45f9cf7c20e3fc5515b8f0ee2ae35e8fe91a0b3151def792c0c0de5549758ba174f67cf0a32d8a2eb6ba289d1e6c2b9ac5af6b93057516fe66903e1f266ab
|
7
|
+
data.tar.gz: 58ecd321ecbddef2f8330382ccbaedcd0c74207a882ce67dd09de211fa7403312b1e81ded5153c1f12da27aecbd03857d87e8b0e25fe1a1e87288ccef2b8524d
|
data/README.md
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# class_notes
|
2
|
+
make your classes take notes
|
3
|
+
|
4
|
+
## install:
|
5
|
+
gem install class_notes
|
6
|
+
|
7
|
+
## usage:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
require 'class_notes'
|
11
|
+
|
12
|
+
class SimpleMath
|
13
|
+
def add(a:, b:)
|
14
|
+
a + b
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_4(a:,b:,c:,d:)
|
18
|
+
add(a: add(a: a, b: b), b: add(a: c, b: d) )
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
notebook = ClassNotes.jot(SimpleMath).new
|
23
|
+
notebook.add_4(a: 1, b: 2, c: 3, d: 4) # => 10
|
24
|
+
puts notebook.notes # =>
|
25
|
+
#SimpleMathNotebook
|
26
|
+
# add_4
|
27
|
+
# add
|
28
|
+
# {:args=>{:a=>"1", :b=>"2"}, :result=>3}
|
29
|
+
# add
|
30
|
+
# {:args=>{:a=>"3", :b=>"4"}, :result=>7}
|
31
|
+
# add
|
32
|
+
# {:args=>{:a=>"3", :b=>"7"}, :result=>10}
|
33
|
+
# {:args=>{:a=>"1", :b=>"2", :c=>"3", :d=>"4"}, :result=>10}
|
34
|
+
# {}
|
35
|
+
```
|
data/lib/class_notes.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'class_notes/note'
|
2
|
+
require_relative 'class_notes/notebook'
|
3
|
+
|
4
|
+
module ClassNotes
|
5
|
+
::Version = [1, 0, 0]
|
6
|
+
|
7
|
+
## @brief create a new note taker Proc on parent
|
8
|
+
## @param parent the parent note
|
9
|
+
## @return a new Proc that can add notes to the parent
|
10
|
+
def self.note_taker(parent)
|
11
|
+
->(note){ parent << note }
|
12
|
+
end
|
13
|
+
|
14
|
+
## @brief wrap a class in notes
|
15
|
+
## @param klass the class
|
16
|
+
## @return a wrapped class
|
17
|
+
def self.jot(klass)
|
18
|
+
ClassNotes::Notebook.wrap_class(klass)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module ClassNotes
|
2
|
+
##
|
3
|
+
## @brief Class for a single step.
|
4
|
+
##
|
5
|
+
class Note
|
6
|
+
attr_accessor :title, :data, :children
|
7
|
+
|
8
|
+
##
|
9
|
+
## @brief makes a new note
|
10
|
+
##
|
11
|
+
## @param title The title of the note
|
12
|
+
## @param data The note's data
|
13
|
+
##
|
14
|
+
## @return a new note object
|
15
|
+
##
|
16
|
+
def initialize(title:, data:)
|
17
|
+
@children = []
|
18
|
+
@title = title
|
19
|
+
@data = data
|
20
|
+
end
|
21
|
+
|
22
|
+
##
|
23
|
+
## @brief clears a notes children
|
24
|
+
##
|
25
|
+
## @return []
|
26
|
+
##
|
27
|
+
def reset!
|
28
|
+
@children = []
|
29
|
+
end
|
30
|
+
|
31
|
+
##
|
32
|
+
## @brief add children
|
33
|
+
##
|
34
|
+
## @param other the child, can be either a note or a hash. If a hash is
|
35
|
+
## given, a new note will be created using the hash as its
|
36
|
+
## arguments
|
37
|
+
##
|
38
|
+
## @return []
|
39
|
+
##
|
40
|
+
def <<(other)
|
41
|
+
case other
|
42
|
+
when Note
|
43
|
+
@children << other
|
44
|
+
when Hash
|
45
|
+
@children << Note.new(other)
|
46
|
+
end
|
47
|
+
@children.last
|
48
|
+
end
|
49
|
+
|
50
|
+
## @brief render the note as a string
|
51
|
+
## @param indent the indent level of the base string
|
52
|
+
## @return String
|
53
|
+
def to_s(indent=0)
|
54
|
+
[
|
55
|
+
"#{" " * indent}#{title}",
|
56
|
+
unless children.empty?
|
57
|
+
children.map { |child| child.to_s(indent+1) }.join("\n")
|
58
|
+
end,
|
59
|
+
"#{" " * (indent+1)}#{data}"
|
60
|
+
].compact.join("\n")
|
61
|
+
end
|
62
|
+
|
63
|
+
## @brief render the note as a hash
|
64
|
+
## @return Hash
|
65
|
+
def to_h
|
66
|
+
{
|
67
|
+
title: title,
|
68
|
+
children: children.empty? ? nil : children.map { |child| child.to_h },
|
69
|
+
data: data
|
70
|
+
}.compact
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module ClassNotes
|
2
|
+
module Notebook
|
3
|
+
::WrappedSuffix = "Notebook"
|
4
|
+
|
5
|
+
## @brief wrap a class in notes
|
6
|
+
## @param klass the class
|
7
|
+
## @return a copy of Klass with each of its methods wrapped
|
8
|
+
def self.wrap_class(klass)
|
9
|
+
notebook = Class.new(klass) {
|
10
|
+
include Notebook
|
11
|
+
|
12
|
+
attr_reader :notes, :add_note
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@notes = ClassNotes::Note.new(title: self.class.to_s, data: {})
|
16
|
+
@add_note = ClassNotes.note_taker(notes)
|
17
|
+
wrap_methods(*self.class.superclass.instance_methods(false))
|
18
|
+
end
|
19
|
+
}
|
20
|
+
|
21
|
+
|
22
|
+
notebook_name = "#{klass.to_s}#{::WrappedSuffix}"
|
23
|
+
Object.const_set notebook_name, notebook
|
24
|
+
|
25
|
+
notebook
|
26
|
+
end
|
27
|
+
|
28
|
+
## @brief wrap methods with notes
|
29
|
+
## @param meths the methods to wrap
|
30
|
+
## @return nil
|
31
|
+
def wrap_methods(*meths)
|
32
|
+
meths.each { |meth|
|
33
|
+
m = method(meth)
|
34
|
+
define_singleton_method(meth) { |*args, &block|
|
35
|
+
|
36
|
+
parent = add_note
|
37
|
+
child = add_note.({title: meth.to_s, data: {}})
|
38
|
+
@add_note = ClassNotes.note_taker(child)
|
39
|
+
|
40
|
+
result = super(*args, &block)
|
41
|
+
@add_note = parent
|
42
|
+
|
43
|
+
pretty_args =
|
44
|
+
case args.first
|
45
|
+
when Hash
|
46
|
+
args.first.map { |t, v| [t, v.to_s]}.to_h
|
47
|
+
else
|
48
|
+
args
|
49
|
+
end
|
50
|
+
|
51
|
+
child.data = {args: pretty_args, result: result}
|
52
|
+
|
53
|
+
result
|
54
|
+
}
|
55
|
+
}
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/test/simple_math.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require_relative '../lib/class_notes'
|
3
|
+
require_relative 'simple_math'
|
4
|
+
|
5
|
+
class TestClassNotes < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@notebook = ClassNotes.jot(SimpleMath).new
|
9
|
+
end
|
10
|
+
|
11
|
+
def teardown
|
12
|
+
Object.send(:remove_const, @notebook.class.to_s)
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_notebook
|
16
|
+
[:add, :add_2, :add_4].each { |meth|
|
17
|
+
assert @notebook.respond_to? meth
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_unobtrusiveness
|
22
|
+
assert_equal @notebook.add_4(a: 1, b: 2, c: 3, d: 4), 10
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_penmanship
|
26
|
+
@notebook.add_4(a: 1, b: 2, c: 3, d: 4)
|
27
|
+
notes = @notebook.notes
|
28
|
+
assert_equal notes.title, "SimpleMathNotebook"
|
29
|
+
assert_equal notes.to_h[:children].first[:children][2][:children].first[:data][:args][1], 7
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: class_notes
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- annacrombie
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-09-10 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: wrap a classes instance methods in logic that keeps track of their actions
|
14
|
+
email: stone.tickle@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- "./README.md"
|
20
|
+
- "./lib/class_notes.rb"
|
21
|
+
- "./lib/class_notes/note.rb"
|
22
|
+
- "./lib/class_notes/notebook.rb"
|
23
|
+
- "./test/simple_math.rb"
|
24
|
+
- "./test/test_class_notes.rb"
|
25
|
+
homepage: https://github.com/uab-cs/class_notes/
|
26
|
+
licenses:
|
27
|
+
- MIT
|
28
|
+
metadata: {}
|
29
|
+
post_install_message:
|
30
|
+
rdoc_options: []
|
31
|
+
require_paths:
|
32
|
+
- lib
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
requirements: []
|
44
|
+
rubyforge_project:
|
45
|
+
rubygems_version: 2.6.11
|
46
|
+
signing_key:
|
47
|
+
specification_version: 4
|
48
|
+
summary: make your classes take notes
|
49
|
+
test_files: []
|