roject 0.3.0 → 0.5.0

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: b97c2ef08f7a1a34af079cd290aa1add5150c73d
4
- data.tar.gz: 30d00e93047cb2d05b1b85509fb9d7f56db47864
3
+ metadata.gz: 208a333165807d295fc40b90cfddc1431721cfb4
4
+ data.tar.gz: b16f2f8863a41781887024765afbe592ad461503
5
5
  SHA512:
6
- metadata.gz: 7706843324ed9f3939834ad416e2626ac74192d491e61b756d27f428059e8d28c9588b52d95e04d2f62a6ed4691b2365124ca9032fb331c0c611e466f0c2ac14
7
- data.tar.gz: 8b6fd585b035bc4383467250c3f7040bd7dc027b26342f9283db032e8b4e25b2309552a33da284b48a8e11696fb1c2d4808f3c50c744668b4aa4eebbdf5e3684
6
+ metadata.gz: b0adfc93d7dc2c1add24a6537b217821a30a45f3e4b241036e55229c8a4fbe49169980af3fb1041fe3da14a74ec569ed16edbafc85e97f4fad040dc157747c6c
7
+ data.tar.gz: 2e395a73765997c907e5ebd83b0805c1e5abcf6384cfdf329a8a0328c03c48f4038bde95ab73d28b343e25baa534be836855d52b19295c8617b9e5f7a0f5c6fc
data/README.md CHANGED
@@ -1,3 +1,3 @@
1
1
  # Roject
2
2
 
3
- Roject is a programming project manager written in Ruby. With Roject, you can create and edit projects based on templates using simple commands without a heavy IDE.
3
+ Roject is a programming project manager written in Ruby. With Roject, you can create and edit projects based on templates and using simple, customisable commands without a heavy IDE.
@@ -1,3 +1,4 @@
1
1
  {
2
- "name": "project"
2
+ "name": "project",
3
+ "author": "Anshul Kharbanda"
3
4
  }
@@ -1,2 +1,3 @@
1
1
  ---
2
2
  name: project
3
+ author: Anshul Kharbanda
@@ -1,2 +1,3 @@
1
1
  ---
2
2
  name: project
3
+ author: Anshul Kharbanda
@@ -0,0 +1,21 @@
1
+ # Header file
2
+ file :header,
3
+ path: "include/@(project_name)/@(path)",
4
+ template: "templates/header.general",
5
+ extension: "h"
6
+
7
+ # Source file
8
+ file :source,
9
+ path: "src/@(path)",
10
+ template: "templates/source.general",
11
+ extension: "cpp"
12
+
13
+ # Module includes a source and include
14
+ task :module do |args|
15
+ # Add header id
16
+ args[:header_id] = c_header_id(args[:path])
17
+
18
+ # Create source and header
19
+ make :header, args
20
+ make :source, args
21
+ end
@@ -0,0 +1,17 @@
1
+ /*
2
+
3
+ Program: Dre
4
+
5
+ Nowadays everybody wanna talk like they got somethin' to say but nothin' comes out when they move their lips just a bunch of gibberish and they all acting like they forgot about Dre.
6
+
7
+ Author: Anshul Kharbanda
8
+ Created: 7 - 23 - 2016
9
+
10
+ */
11
+
12
+ #ifndef _PATH_TO_FILE_H_
13
+ #define _PATH_TO_FILE_H_
14
+
15
+ // Code
16
+
17
+ #endif
@@ -0,0 +1,14 @@
1
+ /*
2
+
3
+ Program: Dre
4
+
5
+ Nowadays everybody wanna talk like they got somethin' to say but nothin' comes out when they move their lips just a bunch of gibberish and they all acting like they forgot about Dre.
6
+
7
+ Author: Anshul Kharbanda
8
+ Created: 7 - 23 - 2016
9
+
10
+ */
11
+
12
+ #include "Dre/path/to/file.h"
13
+
14
+ // Code
@@ -0,0 +1,9 @@
1
+ ---
2
+ project_name: Dre
3
+ author: Anshul Kharbanda
4
+ created: 7 - 23 - 2016
5
+ short_description: Forgot about Dre.
6
+ long_description: Nowadays everybody wanna talk like they got somethin' to say but nothin' comes out when they move their lips just a bunch of gibberish and they all acting like they forgot about Dre.
7
+ directories:
8
+ - include
9
+ - src
@@ -0,0 +1,17 @@
1
+ /*
2
+
3
+ Program: @(project_name)
4
+
5
+ @(long_description)
6
+
7
+ Author: @(author)
8
+ Created: @(created)
9
+
10
+ */
11
+
12
+ #ifndef @(header_id)
13
+ #define @(header_id)
14
+
15
+ // Code
16
+
17
+ #endif
@@ -0,0 +1,14 @@
1
+ /*
2
+
3
+ Program: @(project_name)
4
+
5
+ @(long_description)
6
+
7
+ Author: @(author)
8
+ Created: @(created)
9
+
10
+ */
11
+
12
+ #include "@(project_name)/@(path).h"
13
+
14
+ // Code
data/lib/helpers.rb ADDED
@@ -0,0 +1,33 @@
1
+ =begin
2
+
3
+ Program: Roject
4
+
5
+ Roject is a programming project manager written in Ruby.
6
+ With Roject, you can create and edit projects based on templates
7
+ using simple commands without a heavy IDE.
8
+
9
+ Author: Anshul Kharbanda
10
+ Created: 7 - 8 - 2016
11
+
12
+ =end
13
+
14
+ # Roject is a programming project manager written in Ruby.
15
+ #
16
+ # Author: Anshul Kharbanda
17
+ # Created: 7 - 8 - 2016
18
+ module Roject
19
+ # Helpers for Roject projects
20
+ #
21
+ # Author: Anshul Kharbanda
22
+ # Created: 7 - 8 - 2016
23
+ module Helpers
24
+ # Generates a c header id for the given path
25
+ # this is an identifier used for checking if
26
+ # the header has been implemented
27
+ #
28
+ # Parameters: path - the path being converted
29
+ #
30
+ # Return: a c header id generated from the given path
31
+ def c_header_id(path); "_#{path.upcase.gsub(/\/|\\/, "_")}_H_"; end
32
+ end
33
+ end
data/lib/loadsaveable.rb CHANGED
@@ -64,6 +64,33 @@ module Roject
64
64
  def load filename
65
65
  self.new Parsers.get(filename).parse IO.read filename
66
66
  end
67
+
68
+ # Defines getter methods for the given names
69
+ # each retrieve the value of name in the hash
70
+ #
71
+ # Parameter: names - the names to define
72
+ def get *names
73
+ unless names.empty?
74
+ names.each do |name|
75
+ #add name to attributes list
76
+ @attributes ||= []
77
+ @attributes << name
78
+
79
+ # define method name
80
+ define_method(name) { hash[name] }
81
+ end
82
+ end
83
+ end
84
+
85
+ # Returns all attributes that are
86
+ # part of the LoadSaveable implementation
87
+ #
88
+ # Return: all attributes that are
89
+ # part of the LoadSaveable
90
+ # implementation
91
+ def attributes
92
+ @attributes or []
93
+ end
67
94
  end
68
95
 
69
96
  # Methods that are implemented at the instance level
data/lib/maker.rb ADDED
@@ -0,0 +1,78 @@
1
+ =begin
2
+
3
+ Program: Roject
4
+
5
+ Roject is a programming project manager written in Ruby.
6
+ With Roject, you can create and edit projects based on templates
7
+ using simple commands without a heavy IDE.
8
+
9
+ Author: Anshul Kharbanda
10
+ Created: 7 - 8 - 2016
11
+
12
+ =end
13
+
14
+ # Libraries
15
+ require "general"
16
+ require "fileutils"
17
+
18
+ # Roject is a programming project manager written in Ruby.
19
+ #
20
+ # Author: Anshul Kharbanda
21
+ # Created: 7 - 8 - 2016
22
+ module Roject
23
+ # Runs a task with the given arguments
24
+ #
25
+ # Author: Anshul Kharbanda
26
+ # Created: 7 - 23 - 2016
27
+ class TaskMaker
28
+ # Initializes a TaskMaker with the given block
29
+ #
30
+ # Parameter: &block - the block to run on make
31
+ def initialize(&block); @block = block; end
32
+
33
+ # Runs the task with the given arguments
34
+ #
35
+ # Parameter: project - the project running the task
36
+ # Parameter: args - the args being used to run the task
37
+ def make project, args
38
+ project.instance_exec project.hash.merge(args), &@block
39
+ end
40
+ end
41
+
42
+ # Creates files according to the given credentials
43
+ #
44
+ # Author: Anshul Kharbanda
45
+ # Created: 7 - 21 - 2016
46
+ class FileMaker
47
+ # Read extension, directory, and template
48
+ attr :extension, :directory, :template
49
+
50
+ # Initializes a FileMaker from the given hash
51
+ #
52
+ # Parameter: hash - the hash to parse
53
+ def initialize hash
54
+ @path = General::GTemplate.new hash[:path]
55
+ @template = General::GIO.load hash[:template]
56
+ @extension = hash[:extension]
57
+ end
58
+
59
+ # Creates a file of the filetype with the given args
60
+ #
61
+ # Parameter: project - the project running the task
62
+ # Parameter: args - the args being used to create the file
63
+ def make project, args
64
+ # merge args with project
65
+ args.merge! project.hash
66
+
67
+ # Get path
68
+ path = "#{@path.apply(args)}.#{@extension}"
69
+
70
+ # Create directory
71
+ dir = File.dirname(path)
72
+ FileUtils.mkdir_p dir unless Dir.exist? dir
73
+
74
+ # Write template to path
75
+ @template.write(path, args)
76
+ end
77
+ end
78
+ end
data/lib/project.rb CHANGED
@@ -11,8 +11,10 @@ Created: 7 - 8 - 2016
11
11
 
12
12
  =end
13
13
 
14
- # Loadsaveable
14
+ # Other modules
15
15
  require_relative "loadsaveable"
16
+ require_relative "helpers"
17
+ require_relative "maker"
16
18
 
17
19
  # Roject is a programming project manager written in Ruby.
18
20
  #
@@ -24,21 +26,61 @@ module Roject
24
26
  # Author: Anshul Kharbanda
25
27
  # Created: 7 - 10 - 2016
26
28
  class Project
27
- # Includes LoadSaveable
29
+ # Includes
28
30
  include LoadSaveable
31
+ include Helpers
29
32
 
30
33
  # Creates a Project with the given data hash
31
34
  #
32
35
  # Parameter: hash - the data to be contained in the project
33
36
  def initialize hash={}
34
37
  @project = hash
38
+ @makers = {}
35
39
  end
36
40
 
37
41
  # Returns a hash of the data contained in the project
38
42
  #
39
43
  # Return: a hash of the data contained in the project
40
- def hash
41
- @project
44
+ def hash; @project; end
45
+
46
+ # Attributes part of Project
47
+ get :project_name,
48
+ :author,
49
+ :created,
50
+ :short_description,
51
+ :long_description,
52
+ :directories
53
+
54
+ # Loads the makers in the file with the given filename
55
+ #
56
+ # Parameter: filename - the name of the file to read
57
+ def load_makers(filename); instance_eval(IO.read(filename)); end
58
+
59
+ # Runs the maker of the given name with the given args
60
+ #
61
+ # Parameter: name - the name of the maker to run
62
+ # Parameter: args - the args to pass to the file
63
+ def make name, args
64
+ @makers[name].make(self, args)
65
+ end
66
+
67
+ # Creates a file maker with the given name and hash
68
+ #
69
+ # Parameter: name - the name of the maker
70
+ # Parameter: hash - the hash arguments of the maker
71
+ def file name, hash
72
+ @makers[name] = FileMaker.new(hash)
73
+ end
74
+
75
+ # Adds the recipie specified by the given name and block
76
+ # to the makers table
77
+ #
78
+ # Parameter: name - the name of the recipie
79
+ # Parameter: block - the recipie block
80
+ #
81
+ # Throw: RuntimeError - if the name is already defined as a filetype
82
+ def task name, &block
83
+ @makers[name] = TaskMaker.new &block
42
84
  end
43
85
  end
44
86
  end
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.3.0"
23
+ VERSION = "0.5.0"
24
24
  end
@@ -11,7 +11,9 @@ Created: 7 - 8 - 2016
11
11
 
12
12
  =end
13
13
 
14
- # Describing loadsaveable_class
14
+ require_relative "spec_require"
15
+
16
+ # Describing LoadSaveable
15
17
  #
16
18
  # Implementing objects can be loaded from and saved to files in
17
19
  # any of the supported data storage formats.
@@ -23,17 +25,25 @@ Created: 7 - 8 - 2016
23
25
  #
24
26
  # Author: Anshul Kharbanda
25
27
  # Created: 7 - 11 - 2016
26
- shared_examples "loadsaveable" do |loadsaveable_class|
28
+ describe Roject::LoadSaveable do
27
29
  #---------------------------------------BEFORE----------------------------------------
28
30
 
29
31
  before :all do
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
- @pyml_name = "#{@dir}/foo.yml"
36
- @phony_name = "#{@dir}/foo.bar"
32
+ # Basic LoadSaveable implementation
33
+ class LoadSaveableClass
34
+ include Roject::LoadSaveable
35
+ def initialize(hash={}); @foo = hash; end
36
+ def hash; @foo; end
37
+ get :name, :author
38
+ end
39
+
40
+ @dir = "exp/loadsaveable"
41
+ @default_hash = { name: "project", author: "Anshul Kharbanda" }
42
+ @modded_hash = { name: "superproject", author: "Super Anshul Kharbanda" }
43
+ @pjson_name = "#{@dir}/foo.json"
44
+ @pyaml_name = "#{@dir}/foo.yaml"
45
+ @pyml_name = "#{@dir}/foo.yml"
46
+ @phony_name = "#{@dir}/foo.bar"
37
47
  end
38
48
 
39
49
  #--------------------------------------METHODS-----------------------------------------
@@ -47,17 +57,17 @@ shared_examples "loadsaveable" do |loadsaveable_class|
47
57
  # Return: the created LoadSaveable
48
58
  describe "::new" do
49
59
  context "with no arguments" do
50
- it "creates an empty #{loadsaveable_class.name}" do
51
- project = loadsaveable_class.new
52
- expect(project).to be_an_instance_of loadsaveable_class
60
+ it "creates an empty LoadSaveable" do
61
+ project = LoadSaveableClass.new
62
+ expect(project).to be_an_instance_of LoadSaveableClass
53
63
  expect(project.hash).to eql Hash.new
54
64
  end
55
65
  end
56
66
 
57
67
  context "with a given data hash" do
58
- it "creates a new #{loadsaveable_class.name} with the given data hash" do
59
- project = loadsaveable_class.new @default_hash
60
- expect(project).to be_an_instance_of loadsaveable_class
68
+ it "creates a new LoadSaveable with the given data hash" do
69
+ project = LoadSaveableClass.new @default_hash
70
+ expect(project).to be_an_instance_of LoadSaveableClass
61
71
  expect(project.hash).to eql @default_hash
62
72
  end
63
73
  end
@@ -75,25 +85,25 @@ shared_examples "loadsaveable" do |loadsaveable_class|
75
85
  #------------------------------FILETYPES------------------------------
76
86
 
77
87
  context "with a .json filename given" do
78
- it "returns a new #{loadsaveable_class.name} from the json file with the given filename" do
79
- project = loadsaveable_class.load(@pjson_name)
80
- expect(project).to be_an_instance_of loadsaveable_class
88
+ it "returns a new LoadSaveable from the json file with the given filename" do
89
+ project = LoadSaveableClass.load(@pjson_name)
90
+ expect(project).to be_an_instance_of LoadSaveableClass
81
91
  expect(project.hash).to eql read_json(@pjson_name)
82
92
  end
83
93
  end
84
94
 
85
95
  context "with a .yaml filename given" do
86
- it "returns a new #{loadsaveable_class.name} from the yaml file with the given filename" do
87
- project = loadsaveable_class.load(@pyaml_name)
88
- expect(project).to be_an_instance_of loadsaveable_class
96
+ it "returns a new LoadSaveable from the yaml file with the given filename" do
97
+ project = LoadSaveableClass.load(@pyaml_name)
98
+ expect(project).to be_an_instance_of LoadSaveableClass
89
99
  expect(project.hash).to eql read_yaml(@pyaml_name)
90
100
  end
91
101
  end
92
102
 
93
103
  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
104
+ it "returns a new LoadSaveable from the yml file with the given filename" do
105
+ project = LoadSaveableClass.load(@pyml_name)
106
+ expect(project).to be_an_instance_of LoadSaveableClass
97
107
  expect(project.hash).to eql read_yaml(@pyml_name)
98
108
  end
99
109
  end
@@ -102,7 +112,7 @@ shared_examples "loadsaveable" do |loadsaveable_class|
102
112
 
103
113
  context "with an unsupported file extension given" do
104
114
  it "raises LoadError" do
105
- expect { loadsaveable_class.load(@phony_name) }.to raise_error LoadError
115
+ expect { LoadSaveableClass.load(@phony_name) }.to raise_error LoadError
106
116
  end
107
117
  end
108
118
  end
@@ -119,7 +129,7 @@ shared_examples "loadsaveable" do |loadsaveable_class|
119
129
  #-------------------------------BEFORE--------------------------------
120
130
 
121
131
  before :each do
122
- @project = loadsaveable_class.new @modded_hash
132
+ @project = LoadSaveableClass.new @modded_hash
123
133
  end
124
134
 
125
135
  #------------------------------FILETYPES------------------------------
@@ -181,12 +191,12 @@ shared_examples "loadsaveable" do |loadsaveable_class|
181
191
  # Declare project local variable
182
192
  project = nil
183
193
 
184
- it "loads a #{loadsaveable_class.name} from the json file with the given filename (calling #load)" do
194
+ it "loads a LoadSaveable from the json file with the given filename (calling #load)" do
185
195
  # Declare modded_hash local variable
186
196
  mhash = @modded_hash
187
197
 
188
198
  # Open project in a block
189
- expect { loadsaveable_class.open @pjson_name do
199
+ expect { LoadSaveableClass.open @pjson_name do
190
200
  # Set project to instance
191
201
  project = self
192
202
 
@@ -195,13 +205,13 @@ shared_examples "loadsaveable" do |loadsaveable_class|
195
205
  end }.not_to raise_error
196
206
  end
197
207
 
198
- it "evaluates the given block in the context of the loaded #{loadsaveable_class.name}" do
208
+ it "evaluates the given block in the context of the loaded LoadSaveable" do
199
209
  # Check if project was actually self, and it was successfuly modified
200
- expect(project).to be_an_instance_of loadsaveable_class
210
+ expect(project).to be_an_instance_of LoadSaveableClass
201
211
  expect(project.hash).to eql @modded_hash
202
212
  end
203
213
 
204
- it "saves the #{loadsaveable_class.name} when the block ends" do
214
+ it "saves the LoadSaveable when the block ends" do
205
215
  # Check if the modded project was saved
206
216
  expect(read_json(@pjson_name)).to eql @modded_hash
207
217
  end
@@ -211,12 +221,12 @@ shared_examples "loadsaveable" do |loadsaveable_class|
211
221
  # Declare project local variable
212
222
  project = nil
213
223
 
214
- it "loads a #{loadsaveable_class.name} from the yaml file with the given filename (calling #load)" do
224
+ it "loads a LoadSaveable from the yaml file with the given filename (calling #load)" do
215
225
  # Declare modded_hash local variable
216
226
  mhash = @modded_hash
217
227
 
218
228
  # Open project in a block
219
- expect { loadsaveable_class.open @pyaml_name do
229
+ expect { LoadSaveableClass.open @pyaml_name do
220
230
  # Set project to instance
221
231
  project = self
222
232
 
@@ -225,13 +235,13 @@ shared_examples "loadsaveable" do |loadsaveable_class|
225
235
  end }.not_to raise_error
226
236
  end
227
237
 
228
- it "evaluates the given block in the context of the loaded #{loadsaveable_class.name}" do
238
+ it "evaluates the given block in the context of the loaded LoadSaveable" do
229
239
  # Check if project was actually self, and it was successfuly modified
230
- expect(project).to be_an_instance_of loadsaveable_class
240
+ expect(project).to be_an_instance_of LoadSaveableClass
231
241
  expect(project.hash).to eql @modded_hash
232
242
  end
233
243
 
234
- it "saves the #{loadsaveable_class.name} when the block ends" do
244
+ it "saves the LoadSaveable when the block ends" do
235
245
  # Check if the modded project was saved
236
246
  expect(read_yaml(@pyaml_name)).to eql @modded_hash
237
247
  end
@@ -241,12 +251,12 @@ shared_examples "loadsaveable" do |loadsaveable_class|
241
251
  # Declare project local variable
242
252
  project = nil
243
253
 
244
- it "loads a #{loadsaveable_class.name} from the yml file with the given filename (calling #load)" do
254
+ it "loads a LoadSaveable from the yml file with the given filename (calling #load)" do
245
255
  # Declare modded_hash local variable
246
256
  mhash = @modded_hash
247
257
 
248
258
  # Open project in a block
249
- expect { loadsaveable_class.open @pyml_name do
259
+ expect { LoadSaveableClass.open @pyml_name do
250
260
  # Set project to instance
251
261
  project = self
252
262
 
@@ -255,13 +265,13 @@ shared_examples "loadsaveable" do |loadsaveable_class|
255
265
  end }.not_to raise_error
256
266
  end
257
267
 
258
- it "evaluates the given block in the context of the loaded #{loadsaveable_class.name}" do
268
+ it "evaluates the given block in the context of the loaded LoadSaveable" do
259
269
  # Check if project was actually self, and it was successfuly modified
260
- expect(project).to be_an_instance_of loadsaveable_class
270
+ expect(project).to be_an_instance_of LoadSaveableClass
261
271
  expect(project.hash).to eql @modded_hash
262
272
  end
263
273
 
264
- it "saves the #{loadsaveable_class.name} when the block ends" do
274
+ it "saves the LoadSaveable when the block ends" do
265
275
  # Check if the modded project was saved
266
276
  expect(read_yaml(@pyml_name)).to eql @modded_hash
267
277
  end
@@ -271,7 +281,7 @@ shared_examples "loadsaveable" do |loadsaveable_class|
271
281
 
272
282
  context "when filetype is unsupported" do
273
283
  it "raises LoadError" do
274
- expect { loadsaveable_class.open(@phony_name) {} }.to raise_error LoadError
284
+ expect { LoadSaveableClass.open(@phony_name) {} }.to raise_error LoadError
275
285
  end
276
286
  end
277
287
 
@@ -286,25 +296,25 @@ shared_examples "loadsaveable" do |loadsaveable_class|
286
296
  #------------------------------FILETYPES------------------------------
287
297
 
288
298
  context "when file is .json" do
289
- it "loads a #{loadsaveable_class.name} from the json file with the given filename (calling #load) and returns it." do
290
- project = loadsaveable_class.open @pjson_name
291
- expect(project).to be_an_instance_of loadsaveable_class
299
+ it "loads a LoadSaveable from the json file with the given filename (calling #load) and returns it." do
300
+ project = LoadSaveableClass.open @pjson_name
301
+ expect(project).to be_an_instance_of LoadSaveableClass
292
302
  expect(project.hash).to eql @default_hash
293
303
  end
294
304
  end
295
305
 
296
306
  context "when file is .yaml" do
297
- it "loads a #{loadsaveable_class.name} from the yaml file with the given filename (calling #load) and returns it." do
298
- project = loadsaveable_class.open @pyaml_name
299
- expect(project).to be_an_instance_of loadsaveable_class
307
+ it "loads a LoadSaveable from the yaml file with the given filename (calling #load) and returns it." do
308
+ project = LoadSaveableClass.open @pyaml_name
309
+ expect(project).to be_an_instance_of LoadSaveableClass
300
310
  expect(project.hash).to eql @default_hash
301
311
  end
302
312
  end
303
313
 
304
314
  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
315
+ it "loads a LoadSaveable from the yml file with the given filename (calling #load) and returns it." do
316
+ project = LoadSaveableClass.open @pyml_name
317
+ expect(project).to be_an_instance_of LoadSaveableClass
308
318
  expect(project.hash).to eql @default_hash
309
319
  end
310
320
  end
@@ -313,8 +323,69 @@ shared_examples "loadsaveable" do |loadsaveable_class|
313
323
 
314
324
  context "when filetype is unsupported" do
315
325
  it "raises LoadError" do
316
- expect { loadsaveable_class.open @phony_name }.to raise_error LoadError
326
+ expect { LoadSaveableClass.open @phony_name }.to raise_error LoadError
327
+ end
328
+ end
329
+ end
330
+ end
331
+
332
+ # Describing LoadSaveable::get
333
+ #
334
+ # Defines a getter method for the given name
335
+ # which retrieves the value of name in the data
336
+ # hash
337
+ #
338
+ # Parameter: name - the name to define
339
+ describe '::get' do
340
+ before :all do
341
+ @hash = { name: "foo", author: "bar", value: "baz" }
342
+ end
343
+
344
+ it 'defines methods with the given names' do
345
+ LoadSaveableClass.get *@hash.each_key
346
+
347
+ @hash.each_key do |key|
348
+ expect(LoadSaveableClass.method_defined?(key)).to be true
349
+ end
350
+ end
351
+
352
+ it 'defines methods which return the values in the hash at their corresponding names' do
353
+ @instance = LoadSaveableClass.new @hash
354
+
355
+ @hash.each_pair do |key, value|
356
+ expect(@instance.send(key)).to eql value
357
+ end
358
+ end
359
+ end
360
+
361
+ # Describing LoadSaveable::attributes
362
+ #
363
+ # Returns all attributes that are
364
+ # part of the LoadSaveable implementation
365
+ #
366
+ # Return: all attributes that are
367
+ # part of the LoadSaveable
368
+ # implementation
369
+ describe '::attributes' do
370
+ context 'with attributes set' do
371
+ it 'returns all attributes that are part of the loadsaveable implementation' do
372
+ hash = @default_hash
373
+ instance = LoadSaveableClass.new hash
374
+
375
+ LoadSaveableClass.attributes.each do |attribute|
376
+ expect(instance.send(attribute)).to eql hash[attribute]
377
+ end
378
+ end
379
+ end
380
+
381
+ context 'with no attributes set' do
382
+ it 'returns an empty array' do
383
+ class LoadSaveableClass2
384
+ include Roject::LoadSaveable
385
+ def initialize(hash={}); @bar = hash; end
386
+ def hash; @bar; end
317
387
  end
388
+ expect(LoadSaveableClass2.attributes).to be_empty
318
389
  end
319
390
  end
320
391
  end
data/spec/project_spec.rb CHANGED
@@ -21,20 +21,67 @@ require_relative "spec_require"
21
21
  # Author: Anshul Kharbanda
22
22
  # Created: 7 - 8 - 2016
23
23
  describe Roject::Project do
24
- # Describing LoadSaveable include
24
+ # Do before
25
+ before :all do
26
+ Dir.chdir "exp/project"
27
+ @project = Roject::Project.load "project.yaml"
28
+ end
29
+
30
+ # Describe Roject::Project#load_recipies
25
31
  #
26
- # Implementing objects can be loaded from and saved to files in
27
- # any of the supported data storage formats.
32
+ # Loads the recipies in the file with the given filename
28
33
  #
29
- # Formats: json, yaml
34
+ # Parameter: filename - the name of the file to read
35
+ describe '#load_recipies' do
36
+ it 'reads a recipies file and evaluates it in the context of the Project' do
37
+ expect { @project.load_makers("makers.rb") }.not_to raise_error
38
+ end
39
+ end
40
+
41
+ # Describe Roject::Project#make
30
42
  #
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
43
+ # Runs the maker of the given name with the given args
34
44
  #
35
- # Author: Anshul Kharbanda
36
- # Created: 7 - 10 - 2016
37
- describe 'include LoadSaveable' do
38
- include_examples "loadsaveable", Roject::Project
45
+ # Parameter: name - the name of the maker to run
46
+ # Parameter: args - the args to pass to the file
47
+ describe '#make' do
48
+ before :all do
49
+ @path = "path/to/file"
50
+
51
+ @header = {
52
+ type: :header,
53
+ out: "include/#{@project.project_name}/#{@path}.h",
54
+ text: IO.read("output/testheader.h")
55
+ }
56
+
57
+ @source = {
58
+ type: :source,
59
+ out: "src/#{@path}.cpp",
60
+ text: IO.read("output/testsource.cpp")
61
+ }
62
+ end
63
+
64
+ # Creating filetype
65
+ context 'with a file maker name given' do
66
+ it 'creates a file of the given type with the given arguments' do
67
+ @project.make @header[:type], path: @path, header_id: @project.c_header_id(@path)
68
+ expect(File).to be_file(@header[:out])
69
+ expect(IO.read(@header[:out])).to eql @header[:text]
70
+ end
71
+ end
72
+
73
+ # Performing task
74
+ context 'with a task maker name given' do
75
+ it 'performs the task of the given name with the given arguments' do
76
+ @project.make :module, path: @path
77
+ [@header, @source].each do |file|
78
+ expect(File).to be_file(file[:out])
79
+ expect(IO.read(file[:out])).to eql file[:text]
80
+ end
81
+ end
82
+ end
83
+
84
+ # Do afterwards
85
+ after :each do FileUtils.rmtree(@project.directories) end
39
86
  end
40
87
  end
data/spec/spec_require.rb CHANGED
@@ -18,9 +18,7 @@ require "yaml"
18
18
  # Required files for spec
19
19
  require_relative "../lib/parsers"
20
20
  require_relative "../lib/project"
21
-
22
- # Spec shared examples
23
- require_relative "shared/loadsaveable_spec"
21
+ require_relative "../lib/loadsaveable"
24
22
 
25
23
  #-----------------------HASHMOD METHODS------------------------
26
24
 
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.3.0
4
+ version: 0.5.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-14 00:00:00.000000000 Z
11
+ date: 2016-07-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: general
@@ -81,14 +81,21 @@ files:
81
81
  - exp/loadsaveable/foo.json
82
82
  - exp/loadsaveable/foo.yaml
83
83
  - exp/loadsaveable/foo.yml
84
+ - exp/project/makers.rb
85
+ - exp/project/output/testheader.h
86
+ - exp/project/output/testsource.cpp
84
87
  - exp/project/project.yaml
88
+ - exp/project/templates/header.general
89
+ - exp/project/templates/source.general
90
+ - lib/helpers.rb
85
91
  - lib/loadsaveable.rb
92
+ - lib/maker.rb
86
93
  - lib/parsers.rb
87
94
  - lib/project.rb
88
95
  - lib/roject.rb
96
+ - spec/loadsaveable_spec.rb
89
97
  - spec/parsers_spec.rb
90
98
  - spec/project_spec.rb
91
- - spec/shared/loadsaveable_spec.rb
92
99
  - spec/spec_require.rb
93
100
  homepage:
94
101
  licenses: