dough 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1 @@
1
+ # Dough
@@ -0,0 +1,46 @@
1
+ require File.expand_path('../../metadata', __FILE__)
2
+
3
+ class Dough
4
+ autoload :Masher, "dough/masher"
5
+ autoload :PlainTextMasher, "dough/plain_text_masher"
6
+ autoload :Ingredient, "dough/ingredient"
7
+ autoload :ID, "dough/id"
8
+ autoload :Bread, "dough/bread"
9
+
10
+ def initialize
11
+ @refs = {}
12
+ @ingredients = {}
13
+ end
14
+
15
+ # Public: Put an ingredient into the dough
16
+ #
17
+ # ingredient - The ingredient to add
18
+ #
19
+ # Returns an id with which to reference the ingredient
20
+ def add(ingredient)
21
+ ingredient = Ingredient.new(ingredient) unless ingredient.is_a? Ingredient
22
+
23
+ ingredient.freeze
24
+
25
+ @ingredients[ingredient.id] = ingredient
26
+ ingredient.id
27
+ end
28
+ alias :<< :add
29
+
30
+ # Public: Gets an ingredient
31
+ #
32
+ # id - The id of the ingredient
33
+ #
34
+ # Returns the ingredient specified by id
35
+ def get(id)
36
+ @ingredients[id]
37
+ end
38
+ alias :[] :get
39
+
40
+ # Deprecated: Bakes the Dough
41
+ #
42
+ # Returns a Bread
43
+ def bake
44
+ Bread.new self
45
+ end
46
+ end
@@ -0,0 +1,18 @@
1
+ require "dough"
2
+
3
+ class Dough
4
+ # Deprecated: Baked (Frozen) Dough
5
+ class Bread
6
+ # extend Forwardable
7
+
8
+ # def_delegators :@dough, :[], :get
9
+
10
+ def initialize(dough)
11
+ # @dough = dough.dup.freeze
12
+
13
+ @ingredients = dough.ingredients.dup.freeze
14
+
15
+ freeze
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,34 @@
1
+ require "dough"
2
+ require "digest/sha1"
3
+
4
+ class Dough
5
+ class ID
6
+ attr_reader :ingredient
7
+ attr_reader :hash
8
+ attr_reader :sha
9
+
10
+ def initialize(ingredient)
11
+ @ingredient = ingredient
12
+ # update
13
+ end
14
+
15
+ # Public: Refresh the id
16
+ #
17
+ # Returns self
18
+ def update
19
+ @sha = Digest::SHA1.hexdigest ingredient.marshalled
20
+ @hash = ingredient.marshalled.hash
21
+
22
+ self
23
+ end
24
+
25
+ def eql?(other)
26
+ other.is_a?(ID) && @hash == other.hash && @sha == other.sha
27
+ end
28
+ alias :== :eql?
29
+
30
+ def ===(other)
31
+ self == other || super
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,49 @@
1
+ require "dough"
2
+
3
+ class Dough
4
+ class Ingredient
5
+ extend Forwardable
6
+
7
+ attr_reader :object
8
+ attr_reader :id
9
+
10
+ def_delegators :@id, :==, :eql?
11
+
12
+ def initialize(object)
13
+ @id = ID.new(self)
14
+ update object
15
+
16
+ super()
17
+ end
18
+
19
+ def update(object)
20
+ @object = object.dup.freeze
21
+ @id.update # if @id
22
+ @marshalled = nil
23
+ @mashed = {}
24
+ end
25
+
26
+ def marshalled
27
+ @marshalled ||= Marshal.dump(@object)
28
+ end
29
+
30
+ def size
31
+ marshalled.size
32
+ end
33
+
34
+ def mashed(masher = Dough::Masher.default)
35
+ @mashed[masher] ||= @object.mash(masher.new)
36
+ end
37
+
38
+ private
39
+
40
+ def object=(object)
41
+ @object = object.dup.freeze
42
+ end
43
+
44
+ # def self.infect(mod = ::Object)
45
+ # $stderr.puts "Dough::Ingredient.infect: Infecting #{mod.to_s}"
46
+ # mod.send :include, Ingredient
47
+ # end
48
+ end
49
+ end
@@ -0,0 +1,48 @@
1
+ require "dough"
2
+
3
+ class Dough
4
+ # Public: Masher
5
+ class Masher
6
+ def initialize
7
+ @sections = {}
8
+ end
9
+
10
+ def [](name)
11
+ (@sections[name] ||= Section.new(name)).contents
12
+ end
13
+
14
+ def []=(name, contents)
15
+ (@sections[name] ||= Section.new(name)).contents = contents
16
+ end
17
+
18
+ def to_s
19
+ ""
20
+ end
21
+
22
+ def from_s(string)
23
+ self
24
+ end
25
+
26
+ def self.default
27
+ PlainTextMasher
28
+ end
29
+
30
+ def self.from(string)
31
+ new.from_s(string)
32
+ end
33
+ end
34
+ end
35
+
36
+ module Kernel
37
+ def mash(masher = Dough::Masher.default.new)
38
+ instance_variables.each do |name|
39
+ masher[:instance_variables] += "#{name}=#{instance_variable_get name}"
40
+ end
41
+
42
+ masher
43
+ end
44
+
45
+ def unmash(masher)
46
+
47
+ end
48
+ end
@@ -0,0 +1,40 @@
1
+ require "dough"
2
+
3
+ class Dough
4
+ class PlainTextMasher < Masher
5
+ def contents
6
+ @sections.values.map do |section|
7
+ "#{section.name}(#{section.size})>>#{section.contents.to_s}<<"
8
+ end.join("\n")
9
+ end
10
+
11
+ def to_s
12
+ contents = self.contents
13
+ header = "#{@ingredient.object.class} #{contents.size}\n"
14
+ header + contents
15
+ end
16
+
17
+ def from_s(str)
18
+ str.gsub! /\A([\:A-Za-z0-9\_]+)/, ''
19
+ type = $1
20
+ parts = type.split '::'
21
+ cla = Object
22
+ parts.each do |part|
23
+ cla = cla.const_get part
24
+ end
25
+
26
+ loop do
27
+ break if str.empty?
28
+
29
+ str.gsub! /\A(.*)\((\d+)\)>>/, ''
30
+ name, size = $~
31
+ str.gsub! /\A(.{#{size}})<</, ''
32
+ contents = $1
33
+ section = Section.new(name, contents)
34
+ @sections[name] = section
35
+ end
36
+
37
+ self
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,17 @@
1
+ require "dough"
2
+
3
+ class Dough
4
+ class Section
5
+ attr_reader :name
6
+ attr_accessor :contents
7
+
8
+ def initialize(name, contents = "")
9
+ @name = name
10
+ @contents = contents
11
+ end
12
+
13
+ def size
14
+ @contents.size
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ class Dough
2
+ NAME = "dough"
3
+ SUMMARY = "An object store"
4
+ DESCRIPTION = "Dough is #{SUMMARY}"
5
+ AUTHORS = ["Drew Young"]
6
+
7
+ module VERSION
8
+ MAJOR = 0
9
+ MINOR = 1
10
+ PATCH = 0
11
+ TAG = nil
12
+ BUILD = nil
13
+
14
+ def self.to_a
15
+ [ MAJOR, MINOR, PATCH, TAG, BUILD ].compact
16
+ end
17
+
18
+ def self.to_s
19
+ to_a.join '.'
20
+ end
21
+ end
22
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dough
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Drew Young
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-11-06 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Dough is An object store
15
+ email:
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/dough/bread.rb
21
+ - lib/dough/id.rb
22
+ - lib/dough/ingredient.rb
23
+ - lib/dough/masher.rb
24
+ - lib/dough/plain_text_masher.rb
25
+ - lib/dough/section.rb
26
+ - lib/dough.rb
27
+ - metadata.rb
28
+ - README.md
29
+ homepage:
30
+ licenses: []
31
+ post_install_message:
32
+ rdoc_options: []
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ segments:
42
+ - 0
43
+ hash: 179971539
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ segments:
51
+ - 0
52
+ hash: 179971539
53
+ requirements: []
54
+ rubyforge_project:
55
+ rubygems_version: 1.8.11
56
+ signing_key:
57
+ specification_version: 3
58
+ summary: An object store
59
+ test_files: []