kuniri 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +43 -0
- data/.rspec +2 -0
- data/.travis.yml +18 -0
- data/.yardopts +1 -0
- data/COPYING +661 -0
- data/Gemfile +14 -0
- data/Guardfile +8 -0
- data/README.md +102 -0
- data/Rakefile +114 -0
- data/bin/kuniri +53 -0
- data/data/attribute_lang.rb +131 -0
- data/data/class_lang.rb +77 -0
- data/data/conditional_lang.rb +71 -0
- data/data/constructor_lang.rb +34 -0
- data/data/end_block_lang.rb +30 -0
- data/data/extern_requirement_lang.rb +45 -0
- data/data/function_behavior_lang.rb +113 -0
- data/data/lang_syntax.rb +111 -0
- data/data/module_namespace_lang.rb +43 -0
- data/data/repetition_lang.rb +62 -0
- data/data/token_lang.rb +55 -0
- data/data/variable_global_lang.rb +118 -0
- data/kuniri.gemspec +24 -0
- data/lib/kuniri/core/configuration/language_available.rb +7 -0
- data/lib/kuniri/core/configuration/log_available.rb +7 -0
- data/lib/kuniri/core/configuration/monitor_available.rb +13 -0
- data/lib/kuniri/core/kuniri.rb +78 -0
- data/lib/kuniri/core/setting.rb +143 -0
- data/lib/kuniri/error/configuration_file_error.rb +12 -0
- data/lib/kuniri/error/language_error.rb +12 -0
- data/lib/kuniri/language/abstract_container/structured_and_oo/attribute.rb +73 -0
- data/lib/kuniri/language/abstract_container/structured_and_oo/class.rb +51 -0
- data/lib/kuniri/language/abstract_container/structured_and_oo/comment.rb +57 -0
- data/lib/kuniri/language/abstract_container/structured_and_oo/conditional.rb +42 -0
- data/lib/kuniri/language/abstract_container/structured_and_oo/constructor.rb +52 -0
- data/lib/kuniri/language/abstract_container/structured_and_oo/end_block.rb +27 -0
- data/lib/kuniri/language/abstract_container/structured_and_oo/extern_requirement.rb +36 -0
- data/lib/kuniri/language/abstract_container/structured_and_oo/function_behavior.rb +55 -0
- data/lib/kuniri/language/abstract_container/structured_and_oo/module_namespace.rb +36 -0
- data/lib/kuniri/language/abstract_container/structured_and_oo/repetition.rb +42 -0
- data/lib/kuniri/language/abstract_container/structured_and_oo/variable_behaviour.rb +53 -0
- data/lib/kuniri/language/abstract_container/structured_and_oo/variable_global.rb +67 -0
- data/lib/kuniri/language/container_data/structured_and_oo/attribute_data.rb +26 -0
- data/lib/kuniri/language/container_data/structured_and_oo/basic_data.rb +18 -0
- data/lib/kuniri/language/container_data/structured_and_oo/class_data.rb +77 -0
- data/lib/kuniri/language/container_data/structured_and_oo/conditional_data.rb +23 -0
- data/lib/kuniri/language/container_data/structured_and_oo/constructor_data.rb +18 -0
- data/lib/kuniri/language/container_data/structured_and_oo/extern_requirement_data.rb +26 -0
- data/lib/kuniri/language/container_data/structured_and_oo/file_element.rb +77 -0
- data/lib/kuniri/language/container_data/structured_and_oo/function_abstract.rb +52 -0
- data/lib/kuniri/language/container_data/structured_and_oo/function_data.rb +21 -0
- data/lib/kuniri/language/container_data/structured_and_oo/method_data.rb +20 -0
- data/lib/kuniri/language/container_data/structured_and_oo/module_namespace_data.rb +18 -0
- data/lib/kuniri/language/container_data/structured_and_oo/repetition_data.rb +23 -0
- data/lib/kuniri/language/container_data/structured_and_oo/variable_global_data.rb +22 -0
- data/lib/kuniri/language/language.rb +222 -0
- data/lib/kuniri/language/language_factory.rb +48 -0
- data/lib/kuniri/language/ruby/attribute_ruby.rb +134 -0
- data/lib/kuniri/language/ruby/class_ruby.rb +83 -0
- data/lib/kuniri/language/ruby/comment_ruby.rb +84 -0
- data/lib/kuniri/language/ruby/conditional_ruby.rb +77 -0
- data/lib/kuniri/language/ruby/constructor_ruby.rb +36 -0
- data/lib/kuniri/language/ruby/end_block_ruby.rb +33 -0
- data/lib/kuniri/language/ruby/extern_requirement_ruby.rb +49 -0
- data/lib/kuniri/language/ruby/function_behavior_ruby.rb +120 -0
- data/lib/kuniri/language/ruby/module_namespace_ruby.rb +47 -0
- data/lib/kuniri/language/ruby/repetition_ruby.rb +68 -0
- data/lib/kuniri/language/ruby/ruby_syntax.rb +117 -0
- data/lib/kuniri/language/ruby/token_ruby.rb +59 -0
- data/lib/kuniri/language/ruby/variable_behaviour_ruby.rb +83 -0
- data/lib/kuniri/language/ruby/variable_global_ruby.rb +123 -0
- data/lib/kuniri/parser/parser.rb +45 -0
- data/lib/kuniri/parser/parser_xml.rb +128 -0
- data/lib/kuniri/state_machine/OO_structured_fsm/attribute_state.rb +51 -0
- data/lib/kuniri/state_machine/OO_structured_fsm/class_state.rb +94 -0
- data/lib/kuniri/state_machine/OO_structured_fsm/comment_state.rb +76 -0
- data/lib/kuniri/state_machine/OO_structured_fsm/conditional_state.rb +92 -0
- data/lib/kuniri/state_machine/OO_structured_fsm/constructor_state.rb +71 -0
- data/lib/kuniri/state_machine/OO_structured_fsm/function_state.rb +82 -0
- data/lib/kuniri/state_machine/OO_structured_fsm/idle_state.rb +80 -0
- data/lib/kuniri/state_machine/OO_structured_fsm/include_state.rb +59 -0
- data/lib/kuniri/state_machine/OO_structured_fsm/method_state.rb +69 -0
- data/lib/kuniri/state_machine/OO_structured_fsm/module_state.rb +79 -0
- data/lib/kuniri/state_machine/OO_structured_fsm/oo_structured_state.rb +92 -0
- data/lib/kuniri/state_machine/OO_structured_fsm/repetition_state.rb +85 -0
- data/lib/kuniri/state_machine/OO_structured_fsm/token_state_machine.rb +8 -0
- data/lib/kuniri/state_machine/OO_structured_fsm/variable_state.rb +49 -0
- data/lib/kuniri/util/html_logger.rb +41 -0
- data/lib/kuniri/util/logger.rb +34 -0
- data/lib/kuniri/util/txt_logger.rb +29 -0
- data/lib/kuniri/version.rb +3 -0
- data/lib/kuniri.rb +5 -0
- data/other/analyseFile.asta +0 -0
- data/spec/core/kuniri_spec.rb +14 -0
- data/spec/core/setting_spec.rb +114 -0
- data/spec/language/abstract_container/attribute_spec.rb +13 -0
- data/spec/language/abstract_container/class_spec.rb +13 -0
- data/spec/language/abstract_container/comment_spec.rb +31 -0
- data/spec/language/abstract_container/conditional_spec.rb +13 -0
- data/spec/language/abstract_container/constructor_spec.rb +13 -0
- data/spec/language/abstract_container/end_block_spec.rb +14 -0
- data/spec/language/abstract_container/module_namespace_spec.rb +13 -0
- data/spec/language/abstract_container/repetition_spec.rb +13 -0
- data/spec/language/container_data/structured_and_oo/attribute_data_spec.rb +32 -0
- data/spec/language/container_data/structured_and_oo/class_data_spec.rb +121 -0
- data/spec/language/container_data/structured_and_oo/conditional_data_spec.rb +34 -0
- data/spec/language/container_data/structured_and_oo/constructor_data_spec.rb +46 -0
- data/spec/language/container_data/structured_and_oo/extern_requirement_data_spec.rb +26 -0
- data/spec/language/container_data/structured_and_oo/file_element_spec.rb +91 -0
- data/spec/language/container_data/structured_and_oo/function_data_spec.rb +22 -0
- data/spec/language/container_data/structured_and_oo/module_namespace_spec.rb +20 -0
- data/spec/language/container_data/structured_and_oo/repetition_data_spec.rb +34 -0
- data/spec/language/container_data/structured_and_oo/variable_global_data_spec.rb +39 -0
- data/spec/language/language_factory_spec.rb +64 -0
- data/spec/language/language_spec.rb +74 -0
- data/spec/language/ruby/attribute_ruby_spec.rb +126 -0
- data/spec/language/ruby/class_ruby_spec.rb +102 -0
- data/spec/language/ruby/comment_ruby_spec.rb +78 -0
- data/spec/language/ruby/conditional_ruby_spec.rb +106 -0
- data/spec/language/ruby/constructor_ruby_spec.rb +57 -0
- data/spec/language/ruby/end_block_ruby_spec.rb +62 -0
- data/spec/language/ruby/function_behavior_ruby_spec.rb +246 -0
- data/spec/language/ruby/module_namespace_ruby_spec.rb +55 -0
- data/spec/language/ruby/repetition_ruby_spec.rb +33 -0
- data/spec/language/ruby/ruby_syntax_spec.rb +482 -0
- data/spec/language/ruby/variable_ruby_spec.rb +134 -0
- data/spec/parser/parser_spec.rb +25 -0
- data/spec/samples/rubySyntaxParts/attribute/simpleAttribute.rb +15 -0
- data/spec/samples/rubySyntaxParts/class/simpleClass.rb +19 -0
- data/spec/samples/rubySyntaxParts/comment/simple_multiple_line_comment_class.rb +33 -0
- data/spec/samples/rubySyntaxParts/comment/simple_multiple_line_comment_global.rb +20 -0
- data/spec/samples/rubySyntaxParts/comment/simple_single_line_comment_class.rb +23 -0
- data/spec/samples/rubySyntaxParts/comment/simple_single_line_comment_global.rb +16 -0
- data/spec/samples/rubySyntaxParts/conditionalStatment/constructorConditional.rb +28 -0
- data/spec/samples/rubySyntaxParts/conditionalStatment/methodConditional.rb +42 -0
- data/spec/samples/rubySyntaxParts/conditionalStatment/nestedConditional.rb +0 -0
- data/spec/samples/rubySyntaxParts/conditionalStatment/simpleConditional.rb +43 -0
- data/spec/samples/rubySyntaxParts/constructor/simpleConstructor.rb +27 -0
- data/spec/samples/rubySyntaxParts/extern/multipleLineExternRequirement.rb +0 -0
- data/spec/samples/rubySyntaxParts/extern/requireRelative.rb +6 -0
- data/spec/samples/rubySyntaxParts/extern/simpleExternRequirement.rb +14 -0
- data/spec/samples/rubySyntaxParts/fullCode/simpleCodeWithConditional.rb +18 -0
- data/spec/samples/rubySyntaxParts/fullCode/simpleFullCode.rb +19 -0
- data/spec/samples/rubySyntaxParts/function/simpleFunction.rb +29 -0
- data/spec/samples/rubySyntaxParts/method/simpleMethod.rb +13 -0
- data/spec/samples/rubySyntaxParts/module/simpleModule.rb +12 -0
- data/spec/samples/rubySyntaxParts/repetition/simpleRepetition.rb +28 -0
- data/spec/samples/rubySyntaxParts/variable/simpleVariable.rb +13 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/state_machine/OO_structured_fsm/attribute_state_spec.rb +44 -0
- data/spec/state_machine/OO_structured_fsm/class_state_spec.rb +90 -0
- data/spec/state_machine/OO_structured_fsm/comment_state_spec.rb +30 -0
- data/spec/state_machine/OO_structured_fsm/conditional_state_spec.rb +83 -0
- data/spec/state_machine/OO_structured_fsm/constructor_state_spec.rb +48 -0
- data/spec/state_machine/OO_structured_fsm/function_state_spec.rb +41 -0
- data/spec/state_machine/OO_structured_fsm/idle_state_spec.rb +101 -0
- data/spec/state_machine/OO_structured_fsm/include_state_spec.rb +62 -0
- data/spec/state_machine/OO_structured_fsm/method_state_spec.rb +42 -0
- data/spec/state_machine/OO_structured_fsm/module_state_spec.rb +54 -0
- data/spec/state_machine/OO_structured_fsm/oo_structured_state_spec.rb +0 -0
- data/spec/state_machine/OO_structured_fsm/repetition_state_spec.rb +83 -0
- data/spec/state_machine/OO_structured_fsm/variable_state_spec.rb +40 -0
- data/spec/util/html_logger_spec.rb +31 -0
- data/spec/util/logger_spec.rb +20 -0
- data/spec/util/txt_logger_spec.rb +31 -0
- metadata +326 -0
data/Guardfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
# KUNIRI
|
2
|
+
|
3
|
+
![alt text](https://github.com/kuniri/kuniri/wiki/logo/256px/with_round_border.png "Kuniri")
|
4
|
+
|
5
|
+
----
|
6
|
+
|
7
|
+
[![Join the chat at https://gitter.im/rodrigosiqueira/kuniri](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/rodrigosiqueira/kuniri?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
8
|
+
|
9
|
+
[![Build Status](https://travis-ci.org/Kuniri/kuniri.svg?branch=master)](https://travis-ci.org/Kuniri/kuniri)
|
10
|
+
[![Code Climate](https://codeclimate.com/github/Kuniri/kuniri/badges/gpa.svg)](https://codeclimate.com/github/Kuniri/kuniri)
|
11
|
+
[![Stories in Ready](https://badge.waffle.io/Kuniri/kuniri.svg?label=ready&title=Ready)](http://waffle.io/Kuniri/kuniri)
|
12
|
+
[![Coverage Status](https://coveralls.io/repos/Kuniri/kuniri/badge.svg?branch=master&service=github)](https://coveralls.io/github/Kuniri/kuniri?branch=master)
|
13
|
+
[![Inline docs](http://inch-ci.org/github/Kuniri/kuniri.svg?branch=master)](http://inch-ci.org/github/Kuniri/kuniri)
|
14
|
+
[![License](https://img.shields.io/badge/license-GPLv3-green.svg)](https://github.com/Kuniri/kuniri/blob/master/COPYING)
|
15
|
+
|
16
|
+
----
|
17
|
+
# What is Kuniri?
|
18
|
+
|
19
|
+
> Briefly, the main goal of Kuniri is: parse any kind of language, and generate
|
20
|
+
a common model file with code information. We believe that Kuniri can be a base
|
21
|
+
tool for other tools, like diagram generator, traceability, code quality,
|
22
|
+
documentation, and so forth. Initially, the main objective of Kuniri was to
|
23
|
+
provide a way to dynamically generate diagrams and traceability based on code.
|
24
|
+
However, the parser proved much more useful for many other kinds of
|
25
|
+
applications; thus, the focus shifted to the parser creation.
|
26
|
+
|
27
|
+
> Kuniri will inspect the source code, and extract information to generate a
|
28
|
+
final output. This file is a XML file (and other types in the near future), and
|
29
|
+
follows a strong pattern. This feature gives flexibility to other tools read the
|
30
|
+
file and process anything they want.
|
31
|
+
|
32
|
+
> Additionally, Kuniri was designed to grow to two main directions: support for
|
33
|
+
different languages, and provide ways to select which kind of information to
|
34
|
+
extract from the code.
|
35
|
+
|
36
|
+
----
|
37
|
+
## What is the the meaning of "kuniri"?
|
38
|
+
|
39
|
+
> Kuniri is an Esperanto word, that means "go with" or "follow". This name was
|
40
|
+
chosen because of the idea to keep following your code project with diagrams,
|
41
|
+
traceability, code quality and others.
|
42
|
+
|
43
|
+
----
|
44
|
+
# Development
|
45
|
+
|
46
|
+
* System Dependencies (Kubuntu/Ubuntu)
|
47
|
+
* YARD 0.8
|
48
|
+
* RSpec 3.1.7
|
49
|
+
* Rake 10.4
|
50
|
+
* Guard-rspec 4.2
|
51
|
+
* nokogiri 1.6.6
|
52
|
+
* Ruby version: 2.1
|
53
|
+
* Run test suit
|
54
|
+
* rake or spec
|
55
|
+
* YARD documentation
|
56
|
+
* yardoc
|
57
|
+
|
58
|
+
----
|
59
|
+
# Install
|
60
|
+
|
61
|
+
First of all, you have to install all the required gems.
|
62
|
+
```
|
63
|
+
bundle install
|
64
|
+
```
|
65
|
+
|
66
|
+
Kuniri can be installed with:
|
67
|
+
```
|
68
|
+
rake install
|
69
|
+
```
|
70
|
+
|
71
|
+
After installing you can check the commands with
|
72
|
+
```
|
73
|
+
kuniri -h
|
74
|
+
```
|
75
|
+
|
76
|
+
----
|
77
|
+
# How to use
|
78
|
+
If you want to use kuniri in your project, first you have to create ".kuniri"
|
79
|
+
file. The example below show the basic syntax:
|
80
|
+
|
81
|
+
```
|
82
|
+
language:ruby
|
83
|
+
source:lib/
|
84
|
+
output:bin/
|
85
|
+
extract:uml
|
86
|
+
```
|
87
|
+
|
88
|
+
Finally, you can run Kuniri in your project and extract the information with:
|
89
|
+
|
90
|
+
```
|
91
|
+
kuniri -e [file_name_output.xml]
|
92
|
+
```
|
93
|
+
|
94
|
+
-e means "extract mode". After you entered into iterative mode you can type:
|
95
|
+
|
96
|
+
----
|
97
|
+
# Author
|
98
|
+
|
99
|
+
* Rodrigo Siqueira de Melo
|
100
|
+
* rodrigosiqueiramelo@gmail.com
|
101
|
+
* Gustavo Jaruga
|
102
|
+
* darksshades@hotmail.com
|
data/Rakefile
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
RSpec::Core::RakeTask.new('spec')
|
6
|
+
|
7
|
+
# If you want to make this the default task
|
8
|
+
task :default => :spec
|
9
|
+
|
10
|
+
namespace :parser do |args|
|
11
|
+
desc 'Creates a new parser for kuniri with parser:create'
|
12
|
+
task :create do
|
13
|
+
options = {}
|
14
|
+
OptionParser.new(args) do |opts|
|
15
|
+
opts.banner = "Usage: rake user:create [parser_name]"
|
16
|
+
end.parse!
|
17
|
+
|
18
|
+
if ARGV.length <= 1 then
|
19
|
+
puts 'Must use pass a parser name'
|
20
|
+
exit 0
|
21
|
+
end
|
22
|
+
parsername = ARGV[1]
|
23
|
+
|
24
|
+
if File.directory?("lib/kuniri/language/#{parsername.downcase}") then
|
25
|
+
puts "Error: A folder for this parser code already exists at lib/kuniri/language/#{parsername.downcase}"
|
26
|
+
exit 1
|
27
|
+
end
|
28
|
+
|
29
|
+
FileUtils.mkdir_p("lib/kuniri/language/#{parsername.downcase}")
|
30
|
+
Dir.glob( 'data/*.rb' ).select { |f| File.file?( f ) }.each do |f|
|
31
|
+
fdest = File.basename(f).gsub('lang', parsername.downcase)
|
32
|
+
dest = "lib/kuniri/language/#{parsername.downcase}/#{fdest}"
|
33
|
+
FileUtils.cp( f, dest )
|
34
|
+
p dest
|
35
|
+
end
|
36
|
+
|
37
|
+
Dir.glob( "lib/kuniri/language/#{parsername.downcase}/*.rb" ).select { |f| File.file?( f ) }.each do |f|
|
38
|
+
text = File.read(f)
|
39
|
+
formated_text = text.gsub('{LANG}', parsername.capitalize)
|
40
|
+
formated_text = formated_text.gsub('{lang}', parsername.downcase)
|
41
|
+
File.open(f, "w") { |file| file << formated_text }
|
42
|
+
end
|
43
|
+
|
44
|
+
f = 'lib/kuniri/language/language_factory.rb'
|
45
|
+
text = File.read(f)
|
46
|
+
relative = "require_relative '#{parsername.downcase}/#{parsername.downcase}_syntax'"
|
47
|
+
|
48
|
+
if text.include?(relative) then
|
49
|
+
puts "Error: the /lib/kuniri/language/language_factory.rb file already has the require for this parser"
|
50
|
+
exit 1
|
51
|
+
end
|
52
|
+
|
53
|
+
formated_text = relative + "\n" + text
|
54
|
+
|
55
|
+
condition = "pType.downcase!
|
56
|
+
|
57
|
+
if pType == '#{parsername.downcase}'
|
58
|
+
return Languages::#{parsername.capitalize}Syntax.new
|
59
|
+
end"
|
60
|
+
|
61
|
+
formated_text = formated_text.gsub("pType.downcase!\n", condition)
|
62
|
+
File.open(f, "w") { |file| file << formated_text }
|
63
|
+
|
64
|
+
exit 0
|
65
|
+
# End task parser:create
|
66
|
+
end
|
67
|
+
|
68
|
+
desc 'Removes a parser for kuniri with parser:remove'
|
69
|
+
task :remove do
|
70
|
+
options = {}
|
71
|
+
OptionParser.new(args) do |opts|
|
72
|
+
opts.banner = "Usage: rake user:remove [parser_name]"
|
73
|
+
end.parse!
|
74
|
+
|
75
|
+
if ARGV.length <= 1 then
|
76
|
+
puts 'Must use pass a parser name'
|
77
|
+
exit 0
|
78
|
+
end
|
79
|
+
parsername = ARGV[1]
|
80
|
+
|
81
|
+
input = ''
|
82
|
+
STDOUT.puts "This operation will delete all code related to the #{parsername} parser, are you sure(y/n)?"
|
83
|
+
input = STDIN.gets.chomp
|
84
|
+
exit 0 unless input.downcase == "y" or input.downcase == "yes"
|
85
|
+
|
86
|
+
if !File.directory?("lib/kuniri/language/#{parsername.downcase}") then
|
87
|
+
puts "Error: A folder for this parser code does not exists at lib/kuniri/language/#{parsername.downcase}"
|
88
|
+
exit 1
|
89
|
+
end
|
90
|
+
|
91
|
+
FileUtils.rm_rf("lib/kuniri/language/#{parsername.downcase}")
|
92
|
+
|
93
|
+
f = 'lib/kuniri/language/language_factory.rb'
|
94
|
+
text = File.read(f)
|
95
|
+
relative = "require_relative '#{parsername.downcase}/#{parsername.downcase}_syntax'\n"
|
96
|
+
|
97
|
+
if not text.include?(relative) then
|
98
|
+
puts "Warning: the /lib/kuniri/language/language_factory.rb file could not found the require for this parser"
|
99
|
+
end
|
100
|
+
|
101
|
+
formated_text = text.gsub(relative,'')
|
102
|
+
|
103
|
+
condition = "\n if pType == '#{parsername.downcase}'
|
104
|
+
return Languages::#{parsername.capitalize}Syntax.new
|
105
|
+
end"
|
106
|
+
|
107
|
+
formated_text = formated_text.gsub(condition, '')
|
108
|
+
File.open(f, "w") { |file| file << formated_text }
|
109
|
+
exit 0
|
110
|
+
|
111
|
+
# End task parser:remove
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
data/bin/kuniri
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'kuniri'
|
4
|
+
require 'optparse'
|
5
|
+
require 'kuniri/core/kuniri'
|
6
|
+
require 'kuniri/parser/parser_xml'
|
7
|
+
|
8
|
+
options = {}
|
9
|
+
|
10
|
+
OptionParser.new do |opts|
|
11
|
+
opts.banner = "Usage: example.rb [options]"
|
12
|
+
opts.version = Kuniri::VERSION
|
13
|
+
|
14
|
+
opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
|
15
|
+
options[:verbose] = v
|
16
|
+
end
|
17
|
+
|
18
|
+
opts.on("--version", "Show Kuniri version") do |v|
|
19
|
+
puts opts.ver
|
20
|
+
exit
|
21
|
+
end
|
22
|
+
|
23
|
+
opts.on("-i", "Iterative mode") do |v|
|
24
|
+
puts "Iterative mode..."
|
25
|
+
kuniri = Kuniri::Kuniri.new
|
26
|
+
kuniri.run_analysis
|
27
|
+
kuniri.start_navigation_mode
|
28
|
+
end
|
29
|
+
|
30
|
+
opts.on("-p", "Parse project") do |v|
|
31
|
+
puts "PARSER..."
|
32
|
+
end
|
33
|
+
|
34
|
+
opts.on("-e", "--export [FILENAME]", "Export XML") do |f|
|
35
|
+
puts "Exporting XML..."
|
36
|
+
if(f)
|
37
|
+
options[:filename] = f
|
38
|
+
else
|
39
|
+
options[:filename] = 'kuniri.xml'
|
40
|
+
end
|
41
|
+
|
42
|
+
kuniri = Kuniri::Kuniri.new
|
43
|
+
kuniri.run_analysis
|
44
|
+
|
45
|
+
parser = Parser::XML.new
|
46
|
+
parser.set_path(options[:filename])
|
47
|
+
parser.create_all_data kuniri.get_parser()
|
48
|
+
end
|
49
|
+
|
50
|
+
end.parse!
|
51
|
+
|
52
|
+
p options
|
53
|
+
p ARGV
|
@@ -0,0 +1,131 @@
|
|
1
|
+
require_relative '../abstract_container/structured_and_oo/attribute.rb'
|
2
|
+
require_relative '../container_data/structured_and_oo/attribute_data.rb'
|
3
|
+
require_relative '../../util/html_logger'
|
4
|
+
require_relative '../../core/setting'
|
5
|
+
|
6
|
+
module Languages
|
7
|
+
# @module {LANG} Handling {LANG} attributes
|
8
|
+
module {LANG}
|
9
|
+
|
10
|
+
# Handle {LANG} attribute
|
11
|
+
class Attribute{LANG} < Languages::Attribute
|
12
|
+
|
13
|
+
public
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@log = @settings = Kuniri::Setting.create.log
|
17
|
+
@attributeList = []
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_attribute(pLine)
|
21
|
+
result = detect_attribute(pLine)
|
22
|
+
return nil unless result
|
23
|
+
|
24
|
+
@log.write_log("Info: Prepare to get attribute.")
|
25
|
+
|
26
|
+
listOfAttributes = []
|
27
|
+
|
28
|
+
# Has comma? Split string by comma
|
29
|
+
result = remove_unnecessary_information(result)
|
30
|
+
|
31
|
+
# Separated by comma, equal or the common case
|
32
|
+
if result.scan(/,/).count >= 1
|
33
|
+
listOfAttributes = handle_multiple_declaration_with_comma(result)
|
34
|
+
@log.write_log("Debug: Declared with comma: #{listOfAttributes}")
|
35
|
+
elsif result.scan(/=/).count > 1
|
36
|
+
listOfAttributes = handle_multiple_declaration_with_equal(result)
|
37
|
+
@log.write_log("Debug: separed by comma: #{listOfAttributes}")
|
38
|
+
else
|
39
|
+
listOfAttributes = handle_line_declaration(result)
|
40
|
+
@log.write_log("Debug: One line declaration #{listOfAttributes}")
|
41
|
+
end
|
42
|
+
|
43
|
+
return listOfAttributes
|
44
|
+
end
|
45
|
+
|
46
|
+
protected
|
47
|
+
|
48
|
+
# Override
|
49
|
+
def detect_attribute(pLine)
|
50
|
+
regexExp = /^\s*(?:@|attr_(?:accessor|read|write))(.*)$/
|
51
|
+
return nil unless pLine =~ regexExp
|
52
|
+
return pLine.scan(regexExp)[0].join("")
|
53
|
+
end
|
54
|
+
|
55
|
+
# Override
|
56
|
+
def remove_unnecessary_information(pString)
|
57
|
+
return pString.gsub!(/\(.*\)/,"") if pString =~ /\(.*\)/
|
58
|
+
return pString
|
59
|
+
end
|
60
|
+
|
61
|
+
# Override
|
62
|
+
def prepare_final_string(pString)
|
63
|
+
if pString =~ /\s+|:|@|=/
|
64
|
+
return pString.gsub!(/\s+|:|@|=/,"")
|
65
|
+
end
|
66
|
+
return pString
|
67
|
+
end
|
68
|
+
|
69
|
+
# Override
|
70
|
+
def handle_multiple_declaration_with_comma(pString)
|
71
|
+
listOfAttributes = []
|
72
|
+
pString = pString.split(",")
|
73
|
+
pString.each do |variable|
|
74
|
+
return nil if variable.scan(/=/).count > 1
|
75
|
+
|
76
|
+
variable = variable.scan(/.*=/).join("") if variable =~ /.*=/
|
77
|
+
|
78
|
+
return nil if variable =~ /\./
|
79
|
+
|
80
|
+
variable = prepare_final_string(variable)
|
81
|
+
attribute = Languages::AttributeData.new(variable)
|
82
|
+
listOfAttributes.push(attribute)
|
83
|
+
end
|
84
|
+
|
85
|
+
return listOfAttributes
|
86
|
+
end
|
87
|
+
|
88
|
+
# Override
|
89
|
+
def handle_multiple_declaration_with_equal(pString)
|
90
|
+
listOfAttributes = []
|
91
|
+
pString = pString.split("=")
|
92
|
+
pString.each do |variable|
|
93
|
+
return nil if variable =~ /\./
|
94
|
+
|
95
|
+
variable = prepare_final_string(variable)
|
96
|
+
attribute = Languages::AttributeData.new(variable)
|
97
|
+
listOfAttributes.push(attribute)
|
98
|
+
end
|
99
|
+
|
100
|
+
return listOfAttributes
|
101
|
+
end
|
102
|
+
|
103
|
+
# Override
|
104
|
+
def handle_line_declaration(pString)
|
105
|
+
listOfAttributes = []
|
106
|
+
if pString =~ /=/
|
107
|
+
pString = pString.scan(/.*=/).join("")
|
108
|
+
return nil if pString =~ /\./
|
109
|
+
end
|
110
|
+
|
111
|
+
return nil if pString =~ /\./
|
112
|
+
|
113
|
+
pString = prepare_final_string(pString)
|
114
|
+
attribute = Languages::AttributeData.new(pString)
|
115
|
+
listOfAttributes.push(attribute)
|
116
|
+
|
117
|
+
return listOfAttributes
|
118
|
+
end
|
119
|
+
|
120
|
+
private
|
121
|
+
|
122
|
+
@log
|
123
|
+
@attributeList
|
124
|
+
|
125
|
+
#Class
|
126
|
+
end
|
127
|
+
|
128
|
+
# {LANG}
|
129
|
+
end
|
130
|
+
#Language
|
131
|
+
end
|
data/data/class_lang.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
require_relative '../abstract_container/structured_and_oo/class.rb'
|
2
|
+
require_relative '../container_data/structured_and_oo/class_data.rb'
|
3
|
+
require_relative '../../util/html_logger'
|
4
|
+
require_relative '../../core/setting'
|
5
|
+
|
6
|
+
module Languages
|
7
|
+
|
8
|
+
module {LANG}
|
9
|
+
|
10
|
+
class Class{LANG} < Languages::Class
|
11
|
+
|
12
|
+
public
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@log = @settings = Kuniri::Setting.create.log
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_class(pLine)
|
19
|
+
result = detect_class(pLine)
|
20
|
+
return nil unless result
|
21
|
+
|
22
|
+
@log.write_log("Info: Detect class")
|
23
|
+
|
24
|
+
classCaptured = Languages::ClassData.new
|
25
|
+
|
26
|
+
inheritance = get_inheritance(result)
|
27
|
+
classCaptured.inheritances = inheritance if inheritance
|
28
|
+
|
29
|
+
result = prepare_final_string(result)
|
30
|
+
classCaptured.name = result
|
31
|
+
|
32
|
+
@log.write_log("Debug: Class: #{classCaptured.name}")
|
33
|
+
|
34
|
+
return classCaptured
|
35
|
+
end
|
36
|
+
|
37
|
+
protected
|
38
|
+
|
39
|
+
def detect_class(pLine)
|
40
|
+
regexExpression = /^\s*class\s+(.*)/
|
41
|
+
return nil unless pLine =~ regexExpression
|
42
|
+
return pLine.scan(regexExpression)[0].join("")
|
43
|
+
end
|
44
|
+
|
45
|
+
def get_inheritance(pString)
|
46
|
+
if pString =~ /</
|
47
|
+
partial = pString.scan(/<(.*)/)
|
48
|
+
return remove_unnecessary_information(partial)
|
49
|
+
end
|
50
|
+
return nil
|
51
|
+
end
|
52
|
+
|
53
|
+
def remove_unnecessary_information(pString)
|
54
|
+
return pString.gsub(/\s|</, "") if pString =~ /\s|</
|
55
|
+
return pString
|
56
|
+
end
|
57
|
+
|
58
|
+
def prepare_final_string(pString)
|
59
|
+
if pString =~ /\s|</
|
60
|
+
partial = pString.gsub(/<.*/,"")
|
61
|
+
return remove_unnecessary_information(partial)
|
62
|
+
end
|
63
|
+
return pString
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
@log
|
69
|
+
|
70
|
+
# class
|
71
|
+
end
|
72
|
+
|
73
|
+
# {LANG}
|
74
|
+
end
|
75
|
+
|
76
|
+
# Languages
|
77
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require_relative '../abstract_container/structured_and_oo/conditional.rb'
|
2
|
+
require_relative '../container_data/structured_and_oo/conditional_data.rb'
|
3
|
+
|
4
|
+
module Languages
|
5
|
+
|
6
|
+
module {LANG}
|
7
|
+
|
8
|
+
class Conditional{LANG} < Languages::Conditional
|
9
|
+
|
10
|
+
public
|
11
|
+
|
12
|
+
def get_conditional(pLine)
|
13
|
+
result = detect_conditional(pLine)
|
14
|
+
return nil unless result
|
15
|
+
|
16
|
+
conditionalCaptured = Languages::ConditionalData.new
|
17
|
+
conditionalCaptured.type = conditional_type(pLine)
|
18
|
+
|
19
|
+
conditionalCaptured.expression = get_expression(result)
|
20
|
+
|
21
|
+
return conditionalCaptured
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
|
26
|
+
def detect_conditional(pLine)
|
27
|
+
regexExp = /^\s*if\s+(.*)/
|
28
|
+
return pLine.scan(regexExp)[0].join("") if regexExp =~ pLine
|
29
|
+
|
30
|
+
regexExp = /^\s*case\s+(.*)/
|
31
|
+
return pLine.scan(regexExp)[0].join("") if regexExp =~ pLine
|
32
|
+
|
33
|
+
regexExp = /^\s*unless\s+(.*)/
|
34
|
+
return pLine.scan(regexExp)[0].join("") if regexExp =~ pLine
|
35
|
+
|
36
|
+
regexExp = /^\s*elsif\s+(.*)/
|
37
|
+
return pLine.scan(regexExp)[0].join("") if regexExp =~ pLine
|
38
|
+
|
39
|
+
return nil
|
40
|
+
end
|
41
|
+
|
42
|
+
def conditional_type(pString)
|
43
|
+
regexExp = /^\s+if|^if/
|
44
|
+
return "IF" if regexExp =~ pString
|
45
|
+
|
46
|
+
regexExp = /^\s+case|^case/
|
47
|
+
return "CASE" if regexExp =~ pString
|
48
|
+
|
49
|
+
regexExp = /^\s+unless|^unless/
|
50
|
+
return "UNLESS" if regexExp =~ pString
|
51
|
+
|
52
|
+
regexExp = /^\s+elsif|^elsif/
|
53
|
+
return "ELSIF" if regexExp =~ pString
|
54
|
+
|
55
|
+
return nil
|
56
|
+
end
|
57
|
+
|
58
|
+
def get_expression(pString)
|
59
|
+
leftStrip = pString.lstrip
|
60
|
+
rightStrip = leftStrip.rstrip
|
61
|
+
return rightStrip
|
62
|
+
end
|
63
|
+
|
64
|
+
# Class
|
65
|
+
end
|
66
|
+
|
67
|
+
# {LANG}
|
68
|
+
end
|
69
|
+
|
70
|
+
# Module
|
71
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative '../abstract_container/structured_and_oo/constructor'
|
2
|
+
require_relative '../container_data/structured_and_oo/constructor_data'
|
3
|
+
require_relative 'function_behavior_{lang}'
|
4
|
+
|
5
|
+
module Languages
|
6
|
+
|
7
|
+
module {LANG}
|
8
|
+
|
9
|
+
# Handling {LANG} constructor
|
10
|
+
class ConstructorRuby < Languages::{LANG}::FunctionBehavior{LANG}
|
11
|
+
|
12
|
+
public
|
13
|
+
|
14
|
+
def get_constructor(pLine, type = 'public')
|
15
|
+
result = get_function(pLine)
|
16
|
+
return nil unless result
|
17
|
+
|
18
|
+
if result.name =~ /initialize/
|
19
|
+
result.type = "CONSTRUCTOR"
|
20
|
+
else
|
21
|
+
return nil
|
22
|
+
end
|
23
|
+
|
24
|
+
return result
|
25
|
+
end
|
26
|
+
|
27
|
+
# Class
|
28
|
+
end
|
29
|
+
|
30
|
+
# {LANG}
|
31
|
+
end
|
32
|
+
|
33
|
+
# Language
|
34
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative '../abstract_container/structured_and_oo/end_block'
|
2
|
+
|
3
|
+
module Languages
|
4
|
+
|
5
|
+
module {LANG}
|
6
|
+
|
7
|
+
class EndBlockRuby < Languages::EndBlock
|
8
|
+
|
9
|
+
public
|
10
|
+
|
11
|
+
def has_end_of_block?(pLine)
|
12
|
+
return detect_end(pLine)
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def detect_end(pLine)
|
18
|
+
#TODO: EXTREMELY SIMPLE HANDLING, IT HAVE TO BE IMPROVED!
|
19
|
+
return true if pLine =~ /^\s+end|^end/
|
20
|
+
return false
|
21
|
+
end
|
22
|
+
|
23
|
+
# Class
|
24
|
+
end
|
25
|
+
|
26
|
+
# {LANG}
|
27
|
+
end
|
28
|
+
|
29
|
+
# Module
|
30
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require_relative '../abstract_container/structured_and_oo/extern_requirement'
|
2
|
+
require_relative '../container_data/structured_and_oo/extern_requirement_data'
|
3
|
+
|
4
|
+
module Languages
|
5
|
+
|
6
|
+
module {LANG}
|
7
|
+
|
8
|
+
# @class ExternRequirement Handling extern requirements.
|
9
|
+
class ExternRequirement{LANG} < Languages::ExternRequirement
|
10
|
+
|
11
|
+
public
|
12
|
+
|
13
|
+
def get_requirement(pLine)
|
14
|
+
detectExpression = detect_extern_requirement(pLine)
|
15
|
+
return nil unless detectExpression
|
16
|
+
|
17
|
+
detectExpression = remove_unnecessary_information(detectExpression)
|
18
|
+
# @requirement = detectExpression
|
19
|
+
name = File.basename(detectExpression, ".*")
|
20
|
+
externReference = ExternRequirementData.new(name)
|
21
|
+
return externReference
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
|
26
|
+
def detect_extern_requirement(pLine)
|
27
|
+
regexExpression = /^\s*require(?:_relative)?\s+('|")(.*)\1/
|
28
|
+
return nil unless pLine =~ regexExpression
|
29
|
+
return pLine.scan(regexExpression).join("")
|
30
|
+
end
|
31
|
+
|
32
|
+
def remove_unnecessary_information(pLine)
|
33
|
+
regexClean = /\s+|"|'/
|
34
|
+
return pLine.gsub!(regexClean, "") if pLine =~ regexClean
|
35
|
+
return pLine
|
36
|
+
end
|
37
|
+
|
38
|
+
# Class
|
39
|
+
end
|
40
|
+
|
41
|
+
# {LANG}
|
42
|
+
end
|
43
|
+
|
44
|
+
# Module
|
45
|
+
end
|