abstractor 1.0.20 → 1.0.22

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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZDg1YWM0MWMxN2ZlMTM1N2IxYTBjMTNhZTg3MGFlMDM5MjJhYWM0NQ==
4
+ MDdjMTlhOGQ5ZDUwZTFiYzllM2VlMjJiMTlmN2Q1ZmM4MTExYmZkZA==
5
5
  data.tar.gz: !binary |-
6
- NmZmM2ZmNjI2YTg5MmE4OGNkN2ZkMmU5MDkzNjIwMGExNDEwMDRlMA==
6
+ MDFiZTgwYWM3MjhjMTk4ZTc4MWVmNmNjYjMzMDRjY2YyZjM2Mjk4MQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NWQ1YWRjNzc5YWNlMGMxMGVjNmE4OTM5ZjhmMWE1ZDc4NWVjOGFlZmRlYzQ2
10
- MTkxNzM2ZjUwZDQwMTJiN2EzZjFjMDc2NWFmMGZhODJlNWU0MmYyMDRlMjE3
11
- ZTEwOTZlNjRmMDQ3ODM0ZjhjZWYyZjcyODMyZWFkMjNlZmYxNjk=
9
+ YmE5Yzk3YzIzZjM1MTY1M2I4NjZmYTNlNzMwZTBmYjE2NGNhOTViYTBiZTgx
10
+ M2RkOTRhZmMwZjY2ZGZiODVhNGFlNjMyYWIwNWY3OWM1YWRkY2ZjZmI3OTY4
11
+ OGM1N2UzNjNjMmEyNDhmZDRlMDBhNDNkMjExNjk3MWE3ZDMwM2Q=
12
12
  data.tar.gz: !binary |-
13
- MDU2ZTJkNWVkN2Y2ODg0MjVhYjE4ZWVmNGI0ZjMwMzM3MWRmNTBjYWRmNmNm
14
- NGZjYjBjOWIwMWVmMWEzNTkyY2EwNDdjNzdmMzI2ZDU0OGUzNzc1MzYzOTUz
15
- ZjAyMzcwYThlZmM1ZDc3OWY0NGI4OTZjN2QzYTA1NjNmNGJmNTM=
13
+ NWVhNWJiZGYxN2M5YWU3YzU5YmUyZDEwZWZlMWRhZDExMmVkOTdkMzQ0NTNl
14
+ ZmI0ZmU4NjZmZjY3NTUwYWM4ZDMyY2FlNWVhZDI2MTBjMmI3OGM0ZmRiN2Nh
15
+ ZWJmOGM4YmE5NWUwNzM0YjcwZDEyZDQ2YjAwMWQ3YWM4OTk5MmY=
data/Rakefile CHANGED
@@ -4,7 +4,6 @@ begin
4
4
  require 'cucumber/rake/task'
5
5
  require 'rspec/core/rake_task'
6
6
  require 'rubygems/package_task'
7
- require 'nubic/gem_tasks'
8
7
  end
9
8
 
10
9
  gemspec = eval(File.read('abstractor.gemspec'), binding, 'abstractor.gemspec')
@@ -27,7 +26,4 @@ namespace :cucumber do
27
26
  end
28
27
  end
29
28
 
30
- task :cucumber => 'cucumber:features'
31
- Nubic::GemTasks::DeployGemTask.new("pkg/#{gemspec.file_name}")
32
- task "deploy:gem" => :repackage
33
- Bundler::GemHelper.install_tasks
29
+ task :cucumber => 'cucumber:features'
@@ -74,7 +74,7 @@ Abstractor.AbstractionUI = function(){
74
74
  };
75
75
 
76
76
  Abstractor.AbstractionSuggestionUI = function(){
77
- $(document).on('change', '#abstractor_suggestion_abstractor_suggestion_status_id_1, #abstractor_suggestion_abstractor_suggestion_status_id_2, #abstractor_suggestion_abstractor_suggestion_status_id_3', function() {
77
+ $(document).on('change', '.abstractor_suggestion_status_selection', function() {
78
78
  $(this).closest('form').submit();
79
79
  });
80
80
 
@@ -49,8 +49,9 @@
49
49
  .column-3
50
50
  - values = Abstractor::AbstractorSuggestionStatus.all.sort_by(&:name).map{|s| [s.name, s.id] }
51
51
  - values.each do |value|
52
- = f.radio_button :abstractor_suggestion_status_id, value.last
53
- = f.label :abstractor_suggestion_status_id, value.first, value: value.last
52
+ - id = "abstractor_suggestion_abstractor_suggestion_status_id_#{value.last}_#{abstractor_suggestion.id}"
53
+ = f.radio_button :abstractor_suggestion_status_id, value.last, id: id, class: 'abstractor_suggestion_status_selection'
54
+ = f.label :abstractor_suggestion_status_id, value.first, value: value.last, for: id
54
55
  %br
55
56
  = f.radio_button :abstractor_suggestion_status_id, '', {:style => 'display:none;' }
56
57
  %hr
@@ -65,5 +66,4 @@
65
66
  - abstractable_from_column = about.send(from_method)
66
67
  - unless abstractable_from_column.nil?
67
68
  = abstractable_from_column.clone
68
-
69
69
  .clear
@@ -0,0 +1,5 @@
1
+ class AddCustomMethodToAbstractorAbstractionSources < ActiveRecord::Migration
2
+ def change
3
+ add_column :abstractor_abstraction_sources, :custom_method, :string
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddCustomMethodToAbstractorSuggestionSources < ActiveRecord::Migration
2
+ def change
3
+ add_column :abstractor_suggestion_sources, :custom_method, :string
4
+ end
5
+ end
@@ -1,8 +1,6 @@
1
1
  module Abstractor
2
2
  module Abstractable
3
3
  def self.included(base)
4
- base.send(:include, InstanceMethods)
5
- base.extend(ClassMethods)
6
4
  base.class_eval do
7
5
  has_many :abstractor_abstractions, class_name: Abstractor::AbstractorAbstraction, as: :about
8
6
 
@@ -10,6 +8,8 @@ module Abstractor
10
8
 
11
9
  accepts_nested_attributes_for :abstractor_abstractions, allow_destroy: false
12
10
  end
11
+ base.send(:include, InstanceMethods)
12
+ base.extend(ClassMethods)
13
13
  end
14
14
 
15
15
  module InstanceMethods
@@ -56,7 +56,7 @@ module Abstractor
56
56
  if !only_unreviewed || (only_unreviewed && abstractor_abstraction.unreviewed?)
57
57
  abstractor_abstraction.abstractor_suggestions.each do |abstractor_suggestion|
58
58
  abstractor_suggestion.abstractor_suggestion_sources.destroy_all
59
- abstractor_suggestion.abstractor_suggestion_object_value.destroy
59
+ abstractor_suggestion.abstractor_suggestion_object_value.destroy if abstractor_suggestion.abstractor_suggestion_object_value
60
60
  abstractor_suggestion.destroy
61
61
  end
62
62
  abstractor_abstraction.destroy
@@ -89,7 +89,6 @@ module Abstractor
89
89
  # @param [Hash] options the options to filter the objects returned
90
90
  # @option options [Boolean] :grouped Filters the list of Abstactor::AbstractorSubject objects to grouped and non-grouped. Defaults to nil which returns all objects.
91
91
  # @return ActiveRecord::Relation list of Abstactor::AbstractorSubject objects
92
-
93
92
  def abstractor_subjects(options = {})
94
93
  options = { grouped: nil }.merge(options)
95
94
  subjects = Abstractor::AbstractorSubject.where(subject_type: self.to_s)
@@ -25,8 +25,8 @@ module Abstractor
25
25
  # Hooks
26
26
  base.send :after_save, :review_matching_suggestions#, :if => lambda {|abstractor_abstraction| abstractor_abstraction.value_changed?}
27
27
 
28
- base.send :extend, ClassMethods
29
28
  base.send(:include, InstanceMethods)
29
+ base.extend(ClassMethods)
30
30
  end
31
31
 
32
32
  module InstanceMethods
@@ -10,7 +10,7 @@ module Abstractor
10
10
  base.send :has_many, :abstractor_suggestion_sources
11
11
  base.send :has_many, :abstractor_abstractions, :through => :abstractor_suggestion_sources
12
12
 
13
- base.send :attr_accessible, :abstractor_subject, :abstractor_subject_id, :deleted_at, :from_method
13
+ base.send :attr_accessible, :abstractor_subject, :abstractor_subject_id, :deleted_at, :from_method, :custom_method
14
14
  end
15
15
 
16
16
  def normalize_from_method_to_sources(about)
@@ -20,77 +20,118 @@ module Abstractor
20
20
 
21
21
 
22
22
  base.send :attr_accessible, :abstractor_abstraction_schema, :abstractor_abstraction_schema_id, :abstractor_rule_type, :abstractor_rule_type_id, :subject_type
23
+ base.send(:include, InstanceMethods)
23
24
  end
24
25
 
25
- # Instance Methods
26
- def abstract(about)
27
- abstractor_abstraction = about.find_or_create_abstractor_abstraction(abstractor_abstraction_schema, self)
28
- case abstractor_rule_type.name
29
- when 'name/value'
30
- abstract_name_value(about, abstractor_abstraction)
31
- when 'value'
32
- abstract_value(about, abstractor_abstraction)
33
- when 'unknown'
34
- abstract_unknown(about, abstractor_abstraction)
26
+ module InstanceMethods
27
+ ##
28
+ # Creates or finds and instance of an Abstactor::AbstractorAbstraction.
29
+ # The method will create instances of Abstractor::AbstractorSuggestion and
30
+ # Abstractor::AbstractorSuggestionSource for the abstractable entity
31
+ # passed via the about parameter.
32
+ #
33
+ # The Abstractor::AbstractorSubject#abstractor_rule_type attribute determines the abstraction strategy:
34
+ #
35
+ # * 'name/value': attempts to search for non-negated sentences mentioning of an Abstractor::AbstractorAbstractionSchema#predicate and an Abstractor::AbstractorObjectValue
36
+ # * 'value': attempts to search for non-negated sentences mentioning an Abstractor::AbstractorObjectValue
37
+ # * 'unknown': will automatically create an 'unknown' Abstractor::AbstractorSuggestion
38
+ # * 'custom': will create instances of Abstractor::AbstractorSuggestion based on custom logic delegated to the method on the about parameter configured in AbstractorAbstractionSource#custom_method
39
+ #
40
+ # @param [ActiveRecord::Base] about the entity abstract. An instnace of the class specified in the Abstractor::AbstractorSubject#subject_type attribute.
41
+ # @return [void]
42
+ def abstract(about)
43
+ abstractor_abstraction = about.find_or_create_abstractor_abstraction(abstractor_abstraction_schema, self)
44
+ case abstractor_rule_type.name
45
+ when 'name/value'
46
+ abstract_name_value(about, abstractor_abstraction)
47
+ when 'value'
48
+ abstract_value(about, abstractor_abstraction)
49
+ when 'unknown'
50
+ abstract_unknown(about, abstractor_abstraction)
51
+ when 'custom'
52
+ abstract_custom(about, abstractor_abstraction)
53
+ end
35
54
  end
36
- end
37
55
 
38
- def abstract_unknown(about, abstractor_abstraction)
39
- abstractor_abstraction_sources.each do |abstractor_abstraction_source|
40
- create_unknown_abstractor_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
56
+ # Cycle through instances of Abstractor::AbstractorSuggestionSources
57
+ # --each time calling the method on the about paramter configured by
58
+ # the AbstractorAbstractionSource#custom_method attribute.
59
+ # Setting up an Abstractor::AbstractorSubject with a
60
+ # 'custom' rule type obligates the developer to implement an instance
61
+ # method on the abstractable entitty to make suggestions as
62
+ # appropriate. The 'custom' rule type is intened to faciliate a
63
+ # way to generate suggestions in a completely customizable way.
64
+ #
65
+ # @param [ActiveRecord::Base] about the entity to abstraction
66
+ # @param [Abstractor::AbstractorAbstraction] abstractor_abstraction the instance of an abstractor abstraction
67
+ # @return [void]
68
+ def abstract_custom(about, abstractor_abstraction)
69
+ abstractor_abstraction_sources.each do |abstractor_abstraction_source|
70
+ suggested_values = about.send(abstractor_abstraction_source.custom_method)
71
+ suggested_values.each do |suggested_value|
72
+ suggest(abstractor_abstraction, abstractor_abstraction_source, nil, nil, about.id, about.class.to_s, abstractor_abstraction_source.from_method, suggested_value, nil, nil, abstractor_abstraction_source.custom_method)
73
+ end
74
+ create_unknown_abstractor_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
75
+ end
41
76
  end
42
- end
43
77
 
44
- def abstract_value(about, abstractor_abstraction)
45
- abstract_sentential_value(about, abstractor_abstraction)
46
- abstractor_abstraction_sources.each do |abstractor_abstraction_source|
47
- create_unknown_abstractor_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
78
+ def abstract_unknown(about, abstractor_abstraction)
79
+ abstractor_abstraction_sources.each do |abstractor_abstraction_source|
80
+ create_unknown_abstractor_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
81
+ end
48
82
  end
49
- end
50
83
 
51
- def abstract_sentential_value(about, abstractor_abstraction)
52
- abstractor_abstraction_sources.each do |abstractor_abstraction_source|
53
- abstractor_abstraction_source.normalize_from_method_to_sources(about).each do |source|
54
- abstractor_text = source[:source_type].find(source[:source_id]).send(source[:source_method])
55
- abstractor_object_value_ids = abstractor_abstraction_schema.abstractor_object_values.map(&:id)
84
+ def abstract_value(about, abstractor_abstraction)
85
+ abstract_sentential_value(about, abstractor_abstraction)
86
+ abstractor_abstraction_sources.each do |abstractor_abstraction_source|
87
+ create_unknown_abstractor_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
88
+ end
89
+ end
56
90
 
57
- adapter = ActiveRecord::Base.connection.instance_values["config"][:adapter]
58
- case adapter
59
- when 'sqlserver'
60
- abstractor_object_value_variants = Abstractor::AbstractorObjectValueVariant.where("abstractor_object_value_id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} LIKE ('%' + abstractor_object_value_variants.value + '%'))", abstractor_object_value_ids, source[:source_id]).all
61
- when 'sqlite3'
62
- abstractor_object_value_variants = Abstractor::AbstractorObjectValueVariant.where("abstractor_object_value_id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} LIKE ('%' || abstractor_object_value_variants.value || '%'))", abstractor_object_value_ids, source[:source_id]).all
63
- when 'postgresql'
64
- abstractor_object_value_variants = Abstractor::AbstractorObjectValueVariant.where("abstractor_object_value_id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} ILIKE ('%' || abstractor_object_value_variants.value || '%'))", abstractor_object_value_ids, source[:source_id]).all
65
- end
91
+ def abstract_sentential_value(about, abstractor_abstraction)
92
+ abstractor_abstraction_sources.each do |abstractor_abstraction_source|
93
+ abstractor_abstraction_source.normalize_from_method_to_sources(about).each do |source|
94
+ abstractor_text = source[:source_type].find(source[:source_id]).send(source[:source_method])
95
+ abstractor_object_value_ids = abstractor_abstraction_schema.abstractor_object_values.map(&:id)
66
96
 
67
- abstractor_object_values = abstractor_object_value_variants.map(&:abstractor_object_value).uniq
97
+ adapter = ActiveRecord::Base.connection.instance_values["config"][:adapter]
98
+ case adapter
99
+ when 'sqlserver'
100
+ abstractor_object_value_variants = Abstractor::AbstractorObjectValueVariant.where("abstractor_object_value_id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} LIKE ('%' + abstractor_object_value_variants.value + '%'))", abstractor_object_value_ids, source[:source_id]).all
101
+ when 'sqlite3'
102
+ abstractor_object_value_variants = Abstractor::AbstractorObjectValueVariant.where("abstractor_object_value_id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} LIKE ('%' || abstractor_object_value_variants.value || '%'))", abstractor_object_value_ids, source[:source_id]).all
103
+ when 'postgresql'
104
+ abstractor_object_value_variants = Abstractor::AbstractorObjectValueVariant.where("abstractor_object_value_id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} ILIKE ('%' || abstractor_object_value_variants.value || '%'))", abstractor_object_value_ids, source[:source_id]).all
105
+ end
68
106
 
69
- adapter = ActiveRecord::Base.connection.instance_values["config"][:adapter]
70
- case adapter
71
- when 'sqlserver'
72
- abstractor_object_values.concat(Abstractor::AbstractorObjectValue.where("abstractor_object_values.id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} LIKE ('%' + abstractor_object_values.value + '%'))", abstractor_object_value_ids, source[:source_id]).all).uniq
73
- when 'sqlite3'
74
- abstractor_object_values.concat(Abstractor::AbstractorObjectValue.where("abstractor_object_values.id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} LIKE ('%' || abstractor_object_values.value || '%'))", abstractor_object_value_ids, source[:source_id]).all).uniq
75
- when 'postgresql'
76
- abstractor_object_values.concat(Abstractor::AbstractorObjectValue.where("abstractor_object_values.id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} ILIKE ('%' || abstractor_object_values.value || '%'))", abstractor_object_value_ids, source[:source_id]).all).uniq
77
- end
107
+ abstractor_object_values = abstractor_object_value_variants.map(&:abstractor_object_value).uniq
78
108
 
79
- parser = Abstractor::Parser.new(abstractor_text)
80
- abstractor_object_values.each do |abstractor_object_value|
81
- object_variants(abstractor_object_value, abstractor_object_value_variants).each do |object_variant|
82
- ranges = parser.range_all(Regexp.escape(object_variant.downcase))
83
- if ranges.any?
84
- ranges.each do |range|
85
- sentence = parser.find_sentence(range)
86
- if sentence
87
- scoped_sentence = Abstractor::NegationDetection.parse_negation_scope(sentence[:sentence])
88
- reject = (
89
- Abstractor::NegationDetection.negated_match_value?(scoped_sentence[:scoped_sentence], object_variant) ||
90
- Abstractor::NegationDetection.manual_negated_match_value?(sentence[:sentence], object_variant)
91
- )
92
- if !reject
93
- suggest(abstractor_abstraction, abstractor_abstraction_source, object_variant.downcase, sentence[:sentence], source[:source_id], source[:source_type].to_s, source[:source_method], abstractor_object_value, nil, nil)
109
+ adapter = ActiveRecord::Base.connection.instance_values["config"][:adapter]
110
+ case adapter
111
+ when 'sqlserver'
112
+ abstractor_object_values.concat(Abstractor::AbstractorObjectValue.where("abstractor_object_values.id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} LIKE ('%' + abstractor_object_values.value + '%'))", abstractor_object_value_ids, source[:source_id]).all).uniq
113
+ when 'sqlite3'
114
+ abstractor_object_values.concat(Abstractor::AbstractorObjectValue.where("abstractor_object_values.id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} LIKE ('%' || abstractor_object_values.value || '%'))", abstractor_object_value_ids, source[:source_id]).all).uniq
115
+ when 'postgresql'
116
+ abstractor_object_values.concat(Abstractor::AbstractorObjectValue.where("abstractor_object_values.id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} ILIKE ('%' || abstractor_object_values.value || '%'))", abstractor_object_value_ids, source[:source_id]).all).uniq
117
+ end
118
+
119
+ parser = Abstractor::Parser.new(abstractor_text)
120
+ abstractor_object_values.each do |abstractor_object_value|
121
+ object_variants(abstractor_object_value, abstractor_object_value_variants).each do |object_variant|
122
+ ranges = parser.range_all(Regexp.escape(object_variant.downcase))
123
+ if ranges.any?
124
+ ranges.each do |range|
125
+ sentence = parser.find_sentence(range)
126
+ if sentence
127
+ scoped_sentence = Abstractor::NegationDetection.parse_negation_scope(sentence[:sentence])
128
+ reject = (
129
+ Abstractor::NegationDetection.negated_match_value?(scoped_sentence[:scoped_sentence], object_variant) ||
130
+ Abstractor::NegationDetection.manual_negated_match_value?(sentence[:sentence], object_variant)
131
+ )
132
+ if !reject
133
+ suggest(abstractor_abstraction, abstractor_abstraction_source, object_variant.downcase, sentence[:sentence], source[:source_id], source[:source_type].to_s, source[:source_method], abstractor_object_value, nil, nil, nil)
134
+ end
94
135
  end
95
136
  end
96
137
  end
@@ -99,67 +140,67 @@ module Abstractor
99
140
  end
100
141
  end
101
142
  end
102
- end
103
143
 
104
- def abstract_name_value(about, abstractor_abstraction)
105
- abstract_canonical_name_value(about, abstractor_abstraction)
106
- abstract_sentential_name_value(about, abstractor_abstraction)
107
- create_unknown_abstractor_suggestion_name_only(about, abstractor_abstraction)
108
- abstractor_abstraction_sources.each do |abstractor_abstraction_source|
109
- create_unknown_abstractor_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
144
+ def abstract_name_value(about, abstractor_abstraction)
145
+ abstract_canonical_name_value(about, abstractor_abstraction)
146
+ abstract_sentential_name_value(about, abstractor_abstraction)
147
+ create_unknown_abstractor_suggestion_name_only(about, abstractor_abstraction)
148
+ abstractor_abstraction_sources.each do |abstractor_abstraction_source|
149
+ create_unknown_abstractor_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
150
+ end
110
151
  end
111
- end
112
152
 
113
- def abstract_canonical_name_value(about, abstractor_abstraction)
114
- abstractor_abstraction_sources.each do |abstractor_abstraction_source|
115
- abstractor_abstraction_source.normalize_from_method_to_sources(about).each do |source|
116
- abstractor_text = source[:source_type].find(source[:source_id]).send(source[:source_method])
117
- parser = Abstractor::Parser.new(abstractor_text)
118
- abstractor_abstraction_schema.predicate_variants.each do |predicate_variant|
119
- abstractor_abstraction_schema.abstractor_object_values.each do |abstractor_object_value|
120
- abstractor_object_value.object_variants.each do |object_variant|
121
- match_value = "#{Regexp.escape(predicate_variant)}:\s*#{Regexp.escape(object_variant)}"
122
- matches = parser.scan(match_value, word_boundary: true).uniq
123
- matches.each do |match|
124
- suggest(abstractor_abstraction, abstractor_abstraction_source, match, match, source[:source_id], source[:source_type].to_s, source[:source_method], abstractor_object_value, nil, nil)
125
- end
153
+ def abstract_canonical_name_value(about, abstractor_abstraction)
154
+ abstractor_abstraction_sources.each do |abstractor_abstraction_source|
155
+ abstractor_abstraction_source.normalize_from_method_to_sources(about).each do |source|
156
+ abstractor_text = source[:source_type].find(source[:source_id]).send(source[:source_method])
157
+ parser = Abstractor::Parser.new(abstractor_text)
158
+ abstractor_abstraction_schema.predicate_variants.each do |predicate_variant|
159
+ abstractor_abstraction_schema.abstractor_object_values.each do |abstractor_object_value|
160
+ abstractor_object_value.object_variants.each do |object_variant|
161
+ match_value = "#{Regexp.escape(predicate_variant)}:\s*#{Regexp.escape(object_variant)}"
162
+ matches = parser.scan(match_value, word_boundary: true).uniq
163
+ matches.each do |match|
164
+ suggest(abstractor_abstraction, abstractor_abstraction_source, match, match, source[:source_id], source[:source_type].to_s, source[:source_method], abstractor_object_value, nil, nil, nil)
165
+ end
126
166
 
127
- match_value = "#{Regexp.escape(predicate_variant)}#{Regexp.escape(object_variant)}"
128
- matches = parser.scan(match_value, word_boundary: true).uniq
129
- matches.each do |match|
130
- suggest(abstractor_abstraction, abstractor_abstraction_source, match, match, source[:source_id], source[:source_type].to_s, source[:source_method], abstractor_object_value, nil, nil)
167
+ match_value = "#{Regexp.escape(predicate_variant)}#{Regexp.escape(object_variant)}"
168
+ matches = parser.scan(match_value, word_boundary: true).uniq
169
+ matches.each do |match|
170
+ suggest(abstractor_abstraction, abstractor_abstraction_source, match, match, source[:source_id], source[:source_type].to_s, source[:source_method], abstractor_object_value, nil, nil, nil)
171
+ end
131
172
  end
132
173
  end
133
174
  end
134
175
  end
135
176
  end
136
177
  end
137
- end
138
178
 
139
- def abstract_sentential_name_value(about, abstractor_abstraction)
140
- abstractor_abstraction_sources.each do |abstractor_abstraction_source|
141
- abstractor_abstraction_source.normalize_from_method_to_sources(about).each do |source|
142
- abstractor_text = source[:source_type].find(source[:source_id]).send(source[:source_method])
143
- parser = Abstractor::Parser.new(abstractor_text)
144
- abstractor_abstraction_schema.predicate_variants.each do |predicate_variant|
145
- ranges = parser.range_all(Regexp.escape(predicate_variant))
146
- if ranges.any?
147
- ranges.each do |range|
148
- sentence = parser.find_sentence(range)
149
- if sentence
150
- abstractor_abstraction_schema.abstractor_object_values.each do |abstractor_object_value|
151
- abstractor_object_value.object_variants.each do |object_variant|
152
- match = parser.match_sentence(sentence[:sentence], Regexp.escape(object_variant))
153
- if match
154
- scoped_sentence = Abstractor::NegationDetection.parse_negation_scope(sentence[:sentence])
155
- reject = (
156
- Abstractor::NegationDetection.negated_match_value?(scoped_sentence[:scoped_sentence], predicate_variant) ||
157
- Abstractor::NegationDetection.manual_negated_match_value?(sentence[:sentence], predicate_variant) ||
158
- Abstractor::NegationDetection.negated_match_value?(scoped_sentence[:scoped_sentence], object_variant) ||
159
- Abstractor::NegationDetection.manual_negated_match_value?(sentence[:sentence], object_variant)
160
- )
161
- if !reject
162
- suggest(abstractor_abstraction, abstractor_abstraction_source, sentence[:sentence], sentence[:sentence], source[:source_id], source[:source_type].to_s, source[:source_method], abstractor_object_value, nil, nil)
179
+ def abstract_sentential_name_value(about, abstractor_abstraction)
180
+ abstractor_abstraction_sources.each do |abstractor_abstraction_source|
181
+ abstractor_abstraction_source.normalize_from_method_to_sources(about).each do |source|
182
+ abstractor_text = source[:source_type].find(source[:source_id]).send(source[:source_method])
183
+ parser = Abstractor::Parser.new(abstractor_text)
184
+ abstractor_abstraction_schema.predicate_variants.each do |predicate_variant|
185
+ ranges = parser.range_all(Regexp.escape(predicate_variant))
186
+ if ranges.any?
187
+ ranges.each do |range|
188
+ sentence = parser.find_sentence(range)
189
+ if sentence
190
+ abstractor_abstraction_schema.abstractor_object_values.each do |abstractor_object_value|
191
+ abstractor_object_value.object_variants.each do |object_variant|
192
+ match = parser.match_sentence(sentence[:sentence], Regexp.escape(object_variant))
193
+ if match
194
+ scoped_sentence = Abstractor::NegationDetection.parse_negation_scope(sentence[:sentence])
195
+ reject = (
196
+ Abstractor::NegationDetection.negated_match_value?(scoped_sentence[:scoped_sentence], predicate_variant) ||
197
+ Abstractor::NegationDetection.manual_negated_match_value?(sentence[:sentence], predicate_variant) ||
198
+ Abstractor::NegationDetection.negated_match_value?(scoped_sentence[:scoped_sentence], object_variant) ||
199
+ Abstractor::NegationDetection.manual_negated_match_value?(sentence[:sentence], object_variant)
200
+ )
201
+ if !reject
202
+ suggest(abstractor_abstraction, abstractor_abstraction_source, sentence[:sentence], sentence[:sentence], source[:source_id], source[:source_type].to_s, source[:source_method], abstractor_object_value, nil, nil, nil)
203
+ end
163
204
  end
164
205
  end
165
206
  end
@@ -170,59 +211,69 @@ module Abstractor
170
211
  end
171
212
  end
172
213
  end
173
- end
174
214
 
175
- def suggest(abstractor_abstraction, abstractor_abstraction_source, match_value, sentence_match_value, source_id, source_type, source_method, abstractor_object_value, unknown, not_applicable)
176
- match_value.strip! unless match_value.nil?
177
- sentence_match_value.strip! unless sentence_match_value.nil?
178
- abstractor_suggestion = abstractor_abstraction.detect_abstractor_suggestion(abstractor_object_value.value) unless abstractor_object_value.nil?
179
- if !abstractor_suggestion
180
- abstractor_suggestion_status_needs_review = Abstractor::AbstractorSuggestionStatus.where(name: 'Needs review').first
181
- abstractor_suggestion = Abstractor::AbstractorSuggestion.create(
182
- abstractor_abstraction: abstractor_abstraction,
183
- abstractor_suggestion_status: abstractor_suggestion_status_needs_review,
184
- suggested_value: abstractor_object_value.try(:value),
185
- unknown: unknown,
186
- not_applicable: not_applicable
187
- )
188
- abstractor_suggestion.abstractor_suggestion_object_value = Abstractor::AbstractorSuggestionObjectValue.new(abstractor_object_value: abstractor_object_value)
215
+ def suggest(abstractor_abstraction, abstractor_abstraction_source, match_value, sentence_match_value, source_id, source_type, source_method, suggested_value, unknown, not_applicable, custom_method)
216
+ match_value.strip! unless match_value.nil?
217
+ sentence_match_value.strip! unless sentence_match_value.nil?
218
+ if abstractor_object_value?(suggested_value)
219
+ abstractor_object_value = suggested_value
220
+ suggested_value = suggested_value.value
221
+ end
222
+ abstractor_suggestion = abstractor_abstraction.detect_abstractor_suggestion(suggested_value) unless suggested_value.nil?
223
+ if !abstractor_suggestion
224
+ abstractor_suggestion_status_needs_review = Abstractor::AbstractorSuggestionStatus.where(name: 'Needs review').first
225
+ abstractor_suggestion = Abstractor::AbstractorSuggestion.create(
226
+ abstractor_abstraction: abstractor_abstraction,
227
+ abstractor_suggestion_status: abstractor_suggestion_status_needs_review,
228
+ suggested_value: suggested_value,
229
+ unknown: unknown,
230
+ not_applicable: not_applicable
231
+ )
232
+
233
+ abstractor_suggestion.abstractor_suggestion_object_value = Abstractor::AbstractorSuggestionObjectValue.new(abstractor_object_value: abstractor_object_value) if abstractor_object_value
234
+ end
235
+
236
+ abstractor_suggestion_source = abstractor_suggestion.detect_abstractor_suggestion_source(abstractor_abstraction_source, sentence_match_value, source_id, source_type)
237
+ if !abstractor_suggestion_source
238
+ Abstractor::AbstractorSuggestionSource.create(
239
+ abstractor_abstraction_source: abstractor_abstraction_source,
240
+ abstractor_suggestion: abstractor_suggestion,
241
+ match_value: match_value,
242
+ sentence_match_value: sentence_match_value,
243
+ source_id: source_id,
244
+ source_type: source_type,
245
+ source_method: source_method,
246
+ custom_method: custom_method
247
+ )
248
+ end
249
+ abstractor_suggestion
189
250
  end
190
251
 
191
- abstractor_suggestion_source = abstractor_suggestion.detect_abstractor_suggestion_source(abstractor_abstraction_source, sentence_match_value, source_id, source_type)
192
- if !abstractor_suggestion_source
193
- Abstractor::AbstractorSuggestionSource.create(
194
- abstractor_abstraction_source: abstractor_abstraction_source,
195
- abstractor_suggestion: abstractor_suggestion,
196
- match_value: match_value,
197
- sentence_match_value: sentence_match_value,
198
- source_id: source_id,
199
- source_type: source_type,
200
- source_method: source_method
201
- )
252
+ def abstractor_object_value?(suggested_value)
253
+ suggested_value.instance_of?(Abstractor::AbstractorObjectValue)
202
254
  end
203
- abstractor_suggestion
204
- end
205
255
 
206
- def create_unknown_abstractor_suggestion_name_only(about, abstractor_abstraction)
207
- abstractor_abstraction_sources.each do |abstractor_abstraction_source|
208
- abstractor_abstraction_source.normalize_from_method_to_sources(about).each do |source|
209
- abstractor_text = source[:source_type].find(source[:source_id]).send(source[:source_method])
210
- parser = Abstractor::Parser.new(abstractor_text)
211
- #Create an 'unknown' suggestion based on match name only if we have not made a suggstion
212
- if abstractor_abstraction.abstractor_suggestions(true).empty?
213
- abstractor_abstraction_schema.predicate_variants.each do |predicate_variant|
214
- ranges = parser.range_all(Regexp.escape(predicate_variant))
215
- if ranges
216
- ranges.each do |range|
217
- sentence = parser.find_sentence(range)
218
- if sentence
219
- scoped_sentence = Abstractor::NegationDetection.parse_negation_scope(sentence[:sentence])
220
- reject = (
221
- Abstractor::NegationDetection.negated_match_value?(scoped_sentence[:scoped_sentence], predicate_variant) ||
222
- Abstractor::NegationDetection.manual_negated_match_value?(sentence[:sentence], predicate_variant)
223
- )
224
- if !reject
225
- suggest(abstractor_abstraction, abstractor_abstraction_source, predicate_variant.downcase, sentence[:sentence], source[:source_id], source[:source_type].to_s, source[:source_method], nil, true, nil)
256
+ def create_unknown_abstractor_suggestion_name_only(about, abstractor_abstraction)
257
+ abstractor_abstraction_sources.each do |abstractor_abstraction_source|
258
+ abstractor_abstraction_source.normalize_from_method_to_sources(about).each do |source|
259
+ abstractor_text = source[:source_type].find(source[:source_id]).send(source[:source_method])
260
+ parser = Abstractor::Parser.new(abstractor_text)
261
+ #Create an 'unknown' suggestion based on match name only if we have not made a suggstion
262
+ if abstractor_abstraction.abstractor_suggestions(true).empty?
263
+ abstractor_abstraction_schema.predicate_variants.each do |predicate_variant|
264
+ ranges = parser.range_all(Regexp.escape(predicate_variant))
265
+ if ranges
266
+ ranges.each do |range|
267
+ sentence = parser.find_sentence(range)
268
+ if sentence
269
+ scoped_sentence = Abstractor::NegationDetection.parse_negation_scope(sentence[:sentence])
270
+ reject = (
271
+ Abstractor::NegationDetection.negated_match_value?(scoped_sentence[:scoped_sentence], predicate_variant) ||
272
+ Abstractor::NegationDetection.manual_negated_match_value?(sentence[:sentence], predicate_variant)
273
+ )
274
+ if !reject
275
+ suggest(abstractor_abstraction, abstractor_abstraction_source, predicate_variant.downcase, sentence[:sentence], source[:source_id], source[:source_type].to_s, source[:source_method], nil, true, nil, nil)
276
+ end
226
277
  end
227
278
  end
228
279
  end
@@ -231,27 +282,27 @@ module Abstractor
231
282
  end
232
283
  end
233
284
  end
234
- end
235
285
 
236
- def create_unknown_abstractor_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
237
- #Create an 'unknown' suggestion based on matching nothing only if we have not made a suggstion
238
- abstractor_abstraction_source.normalize_from_method_to_sources(about).each do |source|
239
- if abstractor_abstraction.abstractor_suggestions(true).empty?
240
- suggest(abstractor_abstraction, abstractor_abstraction_source, nil, nil, source[:source_id], source[:source_type].to_s, source[:source_method], nil, true, nil)
286
+ def create_unknown_abstractor_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
287
+ #Create an 'unknown' suggestion based on matching nothing only if we have not made a suggstion
288
+ abstractor_abstraction_source.normalize_from_method_to_sources(about).each do |source|
289
+ if abstractor_abstraction.abstractor_suggestions(true).empty?
290
+ suggest(abstractor_abstraction, abstractor_abstraction_source, nil, nil, source[:source_id], source[:source_type].to_s, source[:source_method], nil, true, nil, nil)
291
+ end
241
292
  end
242
293
  end
243
- end
244
294
 
245
- def groupable?
246
- !abstractor_subject_group_member.nil?
247
- end
295
+ def groupable?
296
+ !abstractor_subject_group_member.nil?
297
+ end
248
298
 
249
- private
299
+ private
250
300
 
251
- def object_variants(abstractor_object_value, abstractor_object_value_variants)
252
- aovv = abstractor_object_value_variants.select { |abstractor_object_value_variant| abstractor_object_value_variant.abstractor_object_value_id == abstractor_object_value.id }
253
- [abstractor_object_value.value].concat(aovv.map(&:value))
254
- end
301
+ def object_variants(abstractor_object_value, abstractor_object_value_variants)
302
+ aovv = abstractor_object_value_variants.select { |abstractor_object_value_variant| abstractor_object_value_variant.abstractor_object_value_id == abstractor_object_value.id }
303
+ [abstractor_object_value.value].concat(aovv.map(&:value))
304
+ end
305
+ end
255
306
  end
256
307
  end
257
308
  end
@@ -9,7 +9,7 @@ module Abstractor
9
9
  base.send :belongs_to, :abstractor_abstraction_source
10
10
  base.send :belongs_to, :abstractor_suggestion
11
11
 
12
- base.send :attr_accessible, :abstractor_abstraction_source, :abstractor_abstraction_source_id, :abstractor_suggestion, :abstractor_suggestion_id, :source_id, :source_type, :source_method, :match_value, :deleted_at, :sentence_match_value
12
+ base.send :attr_accessible, :abstractor_abstraction_source, :abstractor_abstraction_source_id, :abstractor_suggestion, :abstractor_suggestion_id, :source_id, :source_type, :source_method, :match_value, :deleted_at, :sentence_match_value, :custom_method
13
13
  end
14
14
  end
15
15
  end
@@ -1,3 +1,3 @@
1
1
  module Abstractor
2
- VERSION = '1.0.20'
2
+ VERSION = '1.0.22'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abstractor
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.20
4
+ version: 1.0.22
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Gurley, Yulia Bushmanova
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-17 00:00:00.000000000 Z
11
+ date: 2014-06-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -344,26 +344,6 @@ dependencies:
344
344
  - - ! '>='
345
345
  - !ruby/object:Gem::Version
346
346
  version: 2.2.1
347
- - !ruby/object:Gem::Dependency
348
- name: nubic-gem-tasks
349
- requirement: !ruby/object:Gem::Requirement
350
- requirements:
351
- - - ~>
352
- - !ruby/object:Gem::Version
353
- version: 1.0.0
354
- - - ! '>='
355
- - !ruby/object:Gem::Version
356
- version: 1.0.0
357
- type: :development
358
- prerelease: false
359
- version_requirements: !ruby/object:Gem::Requirement
360
- requirements:
361
- - - ~>
362
- - !ruby/object:Gem::Version
363
- version: 1.0.0
364
- - - ! '>='
365
- - !ruby/object:Gem::Version
366
- version: 1.0.0
367
347
  - !ruby/object:Gem::Dependency
368
348
  name: yard
369
349
  requirement: !ruby/object:Gem::Requirement
@@ -501,6 +481,8 @@ files:
501
481
  - db/migrate/20131227213427_create_abstractor_suggestions.rb
502
482
  - db/migrate/20131228041944_create_abstractor_suggestion_object_values.rb
503
483
  - db/migrate/20131228041945_create_abstractor_suggestion_sources.rb
484
+ - db/migrate/20140618140759_add_custom_method_to_abstractor_abstraction_sources.rb
485
+ - db/migrate/20140618140828_add_custom_method_to_abstractor_suggestion_sources.rb
504
486
  - db/seeds.rb
505
487
  - lib/abstractor.rb
506
488
  - lib/abstractor/abstractable.rb