techcor 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +22 -0
- data/Gemfile.lock +96 -0
- data/README.md +27 -0
- data/Rakefile +45 -0
- data/bin/tc +6 -0
- data/config/cucumber.yml +2 -0
- data/config/mongoid.yml +29 -0
- data/config/mongoid.yml.sample +29 -0
- data/db/seed.rb +37 -0
- data/features/add_metric.feature +9 -0
- data/features/add_project.feature +9 -0
- data/features/console_interface.feature +58 -0
- data/features/describe_project.feature +25 -0
- data/features/edit_property.feature +9 -0
- data/features/list_projects.feature +69 -0
- data/features/property_history.feature +51 -0
- data/features/rake.feature +11 -0
- data/features/seeds.feature +9 -0
- data/features/step_definitions/add_project.rb +22 -0
- data/features/step_definitions/console_interface.rb +7 -0
- data/features/step_definitions/list_projects.rb +3 -0
- data/features/step_definitions/property_history.rb +4 -0
- data/features/step_definitions/rake.rb +3 -0
- data/features/support/env.rb +9 -0
- data/lib/commands/add_metric.rb +17 -0
- data/lib/commands/add_project.rb +5 -0
- data/lib/commands/describe_project.rb +26 -0
- data/lib/commands/edit_property.rb +9 -0
- data/lib/commands/gli/add.rb +12 -0
- data/lib/commands/gli/add_metric.rb +23 -0
- data/lib/commands/gli/describe.rb +16 -0
- data/lib/commands/gli/edit_property.rb +22 -0
- data/lib/commands/gli/history.rb +19 -0
- data/lib/commands/gli/hooks.rb +8 -0
- data/lib/commands/gli/list.rb +14 -0
- data/lib/commands/gli/program.rb +5 -0
- data/lib/commands/list_projects.rb +32 -0
- data/lib/commands/view_history.rb +37 -0
- data/lib/console_formatter.rb +18 -0
- data/lib/gli_interface.rb +15 -0
- data/lib/metrics/boolean_metric.rb +7 -0
- data/lib/metrics/metric.rb +24 -0
- data/lib/metrics/number_metric.rb +7 -0
- data/lib/metrics/string_metric.rb +7 -0
- data/lib/project.rb +15 -0
- data/lib/project_catalog.rb +34 -0
- data/lib/property_value.rb +3 -0
- data/lib/storage/metric_mongo.rb +11 -0
- data/lib/storage/project_mongo.rb +9 -0
- data/lib/storage/property_value_mongo.rb +10 -0
- data/lib/tc/version.rb +9 -0
- data/lib/tc.rb +27 -0
- data/spec/integration/mongo_spec.rb +19 -0
- data/spec/lib/commands/add_metric_spec.rb +31 -0
- data/spec/lib/commands/add_project_spec.rb +10 -0
- data/spec/lib/commands/describe_project_spec.rb +42 -0
- data/spec/lib/commands/edit_property_spec.rb +19 -0
- data/spec/lib/commands/list_projects_spec.rb +47 -0
- data/spec/lib/commands/view_history_spec.rb +64 -0
- data/spec/lib/console_formatter_spec.rb +29 -0
- data/spec/lib/metrics/boolean_metric_spec.rb +9 -0
- data/spec/lib/metrics/metric_spec.rb +26 -0
- data/spec/lib/metrics/number_metric_spec.rb +8 -0
- data/spec/lib/metrics/string_metric_spec.rb +7 -0
- data/spec/lib/project_catalog_spec.rb +23 -0
- data/spec/lib/project_spec.rb +45 -0
- data/spec/lib/storage/metric_mongo_spec.rb +12 -0
- data/spec/lib/storage/project_mongo_spec.rb +11 -0
- data/spec/lib/storage/property_value_mongo_spec.rb +11 -0
- data/spec/spec_helper.rb +8 -0
- metadata +313 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
class DescribeProject < Struct.new :project_name, :date_format
|
2
|
+
def call formatter = formatter, records = records
|
3
|
+
formatter.present records
|
4
|
+
end
|
5
|
+
|
6
|
+
def project project_name = project_name
|
7
|
+
Project.find_by name: project_name
|
8
|
+
end
|
9
|
+
|
10
|
+
def records project = project
|
11
|
+
project.metrics
|
12
|
+
end
|
13
|
+
|
14
|
+
def formatter format = format
|
15
|
+
ConsoleFormatter.new format
|
16
|
+
end
|
17
|
+
|
18
|
+
def format date_format = date_format
|
19
|
+
{
|
20
|
+
'Metric' => 'name',
|
21
|
+
'Value' => 'value',
|
22
|
+
'Changed at' => "last_updated_at.strftime('#{date_format}')",
|
23
|
+
'Changed by' => "last_updated_by"
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class EditProperty < Struct.new :project_name, :metric_name, :value, :author
|
2
|
+
def call project = project, metric_name = metric_name, value = value, author = author
|
3
|
+
project.edit_property(metric_name, value, author)
|
4
|
+
end
|
5
|
+
|
6
|
+
def project project_name = project_name
|
7
|
+
Project.find_by(name: project_name)
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class TcCli
|
2
|
+
desc "Adds new project"
|
3
|
+
long_desc "Allows to create new project"
|
4
|
+
arg_name '{project_name}'
|
5
|
+
command :add do |command|
|
6
|
+
command.action do |global, options, args|
|
7
|
+
name = args.first
|
8
|
+
puts "Project #{name} was successfully added." if AddProject.new(name).call
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class TcCli
|
2
|
+
desc "Adds new metric to the project"
|
3
|
+
long_desc "Allows to add new metric to the project"
|
4
|
+
arg_name '{metric_name}'
|
5
|
+
command :add_metric do |command|
|
6
|
+
command.arg_name 'project name'
|
7
|
+
command.desc 'name of the project, to which you want to add metric'
|
8
|
+
command.flag :pn, :project_name
|
9
|
+
|
10
|
+
command.arg_name 'metric type'
|
11
|
+
command.desc 'type of the metric you want to add (string, number, boolean)'
|
12
|
+
command.default_value "string"
|
13
|
+
command.flag :mt, :metric_type
|
14
|
+
|
15
|
+
command.action do |global, options, args|
|
16
|
+
project_name = options[:project_name]
|
17
|
+
metric_type = options[:metric_type]
|
18
|
+
metric_name = args.first
|
19
|
+
puts "Metric #{metric_name} with type #{metric_type} was successfully added to project #{project_name}." if AddMetric.new(project_name, metric_type, metric_name).call
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class TcCli
|
2
|
+
desc "Describes current state of the project"
|
3
|
+
long_desc "Displays current metrics of the project, date and author of last modification"
|
4
|
+
arg_name '{project_name}'
|
5
|
+
command :describe do |command|
|
6
|
+
command.arg_name 'date format'
|
7
|
+
command.desc 'ruby date format to display time of change'
|
8
|
+
command.default_value "%d-%m-%Y"
|
9
|
+
command.flag :df, :date_format
|
10
|
+
|
11
|
+
command.action do |global, options, args|
|
12
|
+
puts DescribeProject.new(args.first, options[:date_format]).call
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class TcCli
|
2
|
+
desc "Edits one metric of the project"
|
3
|
+
long_desc "Allows to edit one of the project's metrics"
|
4
|
+
arg_name '{value}'
|
5
|
+
command :edit_property do |command|
|
6
|
+
command.arg_name 'project name'
|
7
|
+
command.desc 'name of the project, property of which you want to edit'
|
8
|
+
command.flag :pn, :project_name
|
9
|
+
|
10
|
+
command.arg_name 'metric name'
|
11
|
+
command.desc 'name of the metric, which you want to edit'
|
12
|
+
command.flag :mn, :metric_name
|
13
|
+
|
14
|
+
command.action do |global, options, args|
|
15
|
+
project_name = options[:project_name]
|
16
|
+
metric_name = options[:metric_name]
|
17
|
+
value = args.first
|
18
|
+
puts "Metric #{metric_name} in project #{project_name} now has value #{value}." if EditProperty.new(project_name, metric_name, value, `whoami`).call
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class TcCli
|
2
|
+
desc "Displays property history"
|
3
|
+
long_desc "Displays one or more properties history (list of values over time)"
|
4
|
+
arg_name '[{property}],[{another_property}],[...]'
|
5
|
+
command :history do |command|
|
6
|
+
command.arg_name 'project name'
|
7
|
+
command.desc 'name of the project, property of which you want to edit'
|
8
|
+
command.flag :pn, :project_name
|
9
|
+
|
10
|
+
command.arg_name 'date format'
|
11
|
+
command.desc 'ruby date format to display time of change'
|
12
|
+
command.default_value "%d-%m-%Y"
|
13
|
+
command.flag :df, :date_format
|
14
|
+
|
15
|
+
command.action do |global, options, args|
|
16
|
+
puts ViewHistory.new(options[:project_name], options[:date_format], args.first.try(:split, ',')).call
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class TcCli
|
2
|
+
desc "List projects from catalog"
|
3
|
+
long_desc "Lists projects from catalog matching specified criteria"
|
4
|
+
arg_name '{criteria}'
|
5
|
+
command :list do |command|
|
6
|
+
command.arg_name 'table format'
|
7
|
+
command.desc 'ruby code for table format'
|
8
|
+
command.flag :fm, :format
|
9
|
+
|
10
|
+
command.action do |global, options, args|
|
11
|
+
puts ListProjects.new(options[:format], args.first).call
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class ListProjects < Struct.new :format, :criteria
|
2
|
+
def call formatter = formatter, projects = projects
|
3
|
+
formatter.present projects
|
4
|
+
end
|
5
|
+
|
6
|
+
def projects catalog = ProjectCatalog.load, criteria = criteria
|
7
|
+
catalog.projects criteria
|
8
|
+
end
|
9
|
+
|
10
|
+
def formatter(format = format.present? ? eval(format) : default_format)
|
11
|
+
ConsoleFormatter.new format
|
12
|
+
end
|
13
|
+
|
14
|
+
def default_format projects = projects
|
15
|
+
{'Name' => 'name'}.merge list_properties_format properties
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def list_properties_format properties
|
21
|
+
Hash[properties.map { |p| [p, "property('#{p}').try(:value)"] }]
|
22
|
+
end
|
23
|
+
|
24
|
+
def properties
|
25
|
+
metrics.collect(&:name).flatten
|
26
|
+
end
|
27
|
+
|
28
|
+
def metrics
|
29
|
+
projects.collect(&:metrics).flatten
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class ViewHistory < Struct.new :project_name, :date_format, :properties
|
2
|
+
def call formatter = formatter, records = records
|
3
|
+
formatter.present records
|
4
|
+
end
|
5
|
+
|
6
|
+
def project project_name = project_name
|
7
|
+
Project.find_by name: project_name
|
8
|
+
end
|
9
|
+
|
10
|
+
def records metrics = metrics
|
11
|
+
metrics.collect(&:values).flatten
|
12
|
+
end
|
13
|
+
|
14
|
+
def formatter format = format
|
15
|
+
ConsoleFormatter.new format
|
16
|
+
end
|
17
|
+
|
18
|
+
def properties project = project
|
19
|
+
self[:properties].present? ? self[:properties] : project.metrics.collect(&:name)
|
20
|
+
end
|
21
|
+
|
22
|
+
def metrics project = project, properties = properties
|
23
|
+
properties.map do |property|
|
24
|
+
project.property property
|
25
|
+
end.compact
|
26
|
+
end
|
27
|
+
|
28
|
+
def format date_format = date_format, metrics = metrics
|
29
|
+
{'Date' => "created_at.strftime('#{date_format}')"}.merge list_metrics_format(metrics)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def list_metrics_format metrics
|
35
|
+
Hash[metrics.map { |m| [m.name, "metric.name == '#{m.name}' ? value : ''"] }]
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class ConsoleFormatter < Struct.new :format
|
2
|
+
|
3
|
+
def present records, format = format
|
4
|
+
Hirb::Helpers::AutoTable.render(render_each(records), fields: format.keys, resize: false)
|
5
|
+
end
|
6
|
+
|
7
|
+
def render_each records
|
8
|
+
records.map { |record|
|
9
|
+
render_record record
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def render_record record, format = format
|
14
|
+
format.merge(format) do |_, expression|
|
15
|
+
record.instance_eval expression
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'gli'
|
2
|
+
ENV["COLUMNS"] = "1000"
|
3
|
+
ENV["LINES"] = "1000"
|
4
|
+
|
5
|
+
$:.unshift File.expand_path(File.dirname(File.realpath(__FILE__)))
|
6
|
+
|
7
|
+
class TcCli
|
8
|
+
extend GLI::App
|
9
|
+
commands_from 'commands/gli'
|
10
|
+
|
11
|
+
def self.exec argv
|
12
|
+
commands[:help] = GLI::Commands::Help.new(self)
|
13
|
+
run(argv)
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Metric
|
2
|
+
|
3
|
+
def edit value, user
|
4
|
+
values << PropertyValue.new(value: convert(value), created_by: user)
|
5
|
+
self
|
6
|
+
end
|
7
|
+
|
8
|
+
def value
|
9
|
+
values.last.try :value
|
10
|
+
end
|
11
|
+
|
12
|
+
def last_updated_by
|
13
|
+
values.last.try :created_by
|
14
|
+
end
|
15
|
+
|
16
|
+
def last_updated_at
|
17
|
+
values.last.try :created_at
|
18
|
+
end
|
19
|
+
|
20
|
+
def convert value
|
21
|
+
value
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
data/lib/project.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
class ProjectCatalog
|
2
|
+
|
3
|
+
def initialize
|
4
|
+
@projects = []
|
5
|
+
end
|
6
|
+
|
7
|
+
def projects criteria = nil
|
8
|
+
result = @projects.sort_by(&:name)
|
9
|
+
|
10
|
+
return result if criteria.blank?
|
11
|
+
result.find_all { |project|
|
12
|
+
project.instance_eval criteria
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_project project
|
17
|
+
@projects << project
|
18
|
+
self
|
19
|
+
end
|
20
|
+
|
21
|
+
def save
|
22
|
+
@projects.all? &:save
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
def load
|
27
|
+
@projects = Project.all
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.load
|
32
|
+
self.new.load
|
33
|
+
end
|
34
|
+
end
|
data/lib/tc/version.rb
ADDED
data/lib/tc.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'hirb'
|
2
|
+
require 'mongoid'
|
3
|
+
|
4
|
+
config_folder = File.expand_path(File.dirname(File.realpath(__FILE__)) + '/../config')
|
5
|
+
`cp #{config_folder}/mongoid.yml.sample #{config_folder}/mongoid.yml` unless File.exists? "#{config_folder}/mongoid.yml"
|
6
|
+
|
7
|
+
Mongoid.load!("#{config_folder}/mongoid.yml")
|
8
|
+
|
9
|
+
$: << File.expand_path(File.dirname(File.realpath(__FILE__)) + '/../lib')
|
10
|
+
|
11
|
+
require 'project'
|
12
|
+
require 'property_value'
|
13
|
+
require 'project_catalog'
|
14
|
+
require 'console_formatter'
|
15
|
+
require 'metrics/metric'
|
16
|
+
require 'metrics/number_metric'
|
17
|
+
require 'metrics/string_metric'
|
18
|
+
require 'metrics/boolean_metric'
|
19
|
+
require 'commands/list_projects'
|
20
|
+
require 'commands/add_project'
|
21
|
+
require 'commands/add_metric'
|
22
|
+
require 'commands/edit_property'
|
23
|
+
require 'commands/view_history'
|
24
|
+
require 'commands/describe_project'
|
25
|
+
require 'storage/metric_mongo'
|
26
|
+
require 'storage/project_mongo'
|
27
|
+
require 'storage/property_value_mongo'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ProjectCatalog do
|
4
|
+
|
5
|
+
before { Project.delete_all }
|
6
|
+
|
7
|
+
subject {
|
8
|
+
ProjectCatalog.new.
|
9
|
+
add_project(Project.new(name: '1').add_metric(NumberMetric.new(name: 'length')).edit_property('length', 3, 'user')).
|
10
|
+
add_project(Project.new(name: '2').add_metric(NumberMetric.new(name: 'length')).edit_property('length', 2, 'user')).
|
11
|
+
add_project(Project.new(name: '3').add_metric(NumberMetric.new(name: 'length')).edit_property('length', 1, 'user'))
|
12
|
+
}
|
13
|
+
|
14
|
+
it 'loads list of saved projects' do
|
15
|
+
subject.save
|
16
|
+
|
17
|
+
ProjectCatalog.load.projects.should have_exactly(3).items
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AddMetric do
|
4
|
+
it 'adds metric to the project' do
|
5
|
+
result = stub(:result)
|
6
|
+
metric = stub(:metric)
|
7
|
+
project = stub(:project).tap { |p| p.should_receive(:add_metric).with(metric) { result } }
|
8
|
+
subject.call(project, metric)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'find project' do
|
12
|
+
result = stub(:result)
|
13
|
+
project_name = stub(:project_name)
|
14
|
+
Project.should_receive(:find_by).with(name: project_name) { result }
|
15
|
+
subject.project(project_name).should == result
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'creates appropriate metric class' do
|
19
|
+
subject.metric_class(:string).should == StringMetric
|
20
|
+
subject.metric_class(:number).should == NumberMetric
|
21
|
+
subject.metric_class(nil).should == Metric
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'creates metric' do
|
25
|
+
result = stub(:result)
|
26
|
+
name = stub(:name)
|
27
|
+
metric_class = stub(:metric_class).tap { |mc| mc.should_receive(:new).with(name: name) { result } }
|
28
|
+
|
29
|
+
subject.metric(metric_class, name).should == result
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DescribeProject do
|
4
|
+
it 'presents properties to table view' do
|
5
|
+
result = stub(:result)
|
6
|
+
|
7
|
+
records = stub(:records)
|
8
|
+
formatter = stub(:formatter).tap { |f| f.should_receive(:present).with(records) { result } }
|
9
|
+
|
10
|
+
subject.call(formatter, records).should == result
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'passes format to console formatter' do
|
14
|
+
format = stub(:format)
|
15
|
+
ConsoleFormatter.should_receive(:new).with(format)
|
16
|
+
|
17
|
+
subject.formatter(format)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'collects metrics from project' do
|
21
|
+
metrics = stub(:metrics)
|
22
|
+
project = stub(:project, :metrics => metrics)
|
23
|
+
subject.records(project).should == metrics
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'constructs format for console formatter' do
|
27
|
+
subject.format("DATE_FORMAT").should == {
|
28
|
+
'Metric' => 'name',
|
29
|
+
'Value' => 'value',
|
30
|
+
'Changed at' => "last_updated_at.strftime('DATE_FORMAT')",
|
31
|
+
'Changed by' => "last_updated_by"
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'finds project by its name' do
|
36
|
+
name, result = stub(:name), stub(:result)
|
37
|
+
Project.should_receive(:find_by).with(name: name) { result }
|
38
|
+
|
39
|
+
subject.project(name).should == result
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe EditProperty do
|
4
|
+
it 'edits property of the project' do
|
5
|
+
result = stub(:result)
|
6
|
+
metric_name = stub(:metric_name)
|
7
|
+
value = stub(:value)
|
8
|
+
author = stub(:author)
|
9
|
+
project = stub(:project).tap { |p| p.should_receive(:edit_property).with(metric_name, value, author) { result } }
|
10
|
+
subject.call(project, metric_name, value, author).should == result
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'find project' do
|
14
|
+
result = stub(:result)
|
15
|
+
project_name = stub(:project_name)
|
16
|
+
Project.should_receive(:find_by).with(name: project_name) { result }
|
17
|
+
subject.project(project_name).should == result
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ListProjects do
|
4
|
+
it 'passes format to console formatter' do
|
5
|
+
format = '42'
|
6
|
+
ConsoleFormatter.should_receive(:new).with(eval(format))
|
7
|
+
|
8
|
+
ListProjects.new(format).formatter
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'gets list of projects from catalog according to criteria' do
|
12
|
+
result = stub(:result)
|
13
|
+
|
14
|
+
criteria = stub(:criteria)
|
15
|
+
catalog = stub(:catalog).tap { |c| c.should_receive(:projects).with(criteria) { result } }
|
16
|
+
|
17
|
+
subject.projects(catalog, criteria).should == result
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'presents projects to table view' do
|
21
|
+
result = stub(:result)
|
22
|
+
|
23
|
+
projects = stub(:projects)
|
24
|
+
formatter = stub(:formatter).tap { |f| f.should_receive(:present).with(projects) { result } }
|
25
|
+
|
26
|
+
subject.call(formatter, projects).should == result
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'uses default format if no format string was specified' do
|
30
|
+
result = stub(:result)
|
31
|
+
|
32
|
+
command = ListProjects.new(nil)
|
33
|
+
command.should_receive(:default_format) { result }
|
34
|
+
|
35
|
+
command.formatter
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'builds default format as list of all metrics for all projects' do
|
39
|
+
subject.stub(:projects => [
|
40
|
+
stub(:metrics => [stub(:name => 'metric1'), stub(:name => 'metric2')]),
|
41
|
+
stub(:metrics => [stub(:name => 'metric3')])])
|
42
|
+
subject.default_format.should == {'Name' => 'name',
|
43
|
+
'metric1' => "property('metric1').try(:value)",
|
44
|
+
'metric2' => "property('metric2').try(:value)",
|
45
|
+
'metric3' => "property('metric3').try(:value)"}
|
46
|
+
end
|
47
|
+
end
|