schubert-minglr 1.2.0 → 1.3.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.
@@ -14,12 +14,6 @@ module Resources
14
14
  end
15
15
  end
16
16
 
17
- def self.find_user_id_for_user(user)
18
- if user = Resources::User.find(:all).select { |user| user.user.login == user }.first
19
- user.user_id
20
- end
21
- end
22
-
23
17
  end
24
18
 
25
19
  end
data/minglr.gemspec CHANGED
@@ -1,12 +1,12 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  Gem::Specification.new do |s|
2
4
  s.name = %q{minglr}
3
- s.version = "1.2.0"
4
-
5
- s.specification_version = 2 if s.respond_to? :specification_version=
5
+ s.version = "1.3.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Michael Schubert", "Stephen Chu", "Chris O'Meara"]
9
- s.date = %q{2009-07-26}
9
+ s.date = %q{2009-07-27}
10
10
  s.description = %q{* This gem provides two executable binaries to interact with Mingle (http://mingle.thoughtworks.com/mingle-agile-project-management) through its API. It also has sample interactive Rake task on how to facilitate easy card movements when a card enters/exits the development queue. * mtx is a binary that facilities transition changes for use on rake tasks * minglr is a more interactive tool that provides a quick interface for many common uses}
11
11
  s.email = %q{michael@schubert.cx}
12
12
  s.executables = ["mtx", "minglr"]
@@ -24,12 +24,17 @@ Gem::Specification.new do |s|
24
24
  "VERSION.yml",
25
25
  "bin/minglr",
26
26
  "bin/mtx",
27
+ "cucumber.yml",
28
+ "features/cards.feature",
29
+ "features/step_definitions/minglr_steps.rb",
30
+ "features/step_definitions/shared_steps.rb",
31
+ "features/users.feature",
27
32
  "lib/minglr.rb",
28
33
  "lib/minglr/action.rb",
29
34
  "lib/minglr/config_parser.rb",
30
35
  "lib/minglr/extensions/array.rb",
31
- "lib/minglr/input_cache.rb",
32
- "lib/minglr/mtx_options_parser.rb",
36
+ "lib/minglr/mtx/input_cache.rb",
37
+ "lib/minglr/mtx/options_parser.rb",
33
38
  "lib/minglr/options_parser.rb",
34
39
  "lib/minglr/resources/attachment.rb",
35
40
  "lib/minglr/resources/base.rb",
@@ -42,7 +47,11 @@ Gem::Specification.new do |s|
42
47
  "minglrconfig.sample",
43
48
  "tasks/commit.sample.rake",
44
49
  "tasks/svn.sample.rake",
50
+ "test/action_test.rb",
51
+ "test/commands_test.rb",
52
+ "test/config_parser_test.rb",
45
53
  "test/extensions/array_test.rb",
54
+ "test/options_parser_test.rb",
46
55
  "test/resources/attachment_test.rb",
47
56
  "test/resources/base_test.rb",
48
57
  "test/resources/card_test.rb",
@@ -51,15 +60,18 @@ Gem::Specification.new do |s|
51
60
  "test/resources/user_test.rb",
52
61
  "test/test_helper.rb"
53
62
  ]
54
- s.has_rdoc = true
55
63
  s.homepage = %q{http://github.com/schubert/minglr}
56
64
  s.post_install_message = %q{PostInstall.txt}
57
65
  s.rdoc_options = ["--charset=UTF-8"]
58
66
  s.require_paths = ["lib"]
59
- s.rubygems_version = %q{1.0.1}
67
+ s.rubygems_version = %q{1.3.5}
60
68
  s.summary = %q{command line user tool for Mingle (http://mingle.thoughtworks.com/mingle-agile-project-management)}
61
69
  s.test_files = [
62
- "test/extensions/array_test.rb",
70
+ "test/action_test.rb",
71
+ "test/commands_test.rb",
72
+ "test/config_parser_test.rb",
73
+ "test/extensions/array_test.rb",
74
+ "test/options_parser_test.rb",
63
75
  "test/resources/attachment_test.rb",
64
76
  "test/resources/base_test.rb",
65
77
  "test/resources/card_test.rb",
@@ -68,4 +80,14 @@ Gem::Specification.new do |s|
68
80
  "test/resources/user_test.rb",
69
81
  "test/test_helper.rb"
70
82
  ]
83
+
84
+ if s.respond_to? :specification_version then
85
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
86
+ s.specification_version = 3
87
+
88
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
89
+ else
90
+ end
91
+ else
92
+ end
71
93
  end
@@ -64,7 +64,7 @@ namespace :minglr do
64
64
  end
65
65
  else
66
66
  print "#{message}"
67
- if cache = InputCache.get(options[:cache_key])
67
+ if cache = MTX::InputCache.get(options[:cache_key])
68
68
  print " [#{cache}]"
69
69
  end
70
70
  print ": "
@@ -72,8 +72,8 @@ namespace :minglr do
72
72
  end
73
73
 
74
74
  if !options[:secure] && cache_key = options.delete(:cache_key)
75
- user_input = InputCache.get(cache_key) if user_input.blank?
76
- InputCache.put(cache_key, user_input)
75
+ user_input = MTX::InputCache.get(cache_key) if user_input.blank?
76
+ MTX::InputCache.put(cache_key, user_input)
77
77
  end
78
78
 
79
79
  user_input = escape(user_input)
@@ -0,0 +1,75 @@
1
+ require 'test_helper'
2
+
3
+ module Minglr
4
+
5
+ class ActionTest < Test::Unit::TestCase
6
+
7
+ context Action do
8
+
9
+ context "valid_actions" do
10
+
11
+ should "return an array of valid actions" do
12
+ valid_actions = ["users", "cards", "card", "move", "update", "attach", "projects", "create", "fetch"].sort
13
+ assert_equal [], (valid_actions - Action.valid_actions)
14
+ end
15
+
16
+ end
17
+
18
+ context "valid_action?" do
19
+
20
+ should "return true if action is a valid action" do
21
+ assert_equal true, Action.valid_action?("move")
22
+ end
23
+
24
+ should "return false if action is not a valid action" do
25
+ assert_equal false, Action.valid_action?("frobble")
26
+ end
27
+
28
+ end
29
+
30
+ context "execute" do
31
+
32
+ should "ignore the first option if no project is specified" do
33
+ action = :someaction
34
+ options = ["someaction", "option2"]
35
+ flag_options = { :foo => "bar" }
36
+ config = { :foo => "bar" }
37
+
38
+ Minglr::Action::Commands.expects(:send).with(action, ["option2"], flag_options, config)
39
+ Action.execute(action, options, flag_options, config)
40
+ end
41
+
42
+ should "ignore the first two options if project is specified" do
43
+ action = :someaction
44
+ options = ["someproject", "someaction", "option2"]
45
+ flag_options = { :foo => "bar" }
46
+ config = { :foo => "bar" }
47
+
48
+ Minglr::Action::Commands.expects(:send).with(action, ["option2"], flag_options, config)
49
+ Action.execute(action, options, flag_options, config)
50
+ end
51
+
52
+ should "send the action to commands" do
53
+ action = "someaction"
54
+ options = ["option1", "option2"]
55
+ flag_options = { :foo => "bar" }
56
+ config = { :foo => "bar" }
57
+
58
+ Minglr::Action::Commands.expects(:send).with(action, options, flag_options, config)
59
+ Action.execute(action, options, flag_options, config)
60
+ end
61
+
62
+ should "rescue and print an error if the resource can't be found" do
63
+ Action.expects(:puts).with("Failed with MyError for URL '#{Resources::Base.site}' ...")
64
+ Minglr::Action::Commands.expects(:send).raises(ActiveResource::ResourceNotFound, stub("Response", :code => "MyError"))
65
+
66
+ Action.execute("someaction", ["someaction"])
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+
73
+ end
74
+
75
+ end
@@ -0,0 +1,111 @@
1
+ require 'test_helper'
2
+
3
+ module Minglr
4
+
5
+ class CommandsTest < Test::Unit::TestCase
6
+
7
+ context Action::Commands do
8
+
9
+ setup do
10
+ @options = []
11
+ @flag_options = {}
12
+ @config = { :status_property => "cp_status", :username => "user", :password => "password" }
13
+ end
14
+
15
+ context "attach" do
16
+
17
+ should "parse card number and file number as options and call resource" do
18
+ @options << "1"
19
+ @flag_options[:file_attachment] = "file"
20
+
21
+ Resources::Attachment.expects(:attach).with("1", "file", "user", "password")
22
+ Action::Commands.attach(@options, @flag_options, @config)
23
+ end
24
+
25
+ end
26
+
27
+ context "card" do
28
+
29
+ should "parse card number and call resource" do
30
+ @options << "1"
31
+
32
+ Resources::Card.expects(:print_card).with("1", "cp_status")
33
+ Action::Commands.card(@options, @flag_options, @config)
34
+ end
35
+
36
+ end
37
+
38
+ context "cards" do
39
+
40
+ should "call resource" do
41
+ Resources::Card.expects(:print_all).with(@options, "cp_status")
42
+ Action::Commands.cards(@options, @flag_options, @config)
43
+ end
44
+
45
+ end
46
+
47
+ context "create" do
48
+
49
+ should "call resource" do
50
+ Resources::Card.expects(:create).with(@flag_options, "cp_status")
51
+ Action::Commands.create(@options, @flag_options, @config)
52
+ end
53
+
54
+ end
55
+
56
+ context "fetch" do
57
+
58
+ should "parse card number and call resource" do
59
+ @options << "1"
60
+
61
+ Resources::Attachment.expects(:fetch).with("1", "user", "password")
62
+ Action::Commands.fetch(@options, @flag_options, @config)
63
+ end
64
+
65
+ end
66
+
67
+ context "move" do
68
+
69
+ should "parse card number and call resource" do
70
+ @options << "1"
71
+
72
+ Resources::Card.expects(:move).with("1", @flag_options, @config)
73
+ Action::Commands.move(@options, @flag_options, @config)
74
+ end
75
+
76
+ end
77
+
78
+ context "projects" do
79
+
80
+ should "call resource" do
81
+ Resources::Project.expects(:print_all).with(@options, "cp_status")
82
+ Action::Commands.projects(@options, @flag_options, @config)
83
+ end
84
+
85
+ end
86
+
87
+ context "update" do
88
+
89
+ should "parse card number and call resource" do
90
+ @options << "1"
91
+
92
+ Resources::Card.expects(:update).with("1", @flag_options)
93
+ Action::Commands.update(@options, @flag_options, @config)
94
+ end
95
+
96
+ end
97
+
98
+ context "users" do
99
+
100
+ should "call resource" do
101
+ Resources::User.expects(:print_all).with(@options)
102
+ Action::Commands.users(@options, @flag_options, @config)
103
+ end
104
+
105
+ end
106
+
107
+ end
108
+
109
+ end
110
+
111
+ end
@@ -0,0 +1,113 @@
1
+ require 'test_helper'
2
+
3
+ module Minglr
4
+
5
+ class ConfigParserTest < Test::Unit::TestCase
6
+
7
+ context "parse" do
8
+
9
+ should "look for a config file in the user home directory or the current working directory" do
10
+ File.expects(:exist?).with(File.join(ENV["HOME"], ".minglrconfig"))
11
+ File.expects(:exist?).with(File.expand_path(File.join(ENV["PWD"], ".minglrconfig")))
12
+ ConfigParser.stubs(:puts)
13
+ ConfigParser.parse
14
+ end
15
+
16
+ should "return the parsed configuration as a hash" do
17
+ configuration_content = <<-EOS
18
+ [foo]
19
+ myfoo = myvalue
20
+ [bar]
21
+ mybar = yourvalue
22
+ EOS
23
+
24
+ File.stubs(:exist?).returns(true)
25
+ File.expects(:read).returns(configuration_content)
26
+ parsed_configuration = ConfigParser.parse
27
+
28
+ assert_equal Hash, parsed_configuration.class
29
+ end
30
+
31
+ should "print a message if the config file cannot be found" do
32
+ File.expects(:exist?).times(2).returns(false)
33
+ ConfigParser.expects(:puts)
34
+ ConfigParser.parse
35
+ end
36
+
37
+ end
38
+
39
+ context "initialize" do
40
+
41
+ should "parse the configuration file into sections and variables" do
42
+ configuration_content = <<-EOS
43
+ [foo]
44
+ myfoo = myvalue
45
+ [bar]
46
+ mybar = yourvalue
47
+ EOS
48
+
49
+ parsed_configuration = ConfigParser.new(configuration_content)
50
+ assert_equal true, parsed_configuration.config.has_key?(:foo)
51
+ assert_equal true, parsed_configuration.config.has_key?(:bar)
52
+ assert_equal true, parsed_configuration.config[:foo].has_key?(:myfoo)
53
+ assert_equal true, parsed_configuration.config[:bar].has_key?(:mybar)
54
+ assert_equal "myvalue", parsed_configuration.config[:foo][:myfoo]
55
+ assert_equal "yourvalue", parsed_configuration.config[:bar][:mybar]
56
+ end
57
+
58
+ should "skip comment lines" do
59
+ configuration_content = <<-EOS
60
+ # [foo]
61
+ # bar = bad
62
+ [foo]
63
+ bar = baz
64
+ EOS
65
+
66
+ parsed_configuration = ConfigParser.new(configuration_content)
67
+ assert_equal "baz", parsed_configuration.config[:foo][:bar]
68
+ end
69
+
70
+ should "skip blank lines" do
71
+ configuration_content = <<-EOS
72
+
73
+ [foo]
74
+
75
+ [babble]
76
+ bar = baz
77
+ EOS
78
+
79
+ parsed_configuration = ConfigParser.new(configuration_content)
80
+ assert_equal "baz", parsed_configuration.config[:babble][:bar]
81
+ end
82
+
83
+ should "not redefine a section if it has already been defined" do
84
+ configuration_content = <<-EOS
85
+ [foo]
86
+ bar = baz
87
+ should = bekept
88
+
89
+ [foo]
90
+ bar = somethingelse
91
+ EOS
92
+
93
+ parsed_configuration = ConfigParser.new(configuration_content)
94
+ assert_equal "somethingelse", parsed_configuration.config[:foo][:bar]
95
+ assert_equal "bekept", parsed_configuration.config[:foo][:should]
96
+ end
97
+
98
+ should "set a section variable to the latest value allowing it to be redefined" do
99
+ configuration_content = <<-EOS
100
+ [foo]
101
+ bar = baz
102
+ bar = somethingelse
103
+ EOS
104
+
105
+ parsed_configuration = ConfigParser.new(configuration_content)
106
+ assert_equal "somethingelse", parsed_configuration.config[:foo][:bar]
107
+ end
108
+
109
+ end
110
+
111
+ end
112
+
113
+ end
@@ -0,0 +1,74 @@
1
+ require 'test_helper'
2
+
3
+ module Minglr
4
+
5
+ class OptionsParserTest < Test::Unit::TestCase
6
+
7
+ context "parse" do
8
+
9
+ should "gather all property definitions for a given project" do
10
+ Resources::Base.site = "http://foo.bar"
11
+ Resources::PropertyDefinition.expects(:project_options).returns([[:column_name, "Some Column Name"]])
12
+ OptionsParser.expects(:puts)
13
+ OptionsParser.parse(["--version"])
14
+ end
15
+
16
+ should "warn about authentication if property definition gathering fails" do
17
+ Resources::Base.site = "http://foo.bar"
18
+ Resources::PropertyDefinition.expects(:project_options).raises(ActiveResource::UnauthorizedAccess, stub(:code => "BadAccess"))
19
+ OptionsParser.expects(:puts).at_least(1)
20
+ OptionsParser.expects(:puts).with("Connection Failed with BadAccess to http://foo.bar")
21
+ OptionsParser.expects(:puts).with("Did you set 'basic_authentication_enabled: true' in your auth_config.yml file?")
22
+ OptionsParser.parse(["--version"])
23
+ end
24
+
25
+ should "parse name option" do
26
+ Resources::Base.site = "http://foo.bar"
27
+ Resources::PropertyDefinition.stubs(:project_options).returns([])
28
+ options = OptionsParser.parse(["-n", "MyName"])
29
+
30
+ assert_equal true, options.has_key?(:name)
31
+ assert_equal "MyName", options[:name]
32
+ end
33
+
34
+ should "parse description option" do
35
+ Resources::Base.site = "http://foo.bar"
36
+ Resources::PropertyDefinition.stubs(:project_options).returns([])
37
+ options = OptionsParser.parse(["-d", "MyDescription"])
38
+
39
+ assert_equal true, options.has_key?(:description)
40
+ assert_equal "MyDescription", options[:description]
41
+ end
42
+
43
+ should "parse type option" do
44
+ Resources::Base.site = "http://foo.bar"
45
+ Resources::PropertyDefinition.stubs(:project_options).returns([])
46
+ options = OptionsParser.parse(["-t MyType"])
47
+
48
+ assert_equal true, options.has_key?(:card_type_name)
49
+ assert_equal "MyType", options[:card_type_name]
50
+ end
51
+
52
+ should "parse comment option" do
53
+ Resources::Base.site = "http://foo.bar"
54
+ Resources::PropertyDefinition.stubs(:project_options).returns([])
55
+ options = OptionsParser.parse(["-c MyComment"])
56
+
57
+ assert_equal true, options.has_key?(:comment)
58
+ assert_equal "MyComment", options[:comment]
59
+ end
60
+
61
+ should "parse file option" do
62
+ Resources::Base.site = "http://foo.bar"
63
+ Resources::PropertyDefinition.stubs(:project_options).returns([])
64
+ options = OptionsParser.parse(["-f MyFile"])
65
+
66
+ assert_equal true, options.has_key?(:file_attachment)
67
+ assert_equal "MyFile", options[:file_attachment]
68
+ end
69
+
70
+ end
71
+
72
+ end
73
+
74
+ end