Class: ReputationSystem::Network

Inherits:
Object
  • Object
show all
Defined in:
lib/reputation_system/network.rb

Class Method Summary collapse

Class Method Details

.add_reputation_def(class_name, reputation_name, options) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/reputation_system/network.rb', line 48

def add_reputation_def(class_name, reputation_name, options)
  reputation_defs = get_reputation_defs(class_name)
  options[:source] = convert_to_array_if_hash(options[:source])
  options[:source_of] ||= []
  options[:source_of] = convert_to_array_if_hash(options[:source_of])
  options[:aggregated_by] = options[:aggregated_by] || :sum
  assign_self_as_default_value_for_of_attr(options[:source])
  assign_self_as_default_value_for_of_attr(options[:source_of])
  reputation_defs[reputation_name] = options
  options[:source].each do |s|
    src_class_name = derive_class_name_from_attribute(class_name, s[:of])
    if has_reputation_for?(src_class_name, s[:reputation])
      derive_source_of_from_source(class_name, reputation_name, s, src_class_name)
    else
      # Because the source class might not have been initialized at this time.
      derive_source_of_from_source_later(class_name, reputation_name, s, src_class_name)
    end
  end unless is_primary_reputation?(class_name, reputation_name)
  perform_derive_later(class_name, reputation_name)
  construct_scoped_reputation_options(class_name, reputation_name, options)
end

.add_scope_for(class_name, reputation_name, scope) ⇒ Object



80
81
82
83
84
85
86
87
88
# File 'lib/reputation_system/network.rb', line 80

def add_scope_for(class_name, reputation_name, scope)
  options = get_reputation_def(class_name, reputation_name)
  if has_scope?(class_name, reputation_name, scope)
    raise ArgumentError, "#{scope} is already defined for #{reputation_name}"
  else
    options[:scopes].push scope.to_sym if options[:scopes]
    create_scoped_reputation_def(class_name, reputation_name, scope, options)
  end
end

.get_reputation_def(class_name, reputation_name) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/reputation_system/network.rb', line 29

def get_reputation_def(class_name, reputation_name)
  reputation_def = {}
  unless class_name == "ActiveRecord::Base"
    reputation_defs = get_reputation_defs(class_name)
    reputation_defs[reputation_name.to_sym] ||= {}
    reputation_def = reputation_defs[reputation_name.to_sym]
    if reputation_def == {}
      begin
        # This recursion finds reputation definition in the ancestor in case of STI.
        klass = class_name.constantize.superclass
        reputation_def = get_reputation_def(klass.name, reputation_name) if klass
      rescue NameError
        # Class might have not been initialized yet at this point.
      end
    end
  end
  reputation_def
end

.get_reputation_defs(class_name) ⇒ Object



25
26
27
# File 'lib/reputation_system/network.rb', line 25

def get_reputation_defs(class_name)
  network[class_name.to_sym] ||= {}
end

.get_scoped_reputation_name(class_name, reputation_name, scope) ⇒ Object

Raises:

  • (ArgumentError)


99
100
101
102
103
104
105
# File 'lib/reputation_system/network.rb', line 99

def get_scoped_reputation_name(class_name, reputation_name, scope)
  raise ArgumentError, "#{reputation_name.to_s} is not defined for #{class_name}" unless has_reputation_for?(class_name, reputation_name)
  scope = scope.to_sym if scope
  validate_scope_necessity(class_name, reputation_name, scope)
  validate_scope_existence(class_name, reputation_name, scope)
  "#{reputation_name}#{"_#{scope}" if scope}"
end

.get_weight_of_source_from_reputation_name_of_target(target, source_name, reputation_name) ⇒ Object



107
108
109
110
111
112
113
114
115
116
117
# File 'lib/reputation_system/network.rb', line 107

def get_weight_of_source_from_reputation_name_of_target(target, source_name, reputation_name)
  source = get_reputation_def(target.class.name, reputation_name)[:source]
  if source.is_a?(Array)
    source.each do |s|
      srn = get_scoped_reputation_name_from_source_def_and_target(s, target)
      return s[:weight] if srn.to_sym == source_name.to_sym
    end
  else
    source[:weight]
  end
end

.has_reputation_for?(class_name, reputation_name) ⇒ Boolean

Returns:

  • (Boolean)


20
21
22
23
# File 'lib/reputation_system/network.rb', line 20

def has_reputation_for?(class_name, reputation_name)
  reputation_def = get_reputation_def(class_name, reputation_name)
  !!reputation_def[:source]
end

.has_scope?(class_name, reputation_name, scope) ⇒ Boolean

Returns:

  • (Boolean)


94
95
96
97
# File 'lib/reputation_system/network.rb', line 94

def has_scope?(class_name, reputation_name, scope)
  scopes = get_reputation_def(class_name, reputation_name)[:scopes]
  scopes && scopes.include?(scope.to_sym)
end

.has_scopes?(class_name, reputation_name) ⇒ Boolean

Returns:

  • (Boolean)


90
91
92
# File 'lib/reputation_system/network.rb', line 90

def has_scopes?(class_name, reputation_name)
  !get_reputation_def(class_name, reputation_name)[:scopes].nil?
end

.is_primary_reputation?(class_name, reputation_name) ⇒ Boolean

Returns:

  • (Boolean)


75
76
77
78
# File 'lib/reputation_system/network.rb', line 75

def is_primary_reputation?(class_name, reputation_name)
  options = get_reputation_def(class_name, reputation_name)
  options[:source].is_a?(Symbol)
end

.remove_reputation_def(class_name, reputation_name) ⇒ Object



70
71
72
73
# File 'lib/reputation_system/network.rb', line 70

def remove_reputation_def(class_name, reputation_name)
  reputation_defs = get_reputation_defs(class_name)
  reputation_defs.delete(reputation_name.to_sym)
end