roject 0.1.1 → 0.2.1

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: 84a88a1601c05705728fe7e26a4e677653b70e50
4
- data.tar.gz: e968d8fa6e8161b388db2e32a54ea0d3eb6f6ab5
3
+ metadata.gz: 474139482a42d0581c7cfbfe88814a9c40d8d947
4
+ data.tar.gz: 5f55210e15a6a37eb12611e6baf3cf38d8a8380d
5
5
  SHA512:
6
- metadata.gz: d81ba53e80e147143fd55b1a64fb7a119f1b707633430f80ade4ea998ae2c361a4a9e867c299ae4a571e157eb7334f6c27e8f54e3fb36894bd85a886272d3a1c
7
- data.tar.gz: ffe33a6c6842189bc2c694530542165e3aa42417517f19a0528ceee925df218a1e789961d38ebc3d7911196706ffc7d3059479f81a024e8efbd0466022781b2a
6
+ metadata.gz: e17d269ae387d6db4d9ffef73f9bc6763b5fefc08477af90c1f3a9f240c4815e51fcb879bf6a1384880d9777b3fbfc99524b5741537d4f24db2026bc0ef9c3c6
7
+ data.tar.gz: fb3c33d37ae4b9a6a8c57185b68ff3dd148e55e0dd847be01b4430ba18334a30faf738af08ae7772ba363c7782f8cf15eeb611e76fec72aaca7f2aacd6404ac3
data/Rakefile CHANGED
@@ -85,11 +85,6 @@ namespace :git do
85
85
  sh "git commit -m #{args[:message].inspect}"
86
86
  end
87
87
 
88
- desc "Pull from repo"
89
- task :pull do
90
- sh "git pull origin master"
91
- end
92
-
93
88
  desc "Soft git reset"
94
89
  task :reset do
95
90
  sh "git reset"
@@ -0,0 +1,3 @@
1
+ {
2
+ "name": "project"
3
+ }
@@ -0,0 +1,2 @@
1
+ ---
2
+ name: project
data/lib/loadsaveable.rb CHANGED
@@ -26,6 +26,8 @@ module Roject
26
26
  #
27
27
  # Note: Implementing objects need to respond to the :hash method
28
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)
29
31
  #
30
32
  # Author: Anshul Kharbanda
31
33
  # Created: 7 - 10 - 2016
data/lib/parsers.rb CHANGED
@@ -12,6 +12,7 @@ Created: 7 - 8 - 2016
12
12
  =end
13
13
 
14
14
  require "json"
15
+ require "yaml"
15
16
 
16
17
  # Roject is a programming project manager written in Ruby.
17
18
  #
@@ -62,14 +63,54 @@ module Roject
62
63
  # Parameter: text - the json text to parse
63
64
  #
64
65
  # Return: the hash parsed from the text
65
- def self.parse(text); JSON.parse(text, symbolize_names: true); end
66
+ def self.parse(text); JSON.parse text, symbolize_names: true; end
66
67
 
67
68
  # Returns the given hash formatted to pretty json
68
69
  #
69
70
  # Parameter: hash - the hash to format
70
71
  #
71
72
  # Return: the given hash formatted to pretty json
72
- def self.format(hash); JSON.pretty_generate(hash, indent: "\t"); end
73
+ def self.format(hash); JSON.pretty_generate hash, indent: "\t"; end
74
+ end
75
+
76
+ # Parses YAML files
77
+ #
78
+ # Author: Anshul Kharbanda
79
+ # Created: 7 - 13 - 2016
80
+ class YAMLParser < Parser
81
+ # Parses the given yaml text into a hash
82
+ #
83
+ # Parameter: text - the yaml text to parse
84
+ #
85
+ # Return: the hash parsed from the text
86
+ def self.parse(text); symbolized YAML.load text; end
87
+
88
+ # Returns the given hash formatted to yaml
89
+ #
90
+ # Parameter: hash - the hash to format
91
+ #
92
+ # Return: the given hash formatted to yaml
93
+ def self.format(hash); YAML.dump stringified hash end
94
+
95
+ private
96
+
97
+ # Returns the hash with all of the keys converted to symbols
98
+ #
99
+ # Parameter: hash - the hash to symbolize
100
+ #
101
+ # Return: the hash with all of the keys converted to symbols
102
+ def self.symbolized hash
103
+ hash.each_pair.collect { |k, v| [k.to_sym, v.is_a?(Hash) ? symbolized(v) : v] }.to_h
104
+ end
105
+
106
+ # Returns the hash with all of the keys converted to strings
107
+ #
108
+ # Parameter: hash - the hash to stringify
109
+ #
110
+ # Return: the hash with all of the keys converted to strings
111
+ def self.stringified hash
112
+ hash.each_pair.collect { |k, v| [k.to_s, v.is_a?(Hash) ? stringified(v) : v] }.to_h
113
+ end
73
114
  end
74
115
 
75
116
  #-----------------------------------------GET------------------------------------------
@@ -82,6 +123,7 @@ module Roject
82
123
  def self.get(filename)
83
124
  case File.extname(filename)
84
125
  when ".json" then return JSONParser
126
+ when ".yaml" then return YAMLParser
85
127
 
86
128
  # Raise error if extension is not supported
87
129
  else raise LoadError, "#{File.extname(filename)} not supported!"
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.1.1"
23
+ VERSION = "0.2.1"
24
24
  end
data/spec/parsers_spec.rb CHANGED
@@ -67,7 +67,51 @@ describe Roject::Parsers do
67
67
  #
68
68
  # Return: the given hash formatted to pretty json
69
69
  describe '::format' do
70
- it 'formats the given hash into pretty JSON' do
70
+ it 'formats the given hash into pretty json' do
71
+ expect(@parser.format(@hash)).to eql @text
72
+ end
73
+ end
74
+ end
75
+
76
+ # Describing Roject::Parsers::YAMLParser
77
+ #
78
+ # Parses JSON files
79
+ #
80
+ # Author: Anshul Kharbanda
81
+ # Created: 7 - 11 - 2016
82
+ describe '::YAMLParser' do
83
+
84
+ #----------------------------------BEFORE-----------------------------------
85
+
86
+ before :all do
87
+ @text = YAML.dump(stringified(@hash))
88
+ @parser = Roject::Parsers::YAMLParser
89
+ end
90
+
91
+ #----------------------------------METHODS----------------------------------
92
+
93
+ # Describing Roject::Parsers::YAMLParser::parse
94
+ #
95
+ # Parses the given yaml text into a hash
96
+ #
97
+ # Parameter: text - the yaml text to parse
98
+ #
99
+ # Return: the hash parsed from the text
100
+ describe '::parse' do
101
+ it 'parses the given YAML text into a ruby hash' do
102
+ expect(@parser.parse(@text)).to eql @hash
103
+ end
104
+ end
105
+
106
+ # Describing Roject::Parsers::YAMLParser::format
107
+ #
108
+ # Returns the object hash formatted to yaml
109
+ #
110
+ # Parameter: hash - the hash to format
111
+ #
112
+ # Return: the given hash formatted to yaml
113
+ describe '::format' do
114
+ it 'formats the given hash into yaml' do
71
115
  expect(@parser.format(@hash)).to eql @text
72
116
  end
73
117
  end
@@ -78,6 +122,7 @@ describe Roject::Parsers do
78
122
  describe '::get' do
79
123
  it 'returns the appropriate parser according to the extension of the given filename' do
80
124
  expect(Roject::Parsers.get("foo.json")).to eql Roject::Parsers::JSONParser
125
+ expect(Roject::Parsers.get("foo.yaml")).to eql Roject::Parsers::YAMLParser
81
126
  end
82
127
  end
83
128
  end
@@ -27,11 +27,12 @@ shared_examples "loadsaveable" do |loadsaveable_class|
27
27
  #---------------------------------------BEFORE----------------------------------------
28
28
 
29
29
  before :all do
30
- @dir = "exp"
31
- @default_hash = { project_name: "project" }
32
- @modded_hash = { project_name: "superproject", author: "Anshul Kharbanda" }
33
- @pjson_name = "#{@dir}/project.json"
34
- @phony_name = "#{@dir}/project.foo"
30
+ @dir = "exp/loadsaveable"
31
+ @default_hash = { name: "project" }
32
+ @modded_hash = { name: "superproject", author: "Anshul Kharbanda" }
33
+ @pjson_name = "#{@dir}/foo.json"
34
+ @pyaml_name = "#{@dir}/foo.yaml"
35
+ @phony_name = "#{@dir}/foo.bar"
35
36
  end
36
37
 
37
38
  #--------------------------------------METHODS-----------------------------------------
@@ -80,6 +81,14 @@ shared_examples "loadsaveable" do |loadsaveable_class|
80
81
  end
81
82
  end
82
83
 
84
+ context "with a .yaml filename given" do
85
+ it "returns a new #{loadsaveable_class.name} from the yaml file with the given filename" do
86
+ project = loadsaveable_class.load(@pyaml_name)
87
+ expect(project).to be_an_instance_of loadsaveable_class
88
+ expect(project.hash).to eql read_yaml(@pyaml_name)
89
+ end
90
+ end
91
+
83
92
  #-----------------------------UNSUPPORTED-----------------------------
84
93
 
85
94
  context "with an unsupported file extension given" do
@@ -113,6 +122,13 @@ shared_examples "loadsaveable" do |loadsaveable_class|
113
122
  end
114
123
  end
115
124
 
125
+ context "with a .yaml filename given" do
126
+ it "saves the project to the given filename in yaml format" do
127
+ @project.save @pyaml_name
128
+ expect(read_yaml(@pyaml_name)).to eql @modded_hash
129
+ end
130
+ end
131
+
116
132
  #-----------------------------UNSUPPORTED-----------------------------
117
133
 
118
134
  context "with an unsupported file extension given" do
@@ -125,6 +141,7 @@ shared_examples "loadsaveable" do |loadsaveable_class|
125
141
 
126
142
  after :all do
127
143
  write_json @pjson_name, @default_hash
144
+ write_yaml @pyaml_name, @default_hash
128
145
  end
129
146
  end
130
147
 
@@ -169,7 +186,37 @@ shared_examples "loadsaveable" do |loadsaveable_class|
169
186
 
170
187
  it "saves the #{loadsaveable_class.name} when the block ends" do
171
188
  # Check if the modded project was saved
172
- expect(JSON.parse(IO.read(@pjson_name), symbolize_names: true)).to eql @modded_hash
189
+ expect(read_json(@pjson_name)).to eql @modded_hash
190
+ end
191
+ end
192
+
193
+ context "when file is .yaml" do
194
+ # Declare project local variable
195
+ project = nil
196
+
197
+ it "loads a #{loadsaveable_class.name} from the yaml file with the given filename (calling #load)" do
198
+ # Declare modded_hash local variable
199
+ mhash = @modded_hash
200
+
201
+ # Open project in a block
202
+ expect { loadsaveable_class.open @pyaml_name do
203
+ # Set project to instance
204
+ project = self
205
+
206
+ # Modify project
207
+ config mhash
208
+ end }.not_to raise_error
209
+ end
210
+
211
+ it "evaluates the given block in the context of the loaded #{loadsaveable_class.name}" do
212
+ # Check if project was actually self, and it was successfuly modified
213
+ expect(project).to be_an_instance_of loadsaveable_class
214
+ expect(project.hash).to eql @modded_hash
215
+ end
216
+
217
+ it "saves the #{loadsaveable_class.name} when the block ends" do
218
+ # Check if the modded project was saved
219
+ expect(read_yaml(@pyaml_name)).to eql @modded_hash
173
220
  end
174
221
  end
175
222
 
@@ -181,8 +228,9 @@ shared_examples "loadsaveable" do |loadsaveable_class|
181
228
  end
182
229
  end
183
230
 
184
- after :all do
231
+ after :all do
185
232
  write_json @pjson_name, @default_hash
233
+ write_yaml @pyaml_name, @default_hash
186
234
  end
187
235
  end
188
236
 
@@ -197,6 +245,14 @@ shared_examples "loadsaveable" do |loadsaveable_class|
197
245
  end
198
246
  end
199
247
 
248
+ context "when file is .yaml" do
249
+ it "loads a #{loadsaveable_class.name} from the yaml file with the given filename (calling #load) and returns it." do
250
+ project = loadsaveable_class.open @pyaml_name
251
+ expect(project).to be_an_instance_of loadsaveable_class
252
+ expect(project.hash).to eql @default_hash
253
+ end
254
+ end
255
+
200
256
  #-----------------------------UNSUPPORTED-----------------------------
201
257
 
202
258
  context "when filetype is unsupported" do
data/spec/spec_require.rb CHANGED
@@ -13,6 +13,7 @@ Created: 7 - 8 - 2016
13
13
 
14
14
  # Required libraries
15
15
  require "json"
16
+ require "yaml"
16
17
 
17
18
  # Required files for spec
18
19
  require_relative "../lib/parsers"
@@ -21,6 +22,26 @@ require_relative "../lib/project"
21
22
  # Spec shared examples
22
23
  require_relative "shared/loadsaveable_spec"
23
24
 
25
+ #-----------------------HASHMOD METHODS------------------------
26
+
27
+ # Returns the hash with all of the keys converted to symbols
28
+ #
29
+ # Parameter: hash - the hash to symbolize
30
+ #
31
+ # Return: the hash with all of the keys converted to symbols
32
+ def symbolized hash
33
+ hash.each_pair.collect { |k, v| [k.to_sym, v.is_a?(Hash) ? symbolized(v) : v] }.to_h
34
+ end
35
+
36
+ # Returns the hash with all of the keys converted to strings
37
+ #
38
+ # Parameter: hash - the hash to stringify
39
+ #
40
+ # Return: the hash with all of the keys converted to strings
41
+ def stringified hash
42
+ hash.each_pair.collect { |k, v| [k.to_s, v.is_a?(Hash) ? stringified(v) : v] }.to_h
43
+ end
44
+
24
45
  #------------------------READER METHODS------------------------
25
46
 
26
47
  # Reads JSON from the file with the given filename
@@ -32,6 +53,15 @@ def read_json filename
32
53
  JSON.parse IO.read(filename), symbolize_names: true
33
54
  end
34
55
 
56
+ # Reads YAML from the file with the given filename
57
+ #
58
+ # Parameter: filename - the name of the file to read
59
+ #
60
+ # Return: hash parsed from YAML file
61
+ def read_yaml filename
62
+ symbolized YAML.load IO.read(filename)
63
+ end
64
+
35
65
  #------------------------WRITER METHODS------------------------
36
66
 
37
67
  # Writes the given hash as JSON to the file with the
@@ -41,4 +71,13 @@ end
41
71
  # Parameter: hash - the hash to write
42
72
  def write_json filename, hash
43
73
  IO.write filename, JSON.pretty_generate(hash, indent: "\t")
74
+ end
75
+
76
+ # Writes the given hash as YAML to the file with the
77
+ # given filename
78
+ #
79
+ # Parameter: filename - the name of the file to write to
80
+ # Parameter: hash - the hash to write
81
+ def write_yaml filename, hash
82
+ IO.write filename, YAML.dump(stringified(hash))
44
83
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roject
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anshul Kharbanda
@@ -77,8 +77,9 @@ files:
77
77
  - LICENSE
78
78
  - README.md
79
79
  - Rakefile
80
- - exp/project.foo
81
- - exp/project.json
80
+ - exp/loadsaveable/foo.bar
81
+ - exp/loadsaveable/foo.json
82
+ - exp/loadsaveable/foo.yaml
82
83
  - lib/loadsaveable.rb
83
84
  - lib/parsers.rb
84
85
  - lib/project.rb
data/exp/project.json DELETED
@@ -1,3 +0,0 @@
1
- {
2
- "project_name": "project"
3
- }
File without changes