abstractor 1.0.20 → 1.0.22

Sign up to get free protection for your applications and to get access to all the features.
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