ygg 0.0.2 → 1.0.6

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.
@@ -0,0 +1,6 @@
1
+ module Ygg
2
+ class Link < Model
3
+ attr_accessor :source, :target, :info
4
+ def &(data); @info = data; end
5
+ end
6
+ end
@@ -1,61 +1,11 @@
1
- require "yaml"
2
-
3
1
  module Ygg
4
- @@data
5
- @@source
6
-
7
- def self.load(source = "ygg.yaml", &block)
8
-
9
- if source.kind_of? Symbol
10
- if File.exists? "#{source}.yml"
11
- source = "#{source}.yml"
12
- else
13
- source = "#{source}.yaml"
14
- end
15
- end
16
- @@source ||= source if source == "ygg.yaml"
17
- @@source = source if source != "ygg.yaml"
18
-
19
- @@data = {}
20
- @@data = YAML.load_file @@source if File.exists? @@source
21
-
22
- @@data.each do |key, model|
23
- model.each do |resource|
24
- resource.loading! if resource.respond_to? :loading!
25
- end if model.kind_of? Array
26
- end
27
-
28
- if block; yield; self.save; self.close; end
29
- end
30
-
31
- def self.save
32
- @@data ||= {}
33
- @@data.each do |key, model|
34
- model.each do |resource|
35
- resource._finalize! if resource.respond_to? :_finalize!
36
- end if model.kind_of? Array
37
- end
38
-
39
- File.open @@source, "w" do |file|
40
- file.write YAML.dump(@@data)
41
- end
42
- end
43
-
44
- def self.close; @@data = nil; @@source; end
45
-
46
- def self.data; @@data ||= {}; end
47
-
48
- def self.symbolize(res)
49
- return res.to_s.downcase.to_sym if res.kind_of? Class
50
- res.class.to_s.downcase.to_sym
51
- end
52
-
2
+
53
3
  class Model
54
4
  @@validator = [/(.*)/, [:index]]
55
5
 
56
6
  def initialize(*args)
57
- Ygg.data[Ygg.symbolize(self)] ||= []
58
- Ygg.data[Ygg.symbolize(self)] << self
7
+ Ygg.data[self.class] ||= []
8
+ Ygg.data[self.class] << self
59
9
  @created_at ||= Time.now if respond_to? :created_at
60
10
  @updated_at ||= Time.now if respond_to? :updated_at
61
11
 
@@ -79,11 +29,11 @@ module Ygg
79
29
  def _finalize!; finalize! if respond_to? :finalize!; end
80
30
  def _loading!; loading! if respond_to? :loading!; end
81
31
  def destroy
82
- Ygg.data[Ygg.symbolize(self)].delete self
32
+ Ygg.data[self.class].delete self
83
33
  # Destroy all Links
84
34
  end
85
35
  def _id
86
- Ygg.data[Ygg.symbolize(self)].index self
36
+ Ygg.data[self.class].index self
87
37
  end
88
38
 
89
39
  # Instance methods : Links
@@ -144,7 +94,7 @@ module Ygg
144
94
  end
145
95
 
146
96
  # Class methods : Shorthands
147
- def self.all; Ygg.data[Ygg.symbolize(self)]; end
97
+ def self.all; Ygg.data[self.class]; end
148
98
  def self.validator; @@validator; end
149
99
 
150
100
  # Class methods : Metamethods
@@ -170,55 +120,5 @@ module Ygg
170
120
  end
171
121
  end
172
122
  end
173
-
174
- class Link < Model
175
- attr_accessor :source, :target, :info
176
- def &(data); @info = data; end
177
- end
178
-
179
- class InvalidInitializor < RuntimeError; end
180
-
181
- module Delegator
182
- def delegate(target, *methods)
183
- methods.each do |method|
184
- self.class.send :define_method, method do |*a, &b|
185
- target.send method, *a, &b
186
- end
187
- end
188
- end
189
- end
190
- end
191
-
192
- class Array
193
- def method_missing(x, *args)
194
- if matches = x.to_s.match(/^sort_by_(.+)$/)
195
- key = matches[1].to_sym
196
- self.sort_by { |x| x.send(key) }
197
-
198
- elsif matches = x.to_s.match(/^by_(.+)$/) # Extend with regexps
199
- key = matches[1].to_sym
200
-
201
- if to_find = args.shift
202
- result = []
203
- self.each do |res|
204
- if res.respond_to? key
205
- datus = res.send key
206
- result << res if datus == to_find
207
- end
208
- end
209
- return [] if result.length == 0
210
- return result[0] if result.length == 1
211
- return result
212
-
213
- else
214
- self.send(:"sort_by_#{key}")[0] unless empty?
215
- end
216
-
217
- return []
218
- end
219
- end
220
- end
221
-
222
- #include Ygg::Delegator
223
123
 
224
- #delegate Ygg, :save, :data, :load
124
+ end
@@ -0,0 +1,25 @@
1
+ module Ygg
2
+ class DataBundle
3
+ def initialize(source_array = nil)
4
+ @data = source_array || []
5
+ end
6
+
7
+ def of_type(type)
8
+ @result = DataBundle.new
9
+ @data.each do |resource|
10
+ @result << resource if resource.instance_of? type
11
+ end
12
+ return @result.empty? ? nil : @result
13
+ end
14
+
15
+ # Delegate to array
16
+ def first; @data.first; end
17
+ def empty?; @data.empty?; end
18
+ def <<(*args); @data.<<(*args); end
19
+ def to_yaml; @data.to_yaml; end
20
+ def include?(*args); @data.include?(*args); end
21
+ def each(&block); @data.each { |e| block.call(e) }; end
22
+ def length; @data.length; end
23
+ def last; @data.last; end
24
+ end
25
+ end
@@ -0,0 +1,6 @@
1
+ module Ygg
2
+ class NoInteractionDoneException < StandardError; end
3
+ class UnavailableResourceException < IOError; end
4
+ class OutOfBlockException < StandardError; end
5
+ class InvalidResourceException < StandardError; end
6
+ end
@@ -0,0 +1,7 @@
1
+ module Ygg
2
+ module Record
3
+ def from_ygg
4
+ Ygg.records.of_type self
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,44 @@
1
+ module Ygg
2
+ class Session
3
+ def initialize(source = nil)
4
+ if source
5
+ @source = source
6
+ @records = DataBundle.new load
7
+ end
8
+ end
9
+
10
+ def load(path = nil)
11
+ @source = path if path
12
+ begin
13
+ File.exists?(@source) ? YAML.load_file(@source) : []
14
+ rescue Psych::SyntaxError => syntax_error
15
+ raise InvalidResourceException,
16
+ "The resource on #{@source} is invalid"
17
+ end
18
+ end
19
+
20
+ def shutdown
21
+ File.open @source, "w" do |file|
22
+ file.write @records.to_yaml
23
+ end
24
+ end
25
+
26
+ def source
27
+ raise Ygg::UnavailableResourceException, "No resource was setted." unless @source
28
+ @source
29
+ end
30
+
31
+ def source=(source); @source = source; end
32
+ def records; @records; end
33
+
34
+ def has_loaded_some?(of_class)
35
+ raise ArgumentError, "Not a class" unless of_class.is_a? Class
36
+ raise NoInteractionDoneException,
37
+ "No interaction done yet." unless records
38
+ records.each do |record|
39
+ return true if record.is_a? of_class
40
+ end
41
+ return false
42
+ end
43
+ end
44
+ end
@@ -1,3 +1,3 @@
1
- module Ygg
2
- VERSION = "0.0.2"
3
- end
1
+ module Ygg
2
+ VERSION = "1.0.6"
3
+ end
@@ -0,0 +1,61 @@
1
+ require "ygg"
2
+
3
+ module YggDemo
4
+ class User
5
+ attr_accessor :name
6
+ end
7
+
8
+ class Account
9
+ attr_accessor :currency, :amount
10
+ end
11
+ end
12
+
13
+ def base_path
14
+ File.dirname(File.dirname(__FILE__))
15
+ end
16
+ def folder_path
17
+ "emulations/samples"
18
+ end
19
+ def full_base_path
20
+ "#{base_path}/#{folder_path}"
21
+ end
22
+
23
+ def non_existent_file_identifier; :non_existent; end
24
+ def non_existent_file_path
25
+ "#{folder_path}/#{non_existent_file_identifier}.ygg"
26
+ end
27
+ def non_existent_full_path
28
+ "#{base_path}/#{non_existent_file_path}"
29
+ end
30
+ def valid_file_identifier; :valid; end
31
+ def valid_file_path; "#{valid_file_identifier}.ygg"; end
32
+ def valid_full_path; "#{full_base_path}/#{valid_file_path}"; end
33
+ def to_create_file_identifier; :to_create; end
34
+ def to_create_file_path; "#{to_create_file_identifier}.ygg"; end
35
+ def to_create_full_path; "#{full_base_path}/#{to_create_file_path}"; end
36
+
37
+ def to_modify_file_identifier; :to_modify; end
38
+ def to_modify_file_path; "#{to_modify_file_identifier}.ygg"; end
39
+ def to_modify_full_path
40
+ "#{full_base_path}/#{to_modify_file_path}"
41
+ end
42
+
43
+ def to_modify_2_file_identifier; :to_modify_2; end
44
+ def to_modify_2_file_path; "#{to_modify_2_file_identifier}.ygg"; end
45
+ def to_modify_2_full_path
46
+ "#{full_base_path}/#{to_modify_2_file_path}"
47
+ end
48
+
49
+ def invalid_resource_file_identifier; :invalid_resource; end
50
+ def invalid_resource_file_path; "#{invalid_resource_file_identifier}.ygg"; end
51
+ def invalid_resource_full_path
52
+ "#{full_base_path}/#{invalid_resource_file_path}"
53
+ end
54
+
55
+ def user_file_identifier; :user; end
56
+ def user_file_path; "#{user_file_identifier}.ygg"; end
57
+ def user_full_path; "#{full_base_path}/#{user_file_path}"; end
58
+
59
+ def the_last_object_of(resource_path)
60
+ YAML.load_file(resource_path).last
61
+ end
@@ -0,0 +1,54 @@
1
+ require "spec_helper"
2
+
3
+ describe Ygg::DataBundle do
4
+ describe "#of_type" do
5
+ context "no data" do
6
+ it "should return nil" do
7
+ the_databundle = Ygg::DataBundle.new
8
+ the_databundle.of_type(Object).should be_nil
9
+ end
10
+ end
11
+
12
+ context "data but nothing of that type" do
13
+ it "should return nil" do
14
+ the_databundle = Ygg::DataBundle.new ['element']
15
+ the_databundle.of_type(Array).should be_nil
16
+ end
17
+ end
18
+
19
+ context "one object of that kind" do
20
+ it "should return a databundle with the object" do
21
+ the_databundle = Ygg::DataBundle.new ['element', 4]
22
+ the_databundle.of_type(String).should include('element')
23
+ end
24
+ end
25
+ end
26
+
27
+ describe "#which_are" do
28
+ pending # return "#is_a?"
29
+ end
30
+
31
+ context "Non empty inner array" do
32
+ before :each do
33
+ @the_databundle = Ygg::DataBundle.new ['element']
34
+ end
35
+
36
+ describe "#first"
37
+ describe "#empty?"
38
+ describe "#<<"
39
+ describe "#to_yaml"
40
+ describe "#include?"
41
+ end
42
+
43
+ context "Empty inner array" do
44
+ before :each do
45
+ @the_databundle = Ygg::DataBundle
46
+ end
47
+
48
+ describe "#first"
49
+ describe "#empty?"
50
+ describe "#<<"
51
+ describe "#to_yaml"
52
+ describe "#include?"
53
+ end
54
+ end
@@ -0,0 +1,203 @@
1
+ require "spec_helper"
2
+
3
+ describe Ygg::Session do
4
+ def should_be_invalid(resource)
5
+ File.should exist(resource)
6
+ expect { YAML.load_file resource
7
+ }.to raise_error( Psych::SyntaxError )
8
+ end
9
+
10
+ def it_should_not_include_a(type, file_path)
11
+ data = YAML.load_file(file_path)
12
+ data.each do |record|
13
+ raise "It includes a #{type}" if record.is_a? type
14
+ end
15
+ end
16
+
17
+ def it_should_include_a(type, file_path)
18
+ data = YAML.load_file(file_path)
19
+ data.each do |record|
20
+ return if record.is_a? type
21
+ end
22
+ raise "It does not includes a #{type}"
23
+ end
24
+
25
+ before :each do
26
+ @path = File.dirname(File.dirname(File.dirname(__FILE__)))
27
+ should_be_invalid invalid_resource_full_path
28
+ end
29
+
30
+ describe ".new" do
31
+ it "should return a new session" do
32
+ @session = Ygg::Session.new "#{@path}/emulations/samples/user.ygg"
33
+ end
34
+
35
+ context "an invalid resource is passed" do
36
+ it "should fail" do
37
+ expect { Ygg::Session.new invalid_resource_full_path
38
+ }.to raise_error(
39
+ Ygg::InvalidResourceException,
40
+ "The resource on #{invalid_resource_full_path} is invalid" )
41
+ end
42
+ end
43
+ end
44
+
45
+ describe "#records" do
46
+ context "the file has the user Xavier Via" do
47
+ before :each do
48
+ @session = Ygg::Session.new "#{@path}/emulations/samples/user.ygg"
49
+ @the_record = @session.records.first
50
+ end
51
+
52
+ it "should not be empty the session data" do
53
+ @session.records.should_not be_empty
54
+ end
55
+
56
+ it "should be a record of type User" do
57
+ @the_record.should be_a(YggDemo::User)
58
+ end
59
+
60
+ it "should be named Xavier Via" do
61
+ @the_record.name.should == "Xavier Via"
62
+ end
63
+ end
64
+
65
+ context "the file is empty" do
66
+ it "should be empty the session data" do
67
+ @session = Ygg::Session.new "#{@path}/emulations/samples/random.ygg"
68
+ @session.records.should be_empty
69
+ end
70
+ end
71
+ end
72
+
73
+ describe "#shutdown" do
74
+ before :each do
75
+ @source = "#{@path}/emulations/samples/random.ygg"
76
+ @session = Ygg::Session.new @source
77
+ end
78
+
79
+ context "a string has been added to the data" do
80
+ before :each do
81
+ @session.records << "Hello data!"
82
+ @session.shutdown
83
+ end
84
+
85
+ it "should create a file after the source" do
86
+ File.should exist(@source)
87
+ end
88
+
89
+ it "should include the string in the file" do
90
+ @content = File.read @source
91
+ @content.should include("Hello data!")
92
+ end
93
+
94
+ after :each do
95
+ File.unlink @source
96
+ end
97
+ end
98
+ end
99
+
100
+ describe "#source" do
101
+ it "should fail if no source specified" do
102
+ session = Ygg::Session.new
103
+ expect { session.source
104
+ }.to raise_error( Ygg::UnavailableResourceException,
105
+ "No resource was setted." )
106
+ end
107
+
108
+ it "should return something" do
109
+ pending "dunno how to define what must return"
110
+ end
111
+ end
112
+
113
+ describe "#source=" do
114
+ it "should setup the source" do
115
+ session = Ygg::Session.new
116
+ session.source = valid_full_path
117
+ session.source.should == valid_full_path
118
+ end
119
+
120
+ it "should change the previous source" do
121
+ session = Ygg::Session.new
122
+ session.source = valid_full_path
123
+ expect { session.source = to_modify_full_path
124
+ }.to change { session.source
125
+ }.from( valid_full_path ).to( to_modify_full_path )
126
+ end
127
+ end
128
+
129
+ describe "#load" do
130
+ context "if no argument is passed" do
131
+ it "should fail if the argument is not a valid YAML stream" do
132
+ session = Ygg::Session.new
133
+ session.source = invalid_resource_full_path
134
+ expect { session.load
135
+ }.to raise_error(
136
+ Ygg::InvalidResourceException,
137
+ "The resource on #{invalid_resource_full_path} is invalid" )
138
+ end
139
+ end
140
+
141
+ context "an argument is passed" do
142
+ it "should override @source" do
143
+ session = Ygg::Session.new valid_full_path
144
+ expect { session.load to_modify_full_path
145
+ }.to change { session.source
146
+ }.from(valid_full_path).to(to_modify_full_path)
147
+ end
148
+
149
+ it "should fail if the argument is not a valid YAML stream" do
150
+ session = Ygg::Session.new
151
+ expect { session.load invalid_resource_full_path
152
+ }.to raise_error(
153
+ Ygg::InvalidResourceException,
154
+ "The resource on #{invalid_resource_full_path} is invalid" )
155
+ end
156
+ end
157
+
158
+ context "the source is a non existent file" do
159
+ it "should return an empty array" do
160
+ File.should_not exist( non_existent_full_path )
161
+ session = Ygg::Session.new non_existent_full_path
162
+ session.load.should be_empty
163
+ end
164
+ end
165
+
166
+ context "the source is a valid YAML stream" do
167
+ it "should return the object from the last document" do
168
+ the_last_object_of(user_full_path).should be_a(YggDemo::Account)
169
+ end
170
+ end
171
+ end
172
+
173
+ describe "#has_loaded_some?" do
174
+ it "should fail on no argument" do
175
+ expect { Ygg::Session.new.has_loaded_some?
176
+ }.to raise_error( ArgumentError )
177
+ end
178
+
179
+ it "should fail if argument is not a class" do
180
+ expect { Ygg::Session.new.has_loaded_some? (Object.new)
181
+ }.to raise_error( ArgumentError, "Not a class" )
182
+ end
183
+
184
+ it "should fail if no loading has been done" do
185
+ expect { Ygg::Session.new.has_loaded_some? (Object)
186
+ }.to raise_error(
187
+ Ygg::NoInteractionDoneException,
188
+ "No interaction done yet." )
189
+ end
190
+
191
+ it "should return false if there is no object of that type" do
192
+ it_should_not_include_a Array, user_full_path
193
+ session = Ygg::Session.new user_full_path
194
+ session.should_not have_loaded_some(Array)
195
+ end
196
+
197
+ it "should return true if there is some object of that type" do
198
+ it_should_include_a YggDemo::User, user_full_path
199
+ session = Ygg::Session.new user_full_path
200
+ session.should have_loaded_some(YggDemo::User)
201
+ end
202
+ end
203
+ end