mingle-macro-development-toolkit 1.3.3 → 2.0.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.
- data/{History.txt → History} +11 -0
- data/{LICENSE.txt → LICENSE} +0 -0
- data/{README.txt → README} +4 -2
- data/Rakefile +15 -40
- data/bin/new_mingle_macro +25 -137
- data/lib/mingle_macro_development_toolkit.rb +4 -0
- data/lib/mingle_macro_development_toolkit/loaders.rb +5 -0
- data/lib/mingle_macro_development_toolkit/loaders/fixture_loaders/base.rb +19 -0
- data/lib/mingle_macro_development_toolkit/loaders/fixture_loaders/card_type_loader.rb +15 -0
- data/lib/mingle_macro_development_toolkit/loaders/fixture_loaders/card_types_loader.rb +10 -0
- data/lib/mingle_macro_development_toolkit/loaders/fixture_loaders/card_types_property_definitions_loader.rb +12 -0
- data/lib/mingle_macro_development_toolkit/loaders/fixture_loaders/project_loader.rb +16 -0
- data/lib/mingle_macro_development_toolkit/loaders/fixture_loaders/project_variables_loader.rb +10 -0
- data/lib/mingle_macro_development_toolkit/loaders/fixture_loaders/property_definition_loader.rb +16 -0
- data/lib/mingle_macro_development_toolkit/loaders/fixture_loaders/property_definitions_loader.rb +10 -0
- data/lib/mingle_macro_development_toolkit/loaders/fixture_loaders/property_values_loader.rb +10 -0
- data/lib/mingle_macro_development_toolkit/loaders/fixture_loaders/team_loader.rb +10 -0
- data/lib/mingle_macro_development_toolkit/loaders/restful_loaders/base.rb +85 -0
- data/lib/mingle_macro_development_toolkit/loaders/restful_loaders/card_type_loader.rb +19 -0
- data/lib/mingle_macro_development_toolkit/loaders/restful_loaders/card_types_loader.rb +14 -0
- data/lib/mingle_macro_development_toolkit/loaders/restful_loaders/card_types_property_definitions_loader.rb +32 -0
- data/lib/mingle_macro_development_toolkit/loaders/restful_loaders/project_loader.rb +26 -0
- data/lib/mingle_macro_development_toolkit/loaders/restful_loaders/project_variables_loader.rb +14 -0
- data/lib/mingle_macro_development_toolkit/loaders/restful_loaders/property_definition_loader.rb +20 -0
- data/lib/mingle_macro_development_toolkit/loaders/restful_loaders/property_definitions_loader.rb +14 -0
- data/lib/mingle_macro_development_toolkit/loaders/restful_loaders/property_values_loader.rb +14 -0
- data/lib/mingle_macro_development_toolkit/loaders/restful_loaders/team_loader.rb +14 -0
- data/templates/Rakefile +23 -0
- data/{getting_started.txt → templates/getting_started.txt} +93 -93
- data/templates/init.rb +1 -0
- data/{example → templates/lib}/macro.rb +0 -0
- data/{test/project_data → templates/test/data/exports}/macro_toolkit_test_template.mingle +0 -0
- data/{test/fixtures/sample → templates/test/data/fixtures}/card_types.yml +0 -0
- data/{test/fixtures/sample → templates/test/data/fixtures}/project_variables.yml +0 -0
- data/{test/fixtures/sample → templates/test/data/fixtures}/projects.yml +0 -0
- data/{test/fixtures/sample → templates/test/data/fixtures}/property_definitions.yml +0 -0
- data/{test/fixtures/sample → templates/test/data/fixtures}/property_type_mappings.yml +0 -0
- data/{test/fixtures/sample → templates/test/data/fixtures}/property_values.yml +0 -0
- data/{test/fixtures/sample → templates/test/data/fixtures}/users.yml +0 -0
- data/{example → templates/test/integration}/integration_test.rb +4 -5
- data/templates/test/integration/integration_test_helper.rb +23 -0
- data/templates/test/test_helper.rb +4 -0
- data/{example → templates/test/unit}/unit_test.rb +7 -7
- data/templates/test/unit/unit_test_helper.rb +13 -0
- data/test/data/exports/macro_toolkit_test_template.mingle +0 -0
- data/test/data/fixtures/card_types.yml +37 -0
- data/test/data/fixtures/project_variables.yml +7 -0
- data/test/data/fixtures/projects.yml +4 -0
- data/test/data/fixtures/property_definitions.yml +51 -0
- data/test/data/fixtures/property_type_mappings.yml +81 -0
- data/test/data/fixtures/property_values.yml +19 -0
- data/test/data/fixtures/users.yml +16 -0
- data/test/integration/integration_test_helper.rb +3 -13
- data/test/integration/{rest_loader_test.rb → restful_loaders_test.rb} +4 -4
- data/test/test_helper.rb +2 -0
- data/test/unit/{fixture_loader_test.rb → fixture_loaders_test.rb} +2 -2
- data/test/unit/unit_test_helper.rb +7 -6
- metadata +101 -100
- data/example/Rakefile +0 -6
- data/example/deploy.rake +0 -10
- data/example/init.rb +0 -10
- data/example/integration_test_helper.rb +0 -31
- data/example/unit_test_helper.rb +0 -13
- data/lib/macro_development_toolkit.rb +0 -29
- data/lib/macro_development_toolkit/mingle/card_type.rb +0 -41
- data/lib/macro_development_toolkit/mingle/card_type_property_definition.rb +0 -26
- data/lib/macro_development_toolkit/mingle/project.rb +0 -168
- data/lib/macro_development_toolkit/mingle/project_variable.rb +0 -24
- data/lib/macro_development_toolkit/mingle/property_definition.rb +0 -105
- data/lib/macro_development_toolkit/mingle/property_value.rb +0 -67
- data/lib/macro_development_toolkit/mingle/user.rb +0 -33
- data/lib/macro_development_toolkit/mingle_model_loader.rb +0 -151
- data/tasks/test.rake +0 -16
- data/test/integration/rest_loader.rb +0 -233
- data/test/unit/fixture_loader.rb +0 -109
data/{History.txt → History}
RENAMED
@@ -1,3 +1,14 @@
|
|
1
|
+
== 2.0.0 April 2012
|
2
|
+
|
3
|
+
* 1.3.4 was meant to be a major version update, sorry for the inconvenience caused.
|
4
|
+
* This version will generate macros that work with the upcoming Mingle 12.1 release.
|
5
|
+
* To work with older Mingle versions, you can use 1.3.3 version.
|
6
|
+
|
7
|
+
== 1.3.4 April 2012
|
8
|
+
|
9
|
+
* Minor bug fix
|
10
|
+
* Code refactoring
|
11
|
+
|
1
12
|
== 1.3.3 January 2011
|
2
13
|
|
3
14
|
* Minor bug fix
|
data/{LICENSE.txt → LICENSE}
RENAMED
File without changes
|
data/{README.txt → README}
RENAMED
@@ -1,11 +1,13 @@
|
|
1
1
|
= Macro Development Toolkit - supporting development of custom macros for Mingle
|
2
2
|
|
3
|
-
|
3
|
+
https://github.com/ThoughtWorksStudios/mingle_macro_development_toolkit
|
4
|
+
|
5
|
+
NOTE: This new version will only work with upcoming Mingle 12.1 release and later. For older versions of Mingle, please use version 1.3.3
|
4
6
|
|
5
7
|
This toolkit provides support for developing, testing and deploying custom Mingle macros.
|
6
8
|
|
7
9
|
Use the built in generator to create a skeleton of a plugin which you can then deploy to an instance of Mingle running
|
8
|
-
version
|
10
|
+
version 12.1 or later of the software.
|
9
11
|
|
10
12
|
This allows you to take advantage of free charting utilities such as the Google Charts API, to create
|
11
13
|
new visualizations, specific to your project or organization.
|
data/Rakefile
CHANGED
@@ -1,40 +1,15 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
%w[rake rake/clean rake/testtask fileutils].each { |f| require f }
|
17
|
-
require File.dirname(__FILE__) + '/lib/macro_development_toolkit'
|
18
|
-
|
19
|
-
|
20
|
-
%w[newgem rubigen hoe].each { |f| require f }
|
21
|
-
|
22
|
-
# Generate all the Rake tasks
|
23
|
-
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
24
|
-
$hoe = Hoe.spec('mingle-macro-development-toolkit') do |p|
|
25
|
-
p.version = MacroDevelopmentToolkit::VERSION
|
26
|
-
p.developer('ThoughtWorks Inc', 'support@thoughtworks.com')
|
27
|
-
p.post_install_message = 'getting_started.txt'
|
28
|
-
p.rubyforge_name = 'mingle-macros'
|
29
|
-
p.extra_deps = [
|
30
|
-
['activesupport','2.3.5'],
|
31
|
-
]
|
32
|
-
p.summary = "This toolkit provides support for developing, testing and deploying custom Mingle macros."
|
33
|
-
p.clean_globs |= %w[**/.DS_Store tmp *.log]
|
34
|
-
path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
|
35
|
-
p.remote_rdoc_dir = ''
|
36
|
-
p.rsync_args = '-av --delete --ignore-errors'
|
37
|
-
end
|
38
|
-
require 'newgem/tasks'
|
39
|
-
|
40
|
-
Dir['tasks/**/*.rake'].each { |t| load t }
|
1
|
+
require "rake/testtask"
|
2
|
+
|
3
|
+
namespace :test do
|
4
|
+
Rake::TestTask.new(:unit) do |t|
|
5
|
+
t.libs << "test/unit"
|
6
|
+
t.pattern = 'test/unit/*_test.rb'
|
7
|
+
t.verbose = true
|
8
|
+
end
|
9
|
+
|
10
|
+
Rake::TestTask.new(:integration) do |t|
|
11
|
+
t.libs << "test/integration"
|
12
|
+
t.pattern = 'test/integration/*_test.rb'
|
13
|
+
t.verbose = true
|
14
|
+
end
|
15
|
+
end
|
data/bin/new_mingle_macro
CHANGED
@@ -1,151 +1,39 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
#Copyright 2011 ThoughtWorks, Inc. All rights reserved.
|
3
|
-
|
4
|
-
module NewMingleMacro
|
5
|
-
module Messages
|
6
|
-
USAGE = <<-USAGE
|
7
|
-
Macro name cannot be blank.
|
1
|
+
#!/usr/bin/env ruby -rubygems -w
|
8
2
|
|
9
|
-
|
3
|
+
require "fileutils"
|
4
|
+
require 'thread'
|
5
|
+
require 'active_support'
|
6
|
+
require "erb"
|
7
|
+
|
8
|
+
USAGE = <<-USAGE
|
9
|
+
Usage: new_mingle_macro <macro_name>
|
10
10
|
|
11
11
|
macro_name : The name of your new macro. Should be alphabetic, possibly
|
12
12
|
including underscores(_).
|
13
|
-
macro_class_name: (optional) The name of the class that implements the macro.
|
14
|
-
Should be a CamelCased alphabetic string. Defaults to
|
15
|
-
CamelCased version of macro_name. We highly recommend setting
|
16
|
-
your own class name with an appropriate namespace to avoid
|
17
|
-
collisions with standard libraries or Mingle classes.
|
18
13
|
USAGE
|
19
|
-
|
20
|
-
SPECIAL_CHARACTER_REPLACEMENT_MESSAGE = <<-SPECIAL_CHARACTER_REPLACEMENT_MESSAGE
|
21
|
-
Your macro name contains special characters that will be replaced with
|
22
|
-
underscores (_). Is this OK? [Yes/No]"
|
23
|
-
SPECIAL_CHARACTER_REPLACEMENT_MESSAGE
|
24
14
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
classes name with appropriate namespaces to avoid collisions with standard libraries
|
29
|
-
or Mingle classes. Please run this tool with no command-line arguments to learn
|
30
|
-
how to provide a class name.
|
31
|
-
AUTO_GENERATED_CLASS_NAME_MESSAGE
|
32
|
-
end
|
33
|
-
end
|
15
|
+
macro_name = ARGV[0]
|
16
|
+
raise "Macro name is required!\n" + USAGE if macro_name.blank?
|
17
|
+
raise "Invalid macro name!\n" + USAGE if macro_name !~ /^[a-z]([a-z0-9_]+)?/i
|
34
18
|
|
35
|
-
|
36
|
-
require 'fileutils'
|
37
|
-
begin
|
38
|
-
require 'active_support/all'
|
39
|
-
rescue LoadError
|
40
|
-
require 'rubygems'
|
41
|
-
require 'active_support/all'
|
42
|
-
end
|
19
|
+
macro_class_name = macro_name.downcase.camelcase
|
43
20
|
|
44
|
-
|
45
|
-
|
46
|
-
unless ActiveSupport::VERSION::STRING == REQUIRED_ACTIVE_SUPPORT_VERSION
|
47
|
-
raise "For guaranteed compatibility with Mingle, you must develop macros using ActiveSupport #{REQUIRED_ACTIVE_SUPPORT_VERSION}. You are using version #{ActiveSupport::VERSION::STRING}"
|
48
|
-
end
|
49
|
-
|
50
|
-
def print_usage
|
51
|
-
puts NewMingleMacro::Messages::USAGE
|
52
|
-
end
|
21
|
+
destination = File.expand_path(macro_name)
|
22
|
+
raise "#{destination} already exists!" if File.exists? destination
|
53
23
|
|
54
|
-
|
55
|
-
print_usage
|
56
|
-
exit!
|
57
|
-
end
|
58
|
-
|
59
|
-
def read_macro_name
|
60
|
-
result = ARGV[0].downcase.gsub(/\s/, '_')
|
61
|
-
if result !~ /^[_A-Za-z]+$/
|
62
|
-
print NewMingleMacro::Messages::SPECIAL_CHARACTER_REPLACEMENT_MESSAGE
|
63
|
-
exit if STDIN.gets.downcase =~ /^n/
|
64
|
-
result = result.gsub(/[^_A-Za-z]/, '_').squeeze('_')
|
65
|
-
end
|
66
|
-
result
|
67
|
-
end
|
68
|
-
|
69
|
-
def read_or_generate_macro_class_name(macro_name)
|
70
|
-
if ARGV[1]
|
71
|
-
ARGV[1]
|
72
|
-
else
|
73
|
-
puts NewMingleMacro::Messages::AUTO_GENERATED_CLASS_NAME_MESSAGE
|
74
|
-
macro_name.gsub(/\W/, '_').camelize
|
75
|
-
end
|
76
|
-
end
|
24
|
+
FileUtils.mkdir destination
|
77
25
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
26
|
+
Dir.chdir(File.join(File.dirname(__FILE__), "..", "templates")) do
|
27
|
+
Dir.glob("**/*").each do |f|
|
28
|
+
next if File.directory? f
|
29
|
+
output = File.join(destination, f)
|
30
|
+
FileUtils.mkdir_p(File.dirname(output))
|
31
|
+
File.open(output, 'w').write(ERB.new(File.read(f), nil, '-').result(binding))
|
83
32
|
end
|
84
|
-
macro_class_name
|
85
|
-
end
|
86
|
-
|
87
|
-
macro_name = read_macro_name
|
88
|
-
macro_class_name = validate_class_name(read_or_generate_macro_class_name(macro_name))
|
89
|
-
|
90
|
-
if File.exists?(macro_name)
|
91
|
-
print "Folder #{macro_name} already exists in your current directory. Either rename the macro or delete the folder and then execute this command to continue."
|
92
|
-
exit
|
93
33
|
end
|
94
34
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
else
|
100
|
-
File.expand_path(location)
|
101
|
-
end
|
102
|
-
|
103
|
-
end
|
104
|
-
|
105
|
-
def /(another_fragment)
|
106
|
-
self.class.new(File.join(@base_location, another_fragment))
|
107
|
-
end
|
108
|
-
|
109
|
-
def cp(options = {:to => nil, :r => true})
|
110
|
-
if options[:r]
|
111
|
-
FileUtils.cp(@base_location, options[:to].to_s, :verbose => false)
|
112
|
-
else
|
113
|
-
FileUtils.cp_r(@base_location, options[:to].to_s, :verbose => false)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def mkdir_p
|
118
|
-
FileUtils.mkdir_p(@base_location)
|
119
|
-
end
|
120
|
-
|
121
|
-
def to_s
|
122
|
-
@base_location
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
gem_dir = Path.new(:gem)
|
127
|
-
macro_dir = Path.new(macro_name)
|
128
|
-
|
129
|
-
[macro_dir/'lib', macro_dir/'test'/'unit', macro_dir/'test'/'fixtures', macro_dir/'test'/'integration', macro_dir/'tasks'].each(&:mkdir_p)
|
130
|
-
|
131
|
-
(gem_dir/'test'/'fixtures'/'sample').cp :to => macro_dir/'test'/'fixtures'
|
132
|
-
(gem_dir/'test'/'unit'/'fixture_loader.rb').cp :to => macro_dir/'test'/'unit'/'fixture_loader.rb'
|
133
|
-
(gem_dir/'test'/'integration'/'rest_loader.rb').cp :to => macro_dir/'test'/'integration'/'rest_loader.rb'
|
134
|
-
(gem_dir/'tasks'/'test.rake').cp :to => macro_dir/'tasks'/'test.rake'
|
135
|
-
(gem_dir/'example'/'deploy.rake').cp :to => macro_dir/'tasks'/'deploy.rake'
|
136
|
-
(gem_dir/'getting_started.txt').cp :to => macro_dir/'getting_started.txt'
|
137
|
-
|
138
|
-
templates = {
|
139
|
-
gem_dir/'example'/'Rakefile' => macro_dir/'Rakefile',
|
140
|
-
gem_dir/'example'/'init.rb' => macro_dir/'init.rb',
|
141
|
-
gem_dir/'example'/'macro.rb' => macro_dir/'lib'/"#{macro_name}.rb",
|
142
|
-
gem_dir/'example'/'unit_test.rb' => macro_dir/'test'/'unit'/"#{macro_name}_test.rb",
|
143
|
-
gem_dir/'example'/'unit_test_helper.rb' => macro_dir/'test'/'unit'/'unit_test_helper.rb',
|
144
|
-
gem_dir/'example'/'integration_test.rb' => macro_dir/'test'/'integration'/"#{macro_name}_integration_test.rb",
|
145
|
-
gem_dir/'example'/'integration_test_helper.rb' => macro_dir/'test'/'integration'/'integration_test_helper.rb'
|
146
|
-
}
|
147
|
-
|
148
|
-
templates.each do |template, output|
|
149
|
-
template_file = File.open(template.to_s)
|
150
|
-
File.open(output.to_s, 'w').write(ERB.new(template_file.read, nil, '-').result(binding))
|
35
|
+
Dir.chdir(destination) do
|
36
|
+
FileUtils.mv("lib/macro.rb", File.join("lib", "#{macro_name}.rb"))
|
37
|
+
FileUtils.mv("test/unit/unit_test.rb", File.join("test", "unit", "#{macro_name}_test.rb"))
|
38
|
+
FileUtils.mv("test/integration/integration_test.rb", File.join("test", "integration", "#{macro_name}_integration_test.rb"))
|
151
39
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#Copyright 2012 ThoughtWorks, Inc. All rights reserved.
|
2
|
+
require "yaml"
|
3
|
+
|
4
|
+
module FixtureLoaders
|
5
|
+
class Base
|
6
|
+
def initialize(attributes)
|
7
|
+
@attributes = attributes
|
8
|
+
end
|
9
|
+
|
10
|
+
def load_fixtures_for(name)
|
11
|
+
path = File.join(FixtureLoaders::FIXTURE_PATH, "#{name}.yml")
|
12
|
+
YAML::load(File.read(path))
|
13
|
+
end
|
14
|
+
|
15
|
+
def match?(record)
|
16
|
+
@attributes.all? { |key, value| value == record[key] }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#Copyright 2012 ThoughtWorks, Inc. All rights reserved.
|
2
|
+
module FixtureLoaders
|
3
|
+
class CardTypeLoader < Base
|
4
|
+
def card_type
|
5
|
+
@card_type ||= load
|
6
|
+
end
|
7
|
+
|
8
|
+
def load
|
9
|
+
record = load_fixtures_for('card_types').find {|ct| match?(ct)}
|
10
|
+
card_type = Mingle::CardType.new(OpenStruct.new(record))
|
11
|
+
card_type.card_types_property_definitions_loader = CardTypesPropertyDefinitionsLoader.new('card_type_id' => record['id'])
|
12
|
+
card_type
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#Copyright 2012 ThoughtWorks, Inc. All rights reserved.
|
2
|
+
module FixtureLoaders
|
3
|
+
class CardTypesLoader < Base
|
4
|
+
def load
|
5
|
+
load_fixtures_for('card_types').collect do |ct|
|
6
|
+
CardTypeLoader.new('id' => ct['id']) if match?(ct)
|
7
|
+
end.compact.sort_by { |loader| loader.card_type.position }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#Copyright 2012 ThoughtWorks, Inc. All rights reserved.
|
2
|
+
module FixtureLoaders
|
3
|
+
class CardTypesPropertyDefinitionsLoader < Base
|
4
|
+
def load
|
5
|
+
load_fixtures_for('property_type_mappings').collect do |mapping|
|
6
|
+
pd = PropertyDefinitionLoader.new('id' => mapping['property_definition_id']) if match?(mapping)
|
7
|
+
ct = CardTypeLoader.new('id' => mapping['card_type_id']) if match?(mapping)
|
8
|
+
OpenStruct.new(:card_type => ct.load, :property_definition => pd.load) if ct && pd
|
9
|
+
end.compact
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#Copyright 2012 ThoughtWorks, Inc. All rights reserved.
|
2
|
+
require "ostruct"
|
3
|
+
|
4
|
+
module FixtureLoaders
|
5
|
+
class ProjectLoader < Base
|
6
|
+
attr_reader :project
|
7
|
+
def initialize(identifier)
|
8
|
+
project_attributes = load_fixtures_for('projects').detect {|project| project['identifier'] == identifier }
|
9
|
+
@project = Mingle::Project.new(OpenStruct.new(project_attributes), nil)
|
10
|
+
project.card_types_loader = CardTypesLoader.new('project_id' => project_attributes['id'])
|
11
|
+
project.property_definitions_loader = PropertyDefinitionsLoader.new('project_id' => project_attributes['id'])
|
12
|
+
project.team_loader = TeamLoader.new('project_id' => project_attributes['id'])
|
13
|
+
project.project_variables_loader = ProjectVariablesLoader.new('project_id' => project_attributes['id'])
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#Copyright 2012 ThoughtWorks, Inc. All rights reserved.
|
2
|
+
module FixtureLoaders
|
3
|
+
class ProjectVariablesLoader < Base
|
4
|
+
def load
|
5
|
+
load_fixtures_for('project_variables').collect do |pv|
|
6
|
+
Mingle::ProjectVariable.new(OpenStruct.new(pv)) if match?(pv)
|
7
|
+
end.compact
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
data/lib/mingle_macro_development_toolkit/loaders/fixture_loaders/property_definition_loader.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#Copyright 2012 ThoughtWorks, Inc. All rights reserved.
|
2
|
+
module FixtureLoaders
|
3
|
+
class PropertyDefinitionLoader < Base
|
4
|
+
def property_definition
|
5
|
+
@property_definition ||= load
|
6
|
+
end
|
7
|
+
|
8
|
+
def load
|
9
|
+
record = load_fixtures_for('property_definitions').find { |pd| match?(pd)}
|
10
|
+
property_definition = Mingle::PropertyDefinition.new(OpenStruct.new(record))
|
11
|
+
property_definition.card_types_property_definitions_loader = CardTypesPropertyDefinitionsLoader.new('property_definition_id' => record['id'])
|
12
|
+
property_definition.values_loader = PropertyValuesLoader.new('property_definition_id' => record['id'])
|
13
|
+
property_definition
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/mingle_macro_development_toolkit/loaders/fixture_loaders/property_definitions_loader.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#Copyright 2012 ThoughtWorks, Inc. All rights reserved.
|
2
|
+
module FixtureLoaders
|
3
|
+
class PropertyDefinitionsLoader < Base
|
4
|
+
def load
|
5
|
+
load_fixtures_for('property_definitions').collect do |pd|
|
6
|
+
PropertyDefinitionLoader.new('id' => pd['id']) if match?(pd)
|
7
|
+
end.compact
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#Copyright 2012 ThoughtWorks, Inc. All rights reserved.
|
2
|
+
module FixtureLoaders
|
3
|
+
class PropertyValuesLoader < Base
|
4
|
+
def load
|
5
|
+
load_fixtures_for('property_values').collect do |pv|
|
6
|
+
Mingle::PropertyValue.new(OpenStruct.new(pv)) if match?(pv)
|
7
|
+
end.compact
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
#Copyright 2012 ThoughtWorks, Inc. All rights reserved.
|
2
|
+
require 'delegate'
|
3
|
+
require 'uri'
|
4
|
+
require 'net/http'
|
5
|
+
require 'thread'
|
6
|
+
require 'active_support'
|
7
|
+
|
8
|
+
module RESTfulLoaders
|
9
|
+
|
10
|
+
class RemoteError < StandardError
|
11
|
+
def self.parse(response_body)
|
12
|
+
Hash.from_xml(response_body)['errors'].delete("error")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module LoaderHelper
|
17
|
+
|
18
|
+
def extract(key, container)
|
19
|
+
container[key] ? container[key][key.singularize] : []
|
20
|
+
end
|
21
|
+
|
22
|
+
def get(resource)
|
23
|
+
url = URI.parse(resource)
|
24
|
+
get_request = Net::HTTP::Get.new(url.request_uri)
|
25
|
+
get_request.basic_auth(url.user, url.password)
|
26
|
+
response = Net::HTTP.start(url.host, url.port) { |http| http.request(get_request) }
|
27
|
+
if response.code.to_s != "200"
|
28
|
+
raise RemoteError, RemoteError.parse(response.body)
|
29
|
+
end
|
30
|
+
Hash.from_xml(response.body)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class MqlExecutor < SimpleDelegator
|
35
|
+
include LoaderHelper
|
36
|
+
|
37
|
+
def initialize(resource, error_handler, delegator)
|
38
|
+
super(delegator)
|
39
|
+
@uri = URI.parse(resource)
|
40
|
+
@error_handler = error_handler
|
41
|
+
@version = /(\/api\/([^\/]*))\//.match(@uri.request_uri)[2]
|
42
|
+
end
|
43
|
+
|
44
|
+
def execute_mql(mql)
|
45
|
+
from_xml_data(get(url_for(:action => "execute_mql", :query => "mql=#{mql}")))
|
46
|
+
rescue => e
|
47
|
+
@error_handler.alert(e.message)
|
48
|
+
[]
|
49
|
+
end
|
50
|
+
|
51
|
+
def can_be_cached?(mql)
|
52
|
+
from_xml_data(get(url_for(:action => "can_be_cached", :query => "mql=#{mql}")))
|
53
|
+
rescue => e
|
54
|
+
@error_handler.alert(e.message)
|
55
|
+
[]
|
56
|
+
end
|
57
|
+
|
58
|
+
def format_number_with_project_precision(number)
|
59
|
+
from_xml_data(get(url_for(:action => "format_number_to_project_precision", :query => "number=#{number}")))
|
60
|
+
rescue => e
|
61
|
+
@error_handler.alert(e.message)
|
62
|
+
[]
|
63
|
+
end
|
64
|
+
|
65
|
+
def format_date_with_project_date_format(date)
|
66
|
+
from_xml_data(get(url_for(:action => "format_string_to_date_format", :query => "date=#{date}")))
|
67
|
+
rescue => e
|
68
|
+
@error_handler.alert(e.message)
|
69
|
+
[]
|
70
|
+
end
|
71
|
+
|
72
|
+
def url_for(params)
|
73
|
+
relative_path = URI.escape("/api/#{@version}/projects/#{identifier}/cards/#{params[:action]}.xml?#{params[:query]}")
|
74
|
+
@uri.merge(relative_path).to_s
|
75
|
+
end
|
76
|
+
|
77
|
+
def from_xml_data(data)
|
78
|
+
if data.is_a?(Hash) && data.keys.size == 1
|
79
|
+
from_xml_data(data.values.first)
|
80
|
+
else
|
81
|
+
data
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|