roject 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 474139482a42d0581c7cfbfe88814a9c40d8d947
4
- data.tar.gz: 5f55210e15a6a37eb12611e6baf3cf38d8a8380d
3
+ metadata.gz: b97c2ef08f7a1a34af079cd290aa1add5150c73d
4
+ data.tar.gz: 30d00e93047cb2d05b1b85509fb9d7f56db47864
5
5
  SHA512:
6
- metadata.gz: e17d269ae387d6db4d9ffef73f9bc6763b5fefc08477af90c1f3a9f240c4815e51fcb879bf6a1384880d9777b3fbfc99524b5741537d4f24db2026bc0ef9c3c6
7
- data.tar.gz: fb3c33d37ae4b9a6a8c57185b68ff3dd148e55e0dd847be01b4430ba18334a30faf738af08ae7772ba363c7782f8cf15eeb611e76fec72aaca7f2aacd6404ac3
6
+ metadata.gz: 7706843324ed9f3939834ad416e2626ac74192d491e61b756d27f428059e8d28c9588b52d95e04d2f62a6ed4691b2365124ca9032fb331c0c611e466f0c2ac14
7
+ data.tar.gz: 8b6fd585b035bc4383467250c3f7040bd7dc027b26342f9283db032e8b4e25b2309552a33da284b48a8e11696fb1c2d4808f3c50c744668b4aa4eebbdf5e3684
data/Rakefile CHANGED
@@ -13,6 +13,7 @@ Created: 7 - 8 - 2016
13
13
 
14
14
  # Required libraries
15
15
  require "rspec/core/rake_task"
16
+ require "rubygems/tasks"
16
17
 
17
18
  # Requird files
18
19
  require_relative "lib/roject"
@@ -21,55 +22,19 @@ require_relative "lib/roject"
21
22
  GEMDIR = "gem"
22
23
  SPECDIR = "spec"
23
24
 
25
+ # Default task
26
+ task :default => :spec
27
+
24
28
  #----------------------------------RSPEC----------------------------------
25
29
 
26
- RSpec::Core::RakeTask.new :spec do |task|
30
+ RSpec::Core::RakeTask.new do |task|
27
31
  task.pattern = "#{SPECDIR}/*_spec.rb"
28
- task.rspec_opts = "--format documentation",
29
- "--color"
32
+ task.rspec_opts = "--format documentation --color"
30
33
  end
31
34
 
32
35
  #-----------------------------------GEM-----------------------------------
33
36
 
34
- namespace :gem do
35
-
36
- #----------------------------------GEM CLEAR TASKS----------------------------------
37
-
38
- namespace :clear do
39
- desc "Clear all gems"
40
- task :all do
41
- sh "rm #{GEMDIR}/*.gem"
42
- end
43
-
44
- desc "Clear old gems"
45
- task :old do
46
- sh "rm #{FileList.new("#{GEMDIR}/*.gem")
47
- .exclude("#{GEMDIR}/roject-#{Roject::VERSION}.gem")}"
48
- end
49
- end
50
-
51
- #----------------------------------GEM BUILD TASKS----------------------------------
52
-
53
- desc "Build gem and push to Rubygems"
54
- task :push => "#{GEMDIR}/roject-#{Roject::VERSION}.gem" do |task|
55
- sh "gem push #{task.source}"
56
- end
57
-
58
- desc "Build gem and install locally"
59
- task :install => "#{GEMDIR}/roject-#{Roject::VERSION}.gem" do |task|
60
- sh "gem install #{task.source}"
61
- end
62
-
63
- desc "Just buid gem"
64
- task :build => "#{GEMDIR}/roject-#{Roject::VERSION}.gem"
65
-
66
- #-------------------------------BUILD GEM FROM GEMSPEC------------------------------
67
-
68
- file "#{GEMDIR}/roject-#{Roject::VERSION}.gem" => "roject.gemspec" do |task|
69
- sh "gem build #{task.source}"
70
- sh "mv #{File.basename(task.name)} #{File.dirname(task.name)}"
71
- end
72
- end
37
+ Gem::Tasks.new
73
38
 
74
39
  #-----------------------------------GIT-----------------------------------
75
40
 
@@ -94,7 +59,4 @@ namespace :git do
94
59
  task :reset_hard do
95
60
  sh "git reset --hard HEAD"
96
61
  end
97
- end
98
-
99
- # Default spec
100
- task :default => "spec"
62
+ end
@@ -0,0 +1,2 @@
1
+ ---
2
+ name: project
File without changes
data/lib/loadsaveable.rb CHANGED
@@ -22,12 +22,11 @@ module Roject
22
22
  # Implementing objects can be loaded from and saved to files in
23
23
  # any of the supported data storage formats.
24
24
  #
25
- # Formats: json
25
+ # Formats: json, yaml
26
26
  #
27
- # Note: Implementing objects need to respond to the :hash method
28
- # which returns a hash of the data that needs to be saved
29
- # and a private config method which sets the data to the
30
- # given hash (for unit testing)
27
+ # Note: Implementing objects must have a constructor with takes a single hash
28
+ # argument and respond to the :hash method which returns a hash of the
29
+ # data that needs to be saved
31
30
  #
32
31
  # Author: Anshul Kharbanda
33
32
  # Created: 7 - 10 - 2016
data/lib/parsers.rb CHANGED
@@ -11,6 +11,7 @@ Created: 7 - 8 - 2016
11
11
 
12
12
  =end
13
13
 
14
+ # Parser libraries
14
15
  require "json"
15
16
  require "yaml"
16
17
 
@@ -26,9 +27,10 @@ module Roject
26
27
  module Parsers
27
28
  # Generic class parses files of a given type
28
29
  #
29
- # Subclasses must respond to :parse and :generate methods
30
+ # Subclasses must respond to :parse, :format, and :extension methods
30
31
  # - parse recieves a string and returns a hash
31
- # - generate recieves a hash and returns a string
32
+ # - format recieves a hash and returns a string
33
+ # - extensions returns all of the supported extensions of the Parser
32
34
  #
33
35
  # Author: Anshul Kharbanda
34
36
  # Created: 7 - 11 - 2016
@@ -39,15 +41,32 @@ module Roject
39
41
  # Returns the descendants of Parser
40
42
  #
41
43
  # Return: the descendants of Parser
42
- def self.descendents
44
+ def self.descendants
43
45
  ObjectSpace.each_object(Class).select {|c| c < self}
44
46
  end
45
47
 
46
- # Returns the extension name of the parser filetype
48
+ # Returns true if the parser is to be used for the given filename
47
49
  #
48
- # Return: the extension name of the parser filetype
49
- def self.extension
50
- "." + PARSER_REGEX.match(self.name)[:name].downcase
50
+ # Return: true if the parser is to be used for the given filename
51
+ def self.for_filename? filename
52
+ extensions.include? File.extname(filename)
53
+ end
54
+ end
55
+
56
+ # Returns the parser for the given filename
57
+ #
58
+ # Parameter: filename - the name of the file to parse
59
+ #
60
+ # Return: the parser for the given filename
61
+ def self.get(filename)
62
+ # Get parser from filename
63
+ parser = Parser.descendants.find { |klass| klass.for_filename? filename }
64
+
65
+ # Raise LoadError if no parser is found, else return parser
66
+ if parser.nil?
67
+ raise LoadError, "#{File.extname(filename)} not supported!"
68
+ else
69
+ return parser
51
70
  end
52
71
  end
53
72
 
@@ -58,6 +77,11 @@ module Roject
58
77
  # Author: Anshul Kharbanda
59
78
  # Created: 7 - 11 - 2016
60
79
  class JSONParser < Parser
80
+ # Returns the extensions supported for JSON
81
+ #
82
+ # Return: the extensions supported for JSON
83
+ def self.extensions; [".json"]; end
84
+
61
85
  # Parses the given json text into a hash
62
86
  #
63
87
  # Parameter: text - the json text to parse
@@ -78,6 +102,11 @@ module Roject
78
102
  # Author: Anshul Kharbanda
79
103
  # Created: 7 - 13 - 2016
80
104
  class YAMLParser < Parser
105
+ # Returns the extensions supported for YAML
106
+ #
107
+ # Return: the extensions supported for YAML
108
+ def self.extensions; [".yaml", ".yml"]; end
109
+
81
110
  # Parses the given yaml text into a hash
82
111
  #
83
112
  # Parameter: text - the yaml text to parse
@@ -112,22 +141,5 @@ module Roject
112
141
  hash.each_pair.collect { |k, v| [k.to_s, v.is_a?(Hash) ? stringified(v) : v] }.to_h
113
142
  end
114
143
  end
115
-
116
- #-----------------------------------------GET------------------------------------------
117
-
118
- # Returns the parser for the given filename
119
- #
120
- # Parameter: filename - the name of the file to parse
121
- #
122
- # Return: the parser for the given filename
123
- def self.get(filename)
124
- case File.extname(filename)
125
- when ".json" then return JSONParser
126
- when ".yaml" then return YAMLParser
127
-
128
- # Raise error if extension is not supported
129
- else raise LoadError, "#{File.extname(filename)} not supported!"
130
- end
131
- end
132
144
  end
133
145
  end
data/lib/project.rb CHANGED
@@ -34,9 +34,6 @@ module Roject
34
34
  @project = hash
35
35
  end
36
36
 
37
- # This is a test method and is depricated by default. Do not use!
38
- def config(hash); @project = hash; end
39
-
40
37
  # Returns a hash of the data contained in the project
41
38
  #
42
39
  # Return: a hash of the data contained in the project
data/lib/roject.rb CHANGED
@@ -20,5 +20,5 @@ require_relative "project"
20
20
  # Created: 7 - 8 - 2016
21
21
  module Roject
22
22
  # The Version of Roject
23
- VERSION = "0.2.1"
23
+ VERSION = "0.3.0"
24
24
  end
data/spec/project_spec.rb CHANGED
@@ -21,5 +21,20 @@ require_relative "spec_require"
21
21
  # Author: Anshul Kharbanda
22
22
  # Created: 7 - 8 - 2016
23
23
  describe Roject::Project do
24
- include_examples "loadsaveable", Roject::Project
24
+ # Describing LoadSaveable include
25
+ #
26
+ # Implementing objects can be loaded from and saved to files in
27
+ # any of the supported data storage formats.
28
+ #
29
+ # Formats: json, yaml
30
+ #
31
+ # Note: Implementing objects must have a constructor with takes a single hash
32
+ # argument and respond to the :hash method which returns a hash of the
33
+ # data that needs to be saved
34
+ #
35
+ # Author: Anshul Kharbanda
36
+ # Created: 7 - 10 - 2016
37
+ describe 'include LoadSaveable' do
38
+ include_examples "loadsaveable", Roject::Project
39
+ end
25
40
  end
@@ -32,6 +32,7 @@ shared_examples "loadsaveable" do |loadsaveable_class|
32
32
  @modded_hash = { name: "superproject", author: "Anshul Kharbanda" }
33
33
  @pjson_name = "#{@dir}/foo.json"
34
34
  @pyaml_name = "#{@dir}/foo.yaml"
35
+ @pyml_name = "#{@dir}/foo.yml"
35
36
  @phony_name = "#{@dir}/foo.bar"
36
37
  end
37
38
 
@@ -89,6 +90,14 @@ shared_examples "loadsaveable" do |loadsaveable_class|
89
90
  end
90
91
  end
91
92
 
93
+ context "with a .yml filename given" do
94
+ it "returns a new #{loadsaveable_class.name} from the yml file with the given filename" do
95
+ project = loadsaveable_class.load(@pyml_name)
96
+ expect(project).to be_an_instance_of loadsaveable_class
97
+ expect(project.hash).to eql read_yaml(@pyml_name)
98
+ end
99
+ end
100
+
92
101
  #-----------------------------UNSUPPORTED-----------------------------
93
102
 
94
103
  context "with an unsupported file extension given" do
@@ -129,6 +138,13 @@ shared_examples "loadsaveable" do |loadsaveable_class|
129
138
  end
130
139
  end
131
140
 
141
+ context "with a .yml filename given" do
142
+ it "saves the project to the given filename in yml format" do
143
+ @project.save @pyml_name
144
+ expect(read_yaml(@pyml_name)).to eql @modded_hash
145
+ end
146
+ end
147
+
132
148
  #-----------------------------UNSUPPORTED-----------------------------
133
149
 
134
150
  context "with an unsupported file extension given" do
@@ -142,6 +158,7 @@ shared_examples "loadsaveable" do |loadsaveable_class|
142
158
  after :all do
143
159
  write_json @pjson_name, @default_hash
144
160
  write_yaml @pyaml_name, @default_hash
161
+ write_yaml @pyml_name, @default_hash
145
162
  end
146
163
  end
147
164
 
@@ -174,7 +191,7 @@ shared_examples "loadsaveable" do |loadsaveable_class|
174
191
  project = self
175
192
 
176
193
  # Modify project
177
- config mhash
194
+ initialize mhash
178
195
  end }.not_to raise_error
179
196
  end
180
197
 
@@ -204,7 +221,7 @@ shared_examples "loadsaveable" do |loadsaveable_class|
204
221
  project = self
205
222
 
206
223
  # Modify project
207
- config mhash
224
+ initialize mhash
208
225
  end }.not_to raise_error
209
226
  end
210
227
 
@@ -220,6 +237,36 @@ shared_examples "loadsaveable" do |loadsaveable_class|
220
237
  end
221
238
  end
222
239
 
240
+ context "when file is .yml" do
241
+ # Declare project local variable
242
+ project = nil
243
+
244
+ it "loads a #{loadsaveable_class.name} from the yml file with the given filename (calling #load)" do
245
+ # Declare modded_hash local variable
246
+ mhash = @modded_hash
247
+
248
+ # Open project in a block
249
+ expect { loadsaveable_class.open @pyml_name do
250
+ # Set project to instance
251
+ project = self
252
+
253
+ # Modify project
254
+ initialize mhash
255
+ end }.not_to raise_error
256
+ end
257
+
258
+ it "evaluates the given block in the context of the loaded #{loadsaveable_class.name}" do
259
+ # Check if project was actually self, and it was successfuly modified
260
+ expect(project).to be_an_instance_of loadsaveable_class
261
+ expect(project.hash).to eql @modded_hash
262
+ end
263
+
264
+ it "saves the #{loadsaveable_class.name} when the block ends" do
265
+ # Check if the modded project was saved
266
+ expect(read_yaml(@pyml_name)).to eql @modded_hash
267
+ end
268
+ end
269
+
223
270
  #-----------------------------UNSUPPORTED-----------------------------
224
271
 
225
272
  context "when filetype is unsupported" do
@@ -231,6 +278,7 @@ shared_examples "loadsaveable" do |loadsaveable_class|
231
278
  after :all do
232
279
  write_json @pjson_name, @default_hash
233
280
  write_yaml @pyaml_name, @default_hash
281
+ write_yaml @pyml_name, @default_hash
234
282
  end
235
283
  end
236
284
 
@@ -253,6 +301,14 @@ shared_examples "loadsaveable" do |loadsaveable_class|
253
301
  end
254
302
  end
255
303
 
304
+ context "when file is .yml" do
305
+ it "loads a #{loadsaveable_class.name} from the yml file with the given filename (calling #load) and returns it." do
306
+ project = loadsaveable_class.open @pyml_name
307
+ expect(project).to be_an_instance_of loadsaveable_class
308
+ expect(project.hash).to eql @default_hash
309
+ end
310
+ end
311
+
256
312
  #-----------------------------UNSUPPORTED-----------------------------
257
313
 
258
314
  context "when filetype is unsupported" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roject
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anshul Kharbanda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-13 00:00:00.000000000 Z
11
+ date: 2016-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: general
@@ -80,6 +80,8 @@ files:
80
80
  - exp/loadsaveable/foo.bar
81
81
  - exp/loadsaveable/foo.json
82
82
  - exp/loadsaveable/foo.yaml
83
+ - exp/loadsaveable/foo.yml
84
+ - exp/project/project.yaml
83
85
  - lib/loadsaveable.rb
84
86
  - lib/parsers.rb
85
87
  - lib/project.rb