phari_doc_gen 2.1.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/phari_doc_gen/FileHandler.rb +152 -109
  3. metadata +5 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 32a910fca9b0a5e880ad92810b525d2bbb660c68
4
- data.tar.gz: ca0cd94ddd0d1c937e0e38c7d74dd2f4b5cb0d3d
3
+ metadata.gz: 9ad8f025c300abb25064da2bf9ac3ddcabf231ed
4
+ data.tar.gz: 49927b12a5443efbb62cde2b7828493c8f7f0210
5
5
  SHA512:
6
- metadata.gz: db63b3191a9da9f8aa928ba7900cffdb2f6559a307dc7b164b0662a2dd63a9449a0ee707ee8d7d18249080b02683f6940e2900af4c79bc5122ec4aa97d0dcc7a
7
- data.tar.gz: 89a6db34e44842535846b0e030e3efb225589eae398e5165d467437e1ea79fae892fac9c5f67711e6b6c72541886acd38ae3762a0b8a7a9d43b6a47d12282ae3
6
+ metadata.gz: b09c3af0a867d263c21fe8d1ff4f3f3991046773ce043a848c7f95386cd858f3da5d1d0b59444ef8f3e877191b79ea9549918ed6b3e285ee63851550f47a14b7
7
+ data.tar.gz: 37f6ac303ca59dc6cf544c5fe9d5b3367b3a6316c9105d59da118286b1f47f80eedb73ee7055dd9020af9f7f5b2675d28e865c953ea77159f7dfbc463a95716b
@@ -6,6 +6,7 @@
6
6
  #--------------------------------------------------------------------------------------------
7
7
 
8
8
  require 'fileutils'
9
+ require 'active_support/inflector'
9
10
  require_relative 'Modelo.rb'
10
11
  require_relative 'Rota.rb'
11
12
  require_relative 'Metodo.rb'
@@ -55,29 +56,44 @@ class FileHandler
55
56
  Dir.glob(path + 'api/models/*.rb') do |file|
56
57
  filename = file.to_s
57
58
  inputFile = File.new(filename)
59
+ modelFile = File.new(filename, 'r')
58
60
  modelname = File.basename(inputFile, '.rb')
59
- modelPath = path + 'api/models/' + modelname + '.rb'
60
61
  helpername = path + 'api/app/helpers/' + modelname + '_helper.rb'
61
62
  controllername = path + 'api/app/controllers/' + modelname + '.rb'
62
- if File.exist?(helpername) && File.exist?(controllername)
63
- # Call the necessary methods for each helper, model and controller
64
- modelFile = File.new(modelPath, 'r')
63
+ modelname = nameFormat(modelname)
64
+ # Call the necessary methods for each helper, model and controller
65
+ relations = readRelations(modelFile, modelname, filename)
66
+ modelFile.close
67
+ if File.exist?(helpername)
65
68
  modelHelper = File.new(helpername, 'r')
66
- modelController = File.new(controllername, 'r')
67
- relations = readRelations(modelFile, modelname, modelPath)
68
69
  methods = readMethods(modelHelper, helpername)
69
- routes = readRoutes(modelController, controllername)
70
- currentModel = Modelo.new(modelname, methods, routes, relations)
71
- models << currentModel
72
- modelFile.close
73
70
  modelHelper.close
71
+ end
72
+ if File.exist?(controllername)
73
+ modelController = File.new(controllername, 'r')
74
+ routes = readRoutes(modelController, controllername)
74
75
  modelController.close
75
76
  end
77
+ currentModel = Modelo.new(modelname, methods, routes, relations)
78
+ models << currentModel
79
+ methods = nil
80
+ routes = nil
81
+ relations = nil
76
82
  end
77
83
  # Return models
78
84
  models
79
85
  end
80
86
 
87
+ def nameFormat(name)
88
+ name = name.capitalize
89
+ if name.include?("_")
90
+ prefix = name.slice(0, name.index("_"))
91
+ sulfix = name.slice(name.index("_")+1, name.length - name.index("_"))
92
+ name = "#{prefix.capitalize} #{sulfix.capitalize}"
93
+ end
94
+ name
95
+ end
96
+
81
97
  # Auxiliary methods of reading
82
98
 
83
99
  # Generate project descriprion based on 'README.md'
@@ -166,31 +182,37 @@ class FileHandler
166
182
  def readRelations(modelFile, modelname, modelPath)
167
183
  lineIndex = 0
168
184
  relations = []
169
- arr = IO.readlines(modelFile)
170
- # Read each line from model
171
- arr.each do |line|
172
- # Verify presence of any clause
173
- if hasKeyword?(line, lineIndex, modelname)
174
- # If it does, identify which clause it is
175
- arg = decodeArgument(line)
176
- keyword = arg[0]
177
- argument = arg[1]
178
- # Execute clause
179
- case keyword
180
- when 'belongs_to'
181
- relation = modelname.capitalize + ' belongs to ' + argument
182
- relations << relation
183
- when 'has_one'
184
- relation = modelname.capitalize + ' has one ' + argument
185
- relations << relation
186
- when 'has_many'
187
- relation = modelname.capitalize + ' has many ' + argument
188
- relations << relation
189
- when 'has_and_belongs_to_many'
190
- relation = modelname.capitalize + ' has and belongs to many ' + argument
191
- relations << relation
185
+ begin
186
+ arr = IO.readlines(modelFile)
187
+ # Read each line from model
188
+ arr.each do |line|
189
+ lineIndex += 1
190
+ # Verify presence of any clause
191
+ if hasKeyword?(line, lineIndex, modelname)
192
+ # If it does, identify which clause it is
193
+ arg = decodeArgument(line)
194
+ keyword = arg[0]
195
+ argument = arg[1]
196
+ # Execute clause
197
+ case keyword
198
+ when 'belongs_to'
199
+ relation = modelname + ' belongs to ' + argument
200
+ relations << relation
201
+ when 'has_one'
202
+ relation = modelname + ' has one ' + argument
203
+ relations << relation
204
+ when 'has_many'
205
+ relation = modelname + ' has many ' + argument.pluralize
206
+ relations << relation
207
+ when 'has_and_belongs_to_many'
208
+ relation = modelname + ' has and belongs to many ' + argument.pluralize
209
+ relations << relation
210
+ end
192
211
  end
193
212
  end
213
+ rescue ArgumentError => e
214
+ # If a syntax error is found, it raises an Argument Error informing the file and line
215
+ puts "Warning: #{modelPath}:#{lineIndex} " + e.message
194
216
  end
195
217
  relations
196
218
  end
@@ -249,9 +271,8 @@ class FileHandler
249
271
  descricao = decodeDescription(line) if hasDescription?(line, lineIndex, helpername)
250
272
  end
251
273
  rescue ArgumentError => e
252
- # If a syntax error is found, it rais an Argument Error informing the file and line
253
- puts "ERROR: #{helpername}:#{lineIndex}: in #{nome}"
254
- puts e.message
274
+ # If a syntax error is found, it raises an Argument Error informing the file and line
275
+ puts "Warning: #{helpername}:#{lineIndex}: in #{nome} " + e.message
255
276
  end
256
277
  methods << Metodo.new(nome, tipo, inputs, outputs, descricao)
257
278
  # Return a methods array
@@ -345,9 +366,8 @@ class FileHandler
345
366
  end
346
367
  end
347
368
  rescue ArgumentError => e
348
- # If a syntax error is found, it raise an Argument Error informing the file and line
349
- puts "ERROR: #{controllername}:#{lineIndex}: in #{nome}"
350
- puts e.message
369
+ # If a syntax error is found, it raises an Argument Error informing the file and line
370
+ puts "Warning: #{controllername}:#{lineIndex}: in #{nome} " + e.message
351
371
  end
352
372
  routes << Rota.new(nome, tipo, requisicao, dataInput, inputs, outputs)
353
373
  # Return a routes array
@@ -408,23 +428,30 @@ class FileHandler
408
428
  def decodeArgument(line)
409
429
  args = []
410
430
  initialIndex = line.index('@') + 1
431
+ sentence = line.slice(initialIndex, line.length - initialIndex)
432
+ # Raises an Argument Error if some error is found
433
+ raise ArgumentError.new("Sytanx error: expected 2 arguments (none given)") unless hasSomething?(sentence)
434
+ raise ArgumentError.new("Sytanx error: expected 2 arguments (one given)") unless sentence.include?("\s")
411
435
  finalIndex = line.index("\s", line.index('@'))
412
- if finalIndex == nil || initialIndex == nil
413
- if line.index('@')+1 == /^[[:alpha:]]$/
414
- # Raises an Argument Error if some error is found
415
- raise ArgumentError.new("Sytanx error: expected 2 arguments (one given)")
416
- else raise ArgumentError.new("Sytanx error: expected 2 arguments (none given)")
417
- end
418
- end
419
436
  lenght = finalIndex - initialIndex
420
437
  keyword = line.slice(initialIndex, lenght)
421
438
  argument = line.slice(finalIndex + 1, line.size - finalIndex)
439
+ raise ArgumentError.new("Sytanx error: expected 2 arguments (one given)") unless hasSomething?(argument)
422
440
  args << keyword
423
441
  args << argument
424
442
  # Return array with clause and arguments
425
443
  args
426
444
  end
427
445
 
446
+ def hasSomething?(line)
447
+ for i in 0..line.length-1
448
+ if line[i].match(/^[[:alpha:]]$/)
449
+ return true
450
+ end
451
+ end
452
+ false
453
+ end
454
+
428
455
  # If the clause is a param or return value, decode the name and datatype
429
456
  def dataValue(argument)
430
457
  if argument.include? "\s"
@@ -576,11 +603,13 @@ class FileHandler
576
603
  <div class='row'>
577
604
  <div class='col-md-4'>
578
605
  <ul class='list-group'>")
579
- models.each do |model|
580
- link = model.name.downcase
581
- name = model.name.capitalize
582
- file.write("\t\t<a href='models/#{link}.html' class='list-indexes list-group-item'>#{name}</a>
583
- ")
606
+ unless models.nil?
607
+ models.each do |model|
608
+ link = model.name.downcase
609
+ name = model.name
610
+ file.write("\t\t<a href='models/#{link}.html' class='list-indexes list-group-item'>#{name}</a>
611
+ ")
612
+ end
584
613
  end
585
614
  file.write("\t</ul>
586
615
  </div>
@@ -594,8 +623,10 @@ class FileHandler
594
623
 
595
624
  # Write a model HTML page content
596
625
  def writeModelPage(file, model, project)
597
- name = model.name.capitalize
626
+ name = model.name
598
627
  relations = model.relations
628
+ methods = model.methods
629
+ routes = model.routes
599
630
  file.write("<div class='container panel panel-default'>
600
631
  <div class='row'>
601
632
  <div class='panel panel-default'>
@@ -605,8 +636,10 @@ class FileHandler
605
636
  <div class='panel-body'>
606
637
  <h2>#{name} Model</h2>
607
638
  <h4>")
608
- relations.each do |relation|
609
- file.write('<br>'+relation)
639
+ unless relations.nil?
640
+ relations.each do |relation|
641
+ file.write('<br>'+relation)
642
+ end
610
643
  end
611
644
  file.write("</h4>
612
645
  </div>
@@ -620,35 +653,40 @@ class FileHandler
620
653
  </div>
621
654
  </div>
622
655
  <ul class='list-group'>")
623
- methods = model.methods
624
- methods.each do |method|
625
- type = method.type
626
- name = method.name
627
- inputs = method.inputs
628
- outputs = method.outputs
629
- description = method.description
630
- file.write(" <div class='list-group-item'>
631
- <h4 class='list-group-item-heading'>CRUD: #{type}<br>Name: #{name}</h4>
632
- <p><br>Inputs:<br>
633
- <ul>")
634
- inputs.each do |input|
635
- type = input.type
636
- name = input.name
637
- file.write("<li>#{type}: #{name}</li>")
638
- end
639
- file.write("</ul><br>Outputs:<br>
656
+ unless methods.nil?
657
+ methods.each do |method|
658
+ type = method.type
659
+ name = method.name
660
+ inputs = method.inputs
661
+ outputs = method.outputs
662
+ description = method.description
663
+ file.write(" <div class='list-group-item'>
664
+ <h4 class='list-group-item-heading'>CRUD: #{type}<br>Name: #{name}</h4>
665
+ <p><br>Inputs:<br>
640
666
  <ul>")
641
- outputs.each do |output|
642
- if output != 'nil'
643
- type = output.type
644
- name = output.name
645
- file.write("<li>#{type}: #{name}</li>")
646
- else
647
- file.write('<li>Null</li>')
667
+ unless inputs.nil?
668
+ inputs.each do |input|
669
+ type = input.type
670
+ name = input.name
671
+ file.write("<li>#{type}: #{name}</li>")
672
+ end
648
673
  end
674
+ file.write("</ul><br>Outputs:<br>
675
+ <ul>")
676
+ unless outputs.nil?
677
+ outputs.each do |output|
678
+ if output != 'nil'
679
+ type = output.type
680
+ name = output.name
681
+ file.write("<li>#{type}: #{name}</li>")
682
+ else
683
+ file.write('<li>Null</li>')
684
+ end
685
+ end
686
+ end
687
+ file.write("</ul><br>Description: #{description}</p>
688
+ </div>")
649
689
  end
650
- file.write("</ul><br>Description: #{description}</p>
651
- </div>")
652
690
  end
653
691
  file.write("</ul>
654
692
  </div>
@@ -659,38 +697,43 @@ class FileHandler
659
697
  </div>
660
698
  </div>
661
699
  <ul class='list-group'>")
662
- routes = model.routes
663
- routes.each do |route|
664
- type = route.type
665
- name = route.name
666
- request = route.request
667
- dataInput = route.dataInput
668
- inputs = route.inputs
669
- outputs = route.outputs
670
- file.write(" <div class='list-group-item'>
671
- <h4 class='list-group-item-heading'>CRUD: #{type}<br>Name: #{name}</h4>
672
- <p><br>Request: #{request}<br>
673
- <br>Notation type: #{dataInput}<br>
674
- <br>Inputs:<br>
675
- <ul>")
676
- inputs.each do |input|
677
- type = input.type
678
- name = input.name
679
- file.write("<li>#{type}: #{name}</li>")
680
- end
681
- file.write("</ul><br>Outputs:<br>
700
+ unless routes.nil?
701
+ routes.each do |route|
702
+ type = route.type
703
+ name = route.name
704
+ request = route.request
705
+ dataInput = route.dataInput
706
+ inputs = route.inputs
707
+ outputs = route.outputs
708
+ file.write(" <div class='list-group-item'>
709
+ <h4 class='list-group-item-heading'>CRUD: #{type}<br>Name: #{name}</h4>
710
+ <p><br>Request: #{request}<br>
711
+ <br>Notation type: #{dataInput}<br>
712
+ <br>Inputs:<br>
682
713
  <ul>")
683
- outputs.each do |output|
684
- if output != 'nil'
685
- type = output.type
686
- name = output.name
687
- file.write("<li>#{type}: #{name}</li>")
688
- else
689
- file.write('<li>Null</li>')
714
+ unless inputs.nil?
715
+ inputs.each do |input|
716
+ type = input.type
717
+ name = input.name
718
+ file.write("<li>#{type}: #{name}</li>")
719
+ end
720
+ end
721
+ file.write("</ul><br>Outputs:<br>
722
+ <ul>")
723
+ unless outputs.nil?
724
+ outputs.each do |output|
725
+ if output != 'nil'
726
+ type = output.type
727
+ name = output.name
728
+ file.write("<li>#{type}: #{name}</li>")
729
+ else
730
+ file.write('<li>Null</li>')
731
+ end
732
+ end
690
733
  end
734
+ file.write("</ul></p>
735
+ </div>")
691
736
  end
692
- file.write("</ul></p>
693
- </div>")
694
737
  end
695
738
  file.write("</ul>
696
739
  </div>
metadata CHANGED
@@ -1,32 +1,23 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phari_doc_gen
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Phari Solutions
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-01 00:00:00.000000000 Z
11
+ date: 2017-06-09 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |2-
14
14
  Hi there buddy! I've heard you've been looking for a simple
15
15
  and functional documentation generator for this Ruby web app
16
- of yours. So here goes a brief tutorial on how to use this
17
- little gem developed by Phari Solutions. First things first.
18
- To use this gem, you will need to be following the sinatra/padrino
19
- patterns. If you're using these frameworks probably you already
20
- matched the requisites, otherwise, organize your folders properly.
21
- Your project tree has to be organized in a main directory called
22
- 'api' that must contain another folder 'app' with three other
23
- directories 'models', 'helpers' and 'controllers' within. The files will
24
- also have to be especifically named. But we'll look further into it
25
- later. Now, requisites aside, Phari Doc Generator will provide you
26
- an easy way to generate documentation for your projects. The result
16
+ of yours. Phari Doc Generator will provide you an easy way
17
+ to generate documentation for your projects. The result
27
18
  will be a project page with a description that can be written using a simplified
28
19
  markdown syntax that is going to be explained ahead. Also, each ruby
29
- Class will have it's own page especifying it's helper methods and controller
20
+ Class will have it's own page especifying it's relatios helper methods and controller
30
21
  routes including their inputs, outputs and descriptions. The gem includes
31
22
  an executable file and the classes that can be used individually,
32
23
  providing the possibility to use the generator for any project