featuremap 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/bin/featuremap +1 -1
- data/features/give_feedback.feature +1 -1
- data/features/step_definitions/common_steps.rb +1 -1
- data/lib/featuremap.rb +93 -111
- data/lib/mindmap.rb +51 -49
- data/lib/version.rb +1 -1
- metadata +22 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1ab3ac84cd60d91bf241cd06522c32ec7d934d665600ee3dcb6784cfcd971fc7
|
4
|
+
data.tar.gz: af5666ed23c58b5710beb9e734afa07a10113d724e164dc44987befda31431eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ce368221cf8218c46c635d51dd3e13a934f02527a40c8e67e450c65ac0cf1c18495ae6efeca6691b111a1458b378e0839d1ea509781d78f4135b6dcd2eabc6f
|
7
|
+
data.tar.gz: b261f82c0494592aa193ed736d351151556ec67293ae60715daa7cab3d1215097c64c7f5fc7fa7945134a1947939b46c17ad048369bfedc8b0f323ed30c8975b
|
data/bin/featuremap
CHANGED
@@ -28,7 +28,7 @@ else
|
|
28
28
|
else
|
29
29
|
output_file = "STDOUT"
|
30
30
|
end
|
31
|
-
featuremap = Featuremap.new(feature_dir, output_file, options[:verbose])
|
31
|
+
featuremap = Featuremap::Featuremap.new(feature_dir, output_file, options[:verbose])
|
32
32
|
if featuremap.exit_status == 0
|
33
33
|
featuremap.create_featuremap()
|
34
34
|
end
|
@@ -17,7 +17,7 @@ Ability: give feedback
|
|
17
17
|
And the user rights for the feature dir don't allow access
|
18
18
|
When the user runs featuremap
|
19
19
|
Then featuremap exits with 66
|
20
|
-
And featuremap shows the message "can't access >>secret_features
|
20
|
+
And featuremap shows the message "can't access >>secret_features<< as feature dir"
|
21
21
|
|
22
22
|
|
23
23
|
# rule: show an error message if the featuremap can't write the mindmap
|
@@ -23,7 +23,7 @@ end
|
|
23
23
|
When("the mapper is called") do
|
24
24
|
create_path(@path_to_results)
|
25
25
|
@featuremap_file = "#{@path_to_results}/featuremap.mm"
|
26
|
-
@mapper = Featuremap.new("#{@path_to_testdata}/#{@feature_dir}", @featuremap_file)
|
26
|
+
@mapper = Featuremap::Featuremap.new("#{@path_to_testdata}/#{@feature_dir}", @featuremap_file)
|
27
27
|
@mapper.create_featuremap()
|
28
28
|
end
|
29
29
|
|
data/lib/featuremap.rb
CHANGED
@@ -1,137 +1,119 @@
|
|
1
1
|
# use securerandom to create unique id's
|
2
2
|
require 'securerandom'
|
3
3
|
require 'logger'
|
4
|
+
require 'cuke_modeler'
|
4
5
|
require_relative 'mindmap'
|
5
6
|
|
7
|
+
module Featuremap
|
6
8
|
|
7
|
-
class Featuremap
|
9
|
+
class Featuremap
|
8
10
|
|
9
|
-
|
11
|
+
attr_reader :nodes, :exit_status, :mindmap_path, :features_path
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
17
|
-
@log.formatter = proc do |severity, datetime, progname, msg|
|
18
|
-
date_format = datetime.strftime("%Y-%m-%d %H:%M:%S")
|
19
|
-
"[#{date_format}] #{severity.ljust(5,' ')}: #{msg}\n"
|
20
|
-
end
|
21
|
-
@log.datetime_format = "%H:%M:%S"
|
22
|
-
if ENV['LOG_LEVEL'] == 'debug'
|
23
|
-
@log.level = Logger::DEBUG
|
24
|
-
elsif ENV['LOG_LEVEL'] == 'info'
|
25
|
-
@log.level = Logger::INFO
|
26
|
-
elsif ENV['LOG_LEVEL'] == 'warn'
|
27
|
-
@log.level = Logger::WARN
|
28
|
-
else
|
29
|
-
# default log level
|
30
|
-
@log.level = Logger::ERROR
|
31
|
-
end
|
32
|
-
if p_verbose && @log.level != Logger::DEBUG && p_mindmap_path != "STDOUT"
|
33
|
-
@log.level = Logger::INFO
|
34
|
-
@log.info "set log level to verbose"
|
35
|
-
end
|
36
|
-
@exit_status = 0
|
37
|
-
@mindmap_path = p_mindmap_path
|
38
|
-
if Dir.exists?(p_features_path)
|
39
|
-
@features_path = p_features_path
|
40
|
-
@log.info("create a new featuremap")
|
41
|
-
@mindmap = Mindmap.new(@log)
|
42
|
-
else
|
43
|
-
@exit_status = 66 # see https://www.freebsd.org/cgi/man.cgi?query=sysexits&sektion=3 for more info
|
44
|
-
@log.error("can't find >>#{p_features_path}<< as feature dir")
|
45
|
-
return
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
# class entry point - create a mindmap for a given path
|
50
|
-
def create_featuremap()
|
51
|
-
mindmap_path = @mindmap_path
|
52
|
-
if mindmap_path != "STDOUT"
|
53
|
-
while File.exists?(mindmap_path)
|
54
|
-
filename_parts = mindmap_path.split(".")
|
55
|
-
if filename_parts[0] =~ /-\d+$/
|
56
|
-
filename_parts = filename_parts[0].split("-")
|
57
|
-
mindmap_path = "#{filename_parts[0]}-#{filename_parts[1].to_i + 1}.mm"
|
58
|
-
else
|
59
|
-
mindmap_path = "#{filename_parts[0]}-1.mm"
|
60
|
-
end
|
13
|
+
def initialize(p_features_path, p_mindmap_path, p_verbose = false)
|
14
|
+
if p_mindmap_path == "STDOUT"
|
15
|
+
@log = Logger.new(STDERR)
|
16
|
+
else
|
17
|
+
@log = Logger.new(STDOUT)
|
61
18
|
end
|
62
|
-
|
63
|
-
|
19
|
+
@log.formatter = proc do |severity, datetime, progname, msg|
|
20
|
+
date_format = datetime.strftime("%Y-%m-%d %H:%M:%S")
|
21
|
+
"[#{date_format}] #{severity.ljust(5,' ')}: #{msg}\n"
|
64
22
|
end
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
@
|
70
|
-
|
23
|
+
@log.datetime_format = "%H:%M:%S"
|
24
|
+
if ENV['LOG_LEVEL'] == 'debug'
|
25
|
+
@log.level = Logger::DEBUG
|
26
|
+
elsif ENV['LOG_LEVEL'] == 'info'
|
27
|
+
@log.level = Logger::INFO
|
28
|
+
elsif ENV['LOG_LEVEL'] == 'warn'
|
29
|
+
@log.level = Logger::WARN
|
30
|
+
else
|
31
|
+
# default log level
|
32
|
+
@log.level = Logger::ERROR
|
71
33
|
end
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
34
|
+
if p_verbose && @log.level != Logger::DEBUG && p_mindmap_path != "STDOUT"
|
35
|
+
@log.level = Logger::INFO
|
36
|
+
@log.info "set log level to verbose"
|
37
|
+
end
|
38
|
+
@exit_status = 0
|
39
|
+
@mindmap_path = p_mindmap_path
|
40
|
+
if Dir.exists?(p_features_path)
|
41
|
+
@features_path = p_features_path
|
42
|
+
@log.info("create a new featuremap")
|
43
|
+
@mindmap = Mindmap.new(@log)
|
79
44
|
else
|
80
|
-
|
45
|
+
@exit_status = 66 # see https://www.freebsd.org/cgi/man.cgi?query=sysexits&sektion=3 for more info
|
46
|
+
@log.error("can't find >>#{p_features_path}<< as feature dir")
|
47
|
+
return
|
81
48
|
end
|
82
49
|
end
|
83
|
-
end
|
84
50
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
51
|
+
# class entry point - create a mindmap for a given path
|
52
|
+
def create_featuremap()
|
53
|
+
mindmap_path = @mindmap_path
|
54
|
+
if mindmap_path != "STDOUT"
|
55
|
+
while File.exists?(mindmap_path)
|
56
|
+
filename_parts = mindmap_path.split(".")
|
57
|
+
if filename_parts[0] =~ /-\d+$/
|
58
|
+
filename_parts = filename_parts[0].split("-")
|
59
|
+
mindmap_path = "#{filename_parts[0]}-#{filename_parts[1].to_i + 1}.mm"
|
60
|
+
else
|
61
|
+
mindmap_path = "#{filename_parts[0]}-1.mm"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
if mindmap_path != @mindmap_path
|
65
|
+
@log.warn("given mindmap name is already in use, created #{mindmap_path}")
|
95
66
|
end
|
96
|
-
|
97
|
-
|
67
|
+
begin
|
68
|
+
IO.write("#{mindmap_path}","")
|
69
|
+
rescue Exception
|
70
|
+
@log.error("can't write to #{mindmap_path}")
|
71
|
+
@exit_status = 74
|
72
|
+
return
|
73
|
+
end
|
74
|
+
end
|
75
|
+
begin
|
76
|
+
directory_model = CukeModeler::Directory.new(@features_path)
|
77
|
+
@log.info "start reading features from dir #{@features_path}"
|
78
|
+
read_features(directory_model)
|
79
|
+
rescue Exception => e
|
98
80
|
@log.error("can't access >>#{features_path}<< as feature dir")
|
81
|
+
@log.debug(e.message)
|
99
82
|
@exit_status = 66
|
100
83
|
return
|
101
84
|
end
|
102
|
-
@
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
# look for subdirs
|
124
|
-
if File.directory?("#{features_path}#{feature_file}")
|
125
|
-
# ignore step_definitions and support folders because those are used for code
|
126
|
-
if feature_file != "step_definitions" && feature_file != "support"
|
127
|
-
subdir_node = @mindmap.add_node(feature_file, "subdir", p_parent_node)
|
128
|
-
read_features("#{features_path}#{feature_file}", subdir_node)
|
129
|
-
end
|
85
|
+
if @exit_status == 0
|
86
|
+
if mindmap_path != "STDOUT"
|
87
|
+
mindmap_file = File.open(mindmap_path,"w")
|
88
|
+
mindmap_file.write(@mindmap.to_s)
|
89
|
+
mindmap_file.close
|
90
|
+
else
|
91
|
+
puts @mindmap.to_s
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
#TODO work in progress: use cuke modeler
|
97
|
+
def read_features(p_cm_directory, p_parent_node = nil)
|
98
|
+
feature_node = nil
|
99
|
+
p_cm_directory.feature_files.each do |feature_file|
|
100
|
+
feature_node = @mindmap.add_node(feature_file.feature.name, "feature", p_parent_node)
|
101
|
+
feature_file.feature.tests.each do |scenario|
|
102
|
+
if scenario.keyword == "Scenario"
|
103
|
+
@mindmap.add_node(scenario.name, "scenario", feature_node)
|
104
|
+
elsif scenario.keyword == "Scenario Outline"
|
105
|
+
@mindmap.add_node(scenario.name, "scenario_outline", feature_node)
|
130
106
|
end
|
131
107
|
end
|
132
108
|
end
|
133
|
-
|
109
|
+
p_cm_directory.directories.each do |sub_dir|
|
110
|
+
if sub_dir.name != "step_definitions" and sub_dir.name != "support"
|
111
|
+
subdir_node = @mindmap.add_node(sub_dir.name, "subdir", p_parent_node)
|
112
|
+
@log.info("add features from #{sub_dir.path}")
|
113
|
+
read_features(sub_dir, subdir_node)
|
114
|
+
end
|
115
|
+
end
|
134
116
|
end
|
135
|
-
end
|
136
117
|
|
118
|
+
end
|
137
119
|
end
|
data/lib/mindmap.rb
CHANGED
@@ -1,59 +1,61 @@
|
|
1
|
-
|
1
|
+
module Featuremap
|
2
|
+
class Mindmap
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
# convert mindmap object to string
|
11
|
-
def to_s
|
12
|
-
map = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
13
|
-
map << "<map version=\"1.0.1\">\n"
|
14
|
-
map << "<!-- To view this file, download free mind mapping software FreeMind from http://freemind.sourceforge.net -->\n"
|
15
|
-
map << nodes_to_s(@nodes)
|
16
|
-
map << "</map>\n"
|
17
|
-
end
|
4
|
+
def initialize(p_logger)
|
5
|
+
@log = p_logger
|
6
|
+
@nodes = []
|
7
|
+
root_node = create_node("featuremap","root")
|
8
|
+
@nodes.insert(0, root_node)
|
9
|
+
end
|
18
10
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
11
|
+
# convert mindmap object to string
|
12
|
+
def to_s
|
13
|
+
map = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
14
|
+
map << "<map version=\"1.0.1\">\n"
|
15
|
+
map << "<!-- To view this file, download free mind mapping software FreeMind from http://freemind.sourceforge.net -->\n"
|
16
|
+
map << nodes_to_s(@nodes)
|
17
|
+
map << "</map>\n"
|
18
|
+
end
|
23
19
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
# add new node on top level per default
|
28
|
-
if p_parent_node.nil?
|
29
|
-
p_parent_node = @nodes[0]
|
20
|
+
# create a new node
|
21
|
+
def create_node(p_node_text, p_node_type)
|
22
|
+
node = {"created" => Time.now.to_i, "id" => SecureRandom.uuid.gsub(/-/,''), "modified" => Time.now.to_i, "text" => p_node_text, "type" => p_node_type, "nodes" => []}
|
30
23
|
end
|
31
|
-
p_parent_node["nodes"].insert(0, new_node)
|
32
|
-
return new_node
|
33
|
-
end
|
34
24
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
# add icons and fonts to nodes
|
42
|
-
case node["type"]
|
43
|
-
when "feature"
|
44
|
-
nodes_text << "<font BOLD=\"true\" NAME=\"SansSerif\" SIZE=\"12\"/>"
|
45
|
-
when "subdir"
|
46
|
-
nodes_text << "<icon BUILTIN=\"folder\"/>\n"
|
47
|
-
when "scenario_outline"
|
48
|
-
nodes_text << "<icon BUILTIN=\"list\"/>\n"
|
25
|
+
# add a new node
|
26
|
+
def add_node(p_node_text, p_node_type, p_parent_node = nil)
|
27
|
+
new_node = create_node(p_node_text, p_node_type)
|
28
|
+
# add new node on top level per default
|
29
|
+
if p_parent_node.nil?
|
30
|
+
p_parent_node = @nodes[0]
|
49
31
|
end
|
50
|
-
|
51
|
-
|
52
|
-
|
32
|
+
p_parent_node["nodes"].insert(0, new_node)
|
33
|
+
return new_node
|
34
|
+
end
|
35
|
+
|
36
|
+
# turn hash of nodes into mindmap xml string
|
37
|
+
def nodes_to_s(p_nodes, p_nodes_text="")
|
38
|
+
nodes_text = p_nodes_text
|
39
|
+
#@log.debug nodes_text
|
40
|
+
p_nodes.each do |node|
|
41
|
+
nodes_text << "<node CREATED=\"#{node["created"]}\" ID=\"#{node["type"]}_#{node["id"]}\" MODIFIED=\"#{node["modified"]}\" TEXT=\"#{node["text"]}\">\n"
|
42
|
+
# add icons and fonts to nodes
|
43
|
+
case node["type"]
|
44
|
+
when "feature"
|
45
|
+
nodes_text << "<font BOLD=\"true\" NAME=\"SansSerif\" SIZE=\"12\"/>"
|
46
|
+
when "subdir"
|
47
|
+
nodes_text << "<icon BUILTIN=\"folder\"/>\n"
|
48
|
+
when "scenario_outline"
|
49
|
+
nodes_text << "<icon BUILTIN=\"list\"/>\n"
|
50
|
+
end
|
51
|
+
# call function recursively for sublevel nodes
|
52
|
+
if not node["nodes"].empty?
|
53
|
+
nodes_to_s(node["nodes"], nodes_text)
|
54
|
+
end
|
55
|
+
nodes_text << "</node>\n"
|
53
56
|
end
|
54
|
-
nodes_text
|
57
|
+
return nodes_text
|
55
58
|
end
|
56
|
-
return nodes_text
|
57
|
-
end
|
58
59
|
|
60
|
+
end
|
59
61
|
end
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,18 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: featuremap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthias Carell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
12
|
-
dependencies:
|
11
|
+
date: 2019-07-22 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: cuke_modeler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
description: |-
|
14
28
|
Featurmaps helps you to visualize the functionality of your \
|
15
|
-
application by
|
29
|
+
application by turning your Gherkin features into a mindmap
|
16
30
|
email:
|
17
31
|
- rumpelcenter-featuremap at yahoo.com
|
18
32
|
executables:
|
@@ -37,7 +51,8 @@ files:
|
|
37
51
|
- lib/mindmap.rb
|
38
52
|
- lib/version.rb
|
39
53
|
homepage: https://github.com/mckryton/featuremap
|
40
|
-
licenses:
|
54
|
+
licenses:
|
55
|
+
- MIT
|
41
56
|
metadata: {}
|
42
57
|
post_install_message:
|
43
58
|
rdoc_options: []
|
@@ -54,8 +69,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
54
69
|
- !ruby/object:Gem::Version
|
55
70
|
version: '0'
|
56
71
|
requirements: []
|
57
|
-
rubyforge_project:
|
58
|
-
rubygems_version: 2.
|
72
|
+
rubyforge_project:
|
73
|
+
rubygems_version: 2.7.7
|
59
74
|
signing_key:
|
60
75
|
specification_version: 4
|
61
76
|
summary: A script to convert Gherkin features into a mindmap
|