roject 0.1.1 → 0.2.1

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.
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