Class: Jiragit::Vault

Inherits:
Object
  • Object
show all
Defined in:
lib/jiragit/vault.rb

Instance Method Summary collapse

Constructor Details

#initialize(location) ⇒ Vault

Returns a new instance of Vault.



5
6
7
8
# File 'lib/jiragit/vault.rb', line 5

def initialize(location)
  self.location = location
  load_or_create
end

Instance Method Details

#add(item) ⇒ Object



29
30
31
# File 'lib/jiragit/vault.rb', line 29

def add(item)
  vault[item] = vault[item]
end

#createObject



19
20
21
22
23
# File 'lib/jiragit/vault.rb', line 19

def create
  self.vault = {}
  save
  vault
end

#distally_related?(item, related_item) ⇒ Boolean

Returns:

  • (Boolean)


59
60
61
# File 'lib/jiragit/vault.rb', line 59

def distally_related?(item, related_item)
  !!relation_chain(item, related_item)
end

#include?(item) ⇒ Boolean

Returns:

  • (Boolean)


33
34
35
# File 'lib/jiragit/vault.rb', line 33

def include?(item)
  vault.keys.include?(item)
end

#loadObject



14
15
16
17
# File 'lib/jiragit/vault.rb', line 14

def load
  return false unless File.exists?(location)
  self.vault = Marshal.load(File.read(location))
end

#load_or_createObject



10
11
12
# File 'lib/jiragit/vault.rb', line 10

def load_or_create
  self.vault = load || create
end

#relate(*items) ⇒ Object



37
38
39
40
41
42
43
44
45
# File 'lib/jiragit/vault.rb', line 37

def relate(*items)
  items.each do |item|
    add(item) unless include?(item)
    items.each do |related_item|
      add(related_item) unless include?(related_item)
      update_relation(item, related_item) unless item == related_item
    end
  end
end

#related?(*items) ⇒ Boolean

Returns:

  • (Boolean)


51
52
53
54
55
56
57
# File 'lib/jiragit/vault.rb', line 51

def related?(*items)
  items.inject(true) do |related, item|
    related && items.inject(true) do |related, related_item|
      related && related_items?(item, related_item)
    end
  end
end

#relation_chain(item, related_item) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/jiragit/vault.rb', line 63

def relation_chain(item, related_item)
  visited = Set.new
  visited << item
  to_visit = [ [ [item] , relations(item).to_a ] ]
  loop do
    break unless to_visit.any?
    chain, items = to_visit.first
    if items.any?
      item = items.shift
      if !visited.include?(item)
        visited << item
        relations = relations(item)
        to_visit << [chain + [item], relations.to_a] if relations.any?
        return chain + [item] if item == related_item
      end
    else
      to_visit.shift
    end
  end
  false
end

#relations(item) ⇒ Object



47
48
49
# File 'lib/jiragit/vault.rb', line 47

def relations(item)
  vault[item] || Set.new
end

#saveObject



25
26
27
# File 'lib/jiragit/vault.rb', line 25

def save
  File.open(location, 'w+') { |file| file.write Marshal.dump(vault) }
end