summary_judgement 1.1.0 → 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.
- data/VERSION +1 -1
- data/lib/summary_judgement/core_extensions.rb +27 -1
- data/lib/summary_judgement/instance_methods.rb +5 -3
- data/lib/summary_judgement/summary.rb +29 -12
- data/lib/summary_judgement.rb +3 -2
- data/summary_judgement.gemspec +2 -2
- data/test/helper.rb +26 -2
- data/test/test_summary_judgement.rb +15 -3
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0
|
@@ -1,6 +1,12 @@
|
|
1
1
|
class String
|
2
2
|
def indefinite_article
|
3
|
-
|
3
|
+
if WORDS_WITH_INITIAL_VOWELS_THAT_ACT_LIKE_WORDS_WITH_INITIAL_CONSONANTS.include? first_word.first_term
|
4
|
+
INDEFINITE_ARTICLES[:consonant]
|
5
|
+
elsif VOWELS.include? first.downcase
|
6
|
+
INDEFINITE_ARTICLES[:vowel]
|
7
|
+
else
|
8
|
+
INDEFINITE_ARTICLES[:consonant]
|
9
|
+
end
|
4
10
|
end
|
5
11
|
|
6
12
|
def with_indefinite_article(upcase = false)
|
@@ -10,4 +16,24 @@ class String
|
|
10
16
|
def pluralize_on(qty)
|
11
17
|
qty.is_a?(Numeric) and qty > 1 ? pluralize : self
|
12
18
|
end
|
19
|
+
|
20
|
+
def first_word
|
21
|
+
split(' ').first
|
22
|
+
end
|
23
|
+
|
24
|
+
def first_term
|
25
|
+
split('-').first
|
26
|
+
end
|
27
|
+
|
28
|
+
WORDS_WITH_INITIAL_VOWELS_THAT_ACT_LIKE_WORDS_WITH_INITIAL_CONSONANTS = %w(one)
|
29
|
+
INDEFINITE_ARTICLES = { :vowel => 'an', :consonant => 'a'}
|
30
|
+
VOWELS = %w(a e i o u)
|
31
|
+
end
|
32
|
+
|
33
|
+
class Object
|
34
|
+
def recursive_send(*methods)
|
35
|
+
return self if methods.empty?
|
36
|
+
m = methods.shift
|
37
|
+
send(m).recursive_send(*methods)
|
38
|
+
end
|
13
39
|
end
|
@@ -9,7 +9,7 @@ module SummaryJudgement
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def term
|
12
|
-
self.class.summary.class.render self.class.summary.
|
12
|
+
self.class.summary.class.render self.class.summary.terms.find { |t| t.condition.nil? or self.class.summary.class.render(t.condition, self) }.phrase, self
|
13
13
|
end
|
14
14
|
|
15
15
|
def adjectives
|
@@ -21,7 +21,9 @@ module SummaryJudgement
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def children
|
24
|
-
self.class.summary.class.render
|
24
|
+
subordinates = self.class.summary.class.render(self.class.summary.subordinates, self)
|
25
|
+
subordinates.flatten! if subordinates.respond_to? :flatten!
|
26
|
+
subordinates
|
25
27
|
end
|
26
28
|
|
27
29
|
def canopy
|
@@ -33,7 +35,7 @@ module SummaryJudgement
|
|
33
35
|
|
34
36
|
def summarize_as_leaf(options = {})
|
35
37
|
options.reverse_merge! :capitalize_indefinite_article => true
|
36
|
-
"#{adjectives.join(' ').strip.with_indefinite_article(options[:capitalize_indefinite_article])} #{
|
38
|
+
"#{adjectives.join(' ').strip.concat(' ').concat(term).strip.with_indefinite_article(options[:capitalize_indefinite_article])} #{modifiers.join(' ')}".strip
|
37
39
|
end
|
38
40
|
|
39
41
|
def summarize_as_branch(options = {})
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module SummaryJudgement
|
2
2
|
class Summary
|
3
|
-
attr_reader :
|
3
|
+
attr_reader :terms, :adjectives, :modifiers, :subordinates, :base
|
4
4
|
|
5
5
|
def initialize(base, options = {}, &blk)
|
6
6
|
@base = base
|
7
|
-
@
|
7
|
+
@terms = options[:terms] || []
|
8
8
|
@adjectives = options[:adjectives] || []
|
9
9
|
@modifiers = options[:modifiers] || []
|
10
10
|
@subordinates = options[:subordinates] || []
|
@@ -14,8 +14,8 @@ module SummaryJudgement
|
|
14
14
|
yield self
|
15
15
|
end
|
16
16
|
|
17
|
-
def identity(t)
|
18
|
-
@
|
17
|
+
def identity(t = nil, options = {})
|
18
|
+
@terms << SummaryJudgement::Descriptor.new(t || @base.to_s.underscore.humanize.downcase, options)
|
19
19
|
end
|
20
20
|
|
21
21
|
def adjective(a, options = {})
|
@@ -26,12 +26,14 @@ module SummaryJudgement
|
|
26
26
|
@modifiers << SummaryJudgement::Descriptor.new(m, options)
|
27
27
|
end
|
28
28
|
|
29
|
-
def children(
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
29
|
+
def children(*collections_or_symbols)
|
30
|
+
collections_or_symbols.each do |collection_or_symbol|
|
31
|
+
case collection_or_symbol
|
32
|
+
when Symbol
|
33
|
+
@subordinates << lambda { |parent| parent.send collection_or_symbol }
|
34
|
+
else
|
35
|
+
@subordinates << collection_or_symbol
|
36
|
+
end
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
@@ -44,7 +46,16 @@ module SummaryJudgement
|
|
44
46
|
end
|
45
47
|
|
46
48
|
def to_hash
|
47
|
-
|
49
|
+
[:adjectives, :modifiers, :subordinates, :terms].inject({}) do |properties, property|
|
50
|
+
val = instance_variable_get :"@#{property}"
|
51
|
+
case val
|
52
|
+
when Symbol
|
53
|
+
properties[property] = val
|
54
|
+
else
|
55
|
+
properties[property] = val.clone
|
56
|
+
end
|
57
|
+
properties
|
58
|
+
end
|
48
59
|
end
|
49
60
|
|
50
61
|
def dup(base)
|
@@ -55,7 +66,13 @@ module SummaryJudgement
|
|
55
66
|
def render(obj, context)
|
56
67
|
case obj
|
57
68
|
when Array
|
58
|
-
obj.empty?
|
69
|
+
if obj.empty?
|
70
|
+
nil
|
71
|
+
elsif obj.all? { |e| e.is_a? Symbol }
|
72
|
+
context.recursive_send(*obj)
|
73
|
+
else
|
74
|
+
obj.empty? ? nil : obj.map {|o| render o, context}
|
75
|
+
end
|
59
76
|
when String
|
60
77
|
obj
|
61
78
|
when Symbol
|
data/lib/summary_judgement.rb
CHANGED
@@ -3,15 +3,16 @@ require 'verbs'
|
|
3
3
|
|
4
4
|
module SummaryJudgement
|
5
5
|
def self.extended(base)
|
6
|
+
base.initialize_summary Summary.new(base)
|
7
|
+
base.send :include, InstanceMethods
|
6
8
|
def base.inherited(subclass)
|
7
9
|
subclass.initialize_summary @summary.dup(subclass)
|
10
|
+
super
|
8
11
|
end
|
9
12
|
end
|
10
13
|
|
11
14
|
def summarize(&blk)
|
12
|
-
@summary ||= Summary.new(self)
|
13
15
|
@summary.define(&blk)
|
14
|
-
send :include, InstanceMethods
|
15
16
|
end
|
16
17
|
|
17
18
|
def summary
|
data/summary_judgement.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{summary_judgement}
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Andy Rossmeissl"]
|
12
|
-
s.date = %q{2009-12-
|
12
|
+
s.date = %q{2009-12-07}
|
13
13
|
s.description = %q{Constructs adaptive summaries of object hierarchies based on ActiveRecord associations and other simple relationship structures}
|
14
14
|
s.email = %q{andy@rossmeissl.net}
|
15
15
|
s.extra_rdoc_files = [
|
data/test/helper.rb
CHANGED
@@ -68,8 +68,7 @@ class Library
|
|
68
68
|
|
69
69
|
extend SummaryJudgement
|
70
70
|
summarize do |has|
|
71
|
-
has.children :books
|
72
|
-
has.children :magazines
|
71
|
+
has.children :books, :magazines
|
73
72
|
has.verb :have
|
74
73
|
end
|
75
74
|
end
|
@@ -86,3 +85,28 @@ class Catalog
|
|
86
85
|
has.verb :contain
|
87
86
|
end
|
88
87
|
end
|
88
|
+
|
89
|
+
class Employee
|
90
|
+
extend SummaryJudgement
|
91
|
+
end
|
92
|
+
|
93
|
+
class Librarian < Employee
|
94
|
+
summarize do |has|
|
95
|
+
has.identity 'bookworm', :if => lambda { false }
|
96
|
+
has.identity
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
class Customer
|
101
|
+
extend SummaryJudgement
|
102
|
+
|
103
|
+
summarize do |has|
|
104
|
+
has.identity [:label, :downcase]
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
class Enthusiast < Customer
|
109
|
+
def label
|
110
|
+
'AVID READER'
|
111
|
+
end
|
112
|
+
end
|
@@ -10,18 +10,21 @@ class TestSummaryJudgement < Test::Unit::TestCase
|
|
10
10
|
@toilet = Library.new @neuromancer, @current_economist
|
11
11
|
@bedstand = Library.new @neuromancer
|
12
12
|
@catalog = Catalog.new @bookshelf, @toilet
|
13
|
+
@anne = Librarian.new
|
14
|
+
@seamus = Enthusiast.new
|
13
15
|
end
|
14
16
|
|
15
17
|
def test_setup
|
16
18
|
assert_equal Book, @neuromancer.class
|
17
19
|
assert_equal Library, @bookshelf.class
|
18
20
|
assert_equal 2, @bookshelf.books.length
|
19
|
-
assert_equal :accept, Verbs::Conjugator.conjugate(:accept, :tense => :present, :person => :first, :plurality => :singular)
|
21
|
+
assert_equal :accept, Verbs::Conjugator.conjugate(:accept, :tense => :present, :person => :first, :plurality => :singular)
|
22
|
+
assert_equal 'a', 'one'.indefinite_article
|
20
23
|
end
|
21
24
|
|
22
25
|
def test_summary_definition
|
23
26
|
assert_equal SummaryJudgement::Summary, Book.summary.class
|
24
|
-
assert_equal Proc, Book.summary.
|
27
|
+
assert_equal Proc, Book.summary.terms.first.phrase.class
|
25
28
|
assert_equal [SummaryJudgement::Descriptor], Book.summary.adjectives.collect { |a| a.class }.uniq
|
26
29
|
assert_equal :have, Library.summary.predicate
|
27
30
|
end
|
@@ -73,5 +76,14 @@ class TestSummaryJudgement < Test::Unit::TestCase
|
|
73
76
|
|
74
77
|
def test_inheritance
|
75
78
|
assert_equal 'A hardcover novel by William Gibson', @first_edition_neuromancer.summary
|
76
|
-
|
79
|
+
assert_equal 'A librarian', @anne.summary
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_lazily_inherited_summary_definitions
|
83
|
+
assert_equal 'An avid reader', @seamus.summary
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_recursive_send_core_extension
|
87
|
+
assert_equal 'foo bar', 'foo_bar'.recursive_send(:humanize, :downcase)
|
88
|
+
end
|
77
89
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: summary_judgement
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Rossmeissl
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-12-
|
12
|
+
date: 2009-12-07 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|