featuremap 0.0.2 → 0.1.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 +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
|