buildmeister 2.0.6 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MGUwNjM1Y2RiNWY2Y2FjNmMzMDQwYzgxYWM5ZDhmOGQ2NmE4ZDg2Mg==
5
+ data.tar.gz: !binary |-
6
+ ZTM4ZDU5ZGU5MjM0ZjI2MTZjMGU4OTFmODQwYmJjYzZiZWRjOTJlMw==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZWZmMzM1ZTY5OGMxNzQwNjhmOWZiM2I1YTZmZTZkM2QwYjYwN2NkNTA3MDNk
10
+ NTUyYmYyYmI2MTc4NjA5NjI4OGQ5ODg4ZDRkNzMwOTM5MTM2NGIzNzBjN2Ez
11
+ NmVhNDVmYzA4NDU3Y2FiNTI4NGEwZTBlMDg2ZTAzYTJlZWIyNjM=
12
+ data.tar.gz: !binary |-
13
+ ZDJjMjE3YmY3NmI5NTEwODZkODhhOWY2MDJiMWE1ZTUwOGVkYmRjOGYxMzU4
14
+ OWU5ZDM2MzNkN2RlYWZmYmM4NjJiNTNkMTNhMWE3YzkwMGQ2NmZmZDg1YTQ2
15
+ Y2RiMGUwOGIwYjU5MDNhNmIyM2MxNzFkNDZiMTVjNzY0ZGViNWY=
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'jeweler'
6
+ gem 'rake'
7
+
8
+ group :test do
9
+ gem 'rspec', '~> 2'
10
+ gem 'mocha', require: false
11
+ gem 'fakeweb'
12
+ gem 'timecop'
13
+ gem 'rb-fsevent', require: false if RUBY_PLATFORM =~ /darwin/i
14
+ gem 'guard-rspec', '~> 4.0', require: false
15
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,115 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ buildmeister (3.0.0)
5
+ buildmeister
6
+ jeweler
7
+ rake
8
+ rest-client (~> 1.6.7)
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ addressable (2.3.5)
14
+ builder (3.2.2)
15
+ celluloid (0.15.2)
16
+ timers (~> 1.1.0)
17
+ coderay (1.0.9)
18
+ diff-lcs (1.2.4)
19
+ fakeweb (1.2.6)
20
+ faraday (0.8.8)
21
+ multipart-post (~> 1.2.0)
22
+ ffi (1.9.0)
23
+ formatador (0.2.4)
24
+ git (1.2.6)
25
+ github_api (0.10.1)
26
+ addressable
27
+ faraday (~> 0.8.1)
28
+ hashie (>= 1.2)
29
+ multi_json (~> 1.4)
30
+ nokogiri (~> 1.5.2)
31
+ oauth2
32
+ guard (2.0.5)
33
+ formatador (>= 0.2.4)
34
+ listen (~> 2.0)
35
+ lumberjack (~> 1.0)
36
+ pry (>= 0.9.12)
37
+ thor (>= 0.18.1)
38
+ guard-rspec (4.0.0)
39
+ guard (~> 2.0)
40
+ rspec (~> 2.14)
41
+ hashie (2.0.5)
42
+ highline (1.6.19)
43
+ httpauth (0.2.0)
44
+ jeweler (1.8.7)
45
+ builder
46
+ bundler (~> 1.0)
47
+ git (>= 1.2.5)
48
+ github_api (= 0.10.1)
49
+ highline (>= 1.6.15)
50
+ nokogiri (= 1.5.10)
51
+ rake
52
+ rdoc
53
+ json (1.8.0)
54
+ jwt (0.1.8)
55
+ multi_json (>= 1.5)
56
+ listen (2.0.4)
57
+ celluloid (>= 0.15.2)
58
+ rb-fsevent (>= 0.9.3)
59
+ rb-inotify (>= 0.9)
60
+ lumberjack (1.0.4)
61
+ metaclass (0.0.1)
62
+ method_source (0.8.2)
63
+ mime-types (1.25)
64
+ mocha (0.13.2)
65
+ metaclass (~> 0.0.1)
66
+ multi_json (1.7.9)
67
+ multi_xml (0.5.5)
68
+ multipart-post (1.2.0)
69
+ nokogiri (1.5.10)
70
+ oauth2 (0.9.2)
71
+ faraday (~> 0.8)
72
+ httpauth (~> 0.2)
73
+ jwt (~> 0.1.4)
74
+ multi_json (~> 1.0)
75
+ multi_xml (~> 0.5)
76
+ rack (~> 1.2)
77
+ pry (0.9.12.2)
78
+ coderay (~> 1.0.5)
79
+ method_source (~> 0.8)
80
+ slop (~> 3.4)
81
+ rack (1.5.2)
82
+ rake (10.1.0)
83
+ rb-fsevent (0.9.3)
84
+ rb-inotify (0.9.2)
85
+ ffi (>= 0.5.0)
86
+ rdoc (4.0.1)
87
+ json (~> 1.4)
88
+ rest-client (1.6.7)
89
+ mime-types (>= 1.16)
90
+ rspec (2.14.1)
91
+ rspec-core (~> 2.14.0)
92
+ rspec-expectations (~> 2.14.0)
93
+ rspec-mocks (~> 2.14.0)
94
+ rspec-core (2.14.5)
95
+ rspec-expectations (2.14.3)
96
+ diff-lcs (>= 1.1.3, < 2.0)
97
+ rspec-mocks (2.14.3)
98
+ slop (3.4.6)
99
+ thor (0.18.1)
100
+ timecop (0.3.1)
101
+ timers (1.1.0)
102
+
103
+ PLATFORMS
104
+ ruby
105
+
106
+ DEPENDENCIES
107
+ buildmeister!
108
+ fakeweb
109
+ guard-rspec (~> 4.0)
110
+ jeweler
111
+ mocha
112
+ rake
113
+ rb-fsevent
114
+ rspec (~> 2)
115
+ timecop
data/Guardfile ADDED
@@ -0,0 +1,25 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :rspec do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch(%r{^lib/lighthouse/(.+)\.rb$}) { |m| "spec/lib/lighthouse/#{m[1]}_spec.rb" }
8
+ watch('spec/spec_helper.rb') { "spec" }
9
+
10
+ # Rails example
11
+ # watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
12
+ # watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
13
+ # watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
14
+ # watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
15
+ # watch('config/routes.rb') { "spec/routing" }
16
+ # watch('app/controllers/application_controller.rb') { "spec/controllers" }
17
+
18
+ # Capybara features specs
19
+ watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
20
+
21
+ # Turnip features and steps
22
+ watch(%r{^spec/acceptance/(.+)\.feature$})
23
+ watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
24
+ end
25
+
data/Rakefile CHANGED
@@ -1,21 +1,21 @@
1
1
  # -*- ruby -*-
2
2
 
3
3
  require 'rubygems'
4
- require 'hoe'
5
4
  require './lib/buildmeister.rb'
6
5
 
7
6
  begin
8
7
  require 'jeweler'
9
8
  Jeweler::Tasks.new do |s|
10
- s.name = "buildmeister"
9
+ s.name = "buildmeister"
11
10
  s.executables = ["buildmeister", "git_cleanup"]
12
- s.summary = "Dead simple tools for managing Lighthouse and Git deployment workflow"
13
- s.email = "lcaplan@onehub.com"
14
- s.homepage = "http://github.com/onehub/buildmeister"
11
+ s.summary = "Dead simple tools for managing Lighthouse and Git deployment workflow"
12
+ s.email = "lcaplan@onehub.com"
13
+ s.homepage = "http://github.com/onehub/buildmeister"
15
14
  s.description = "Dead simple tools for managing Lighthouse and Git deployment workflow"
16
- s.authors = ["Leigh Caplan"]
17
- s.add_dependency 'lighthouse', '~> 2.1'
18
- s.files = FileList["[A-Z]*", "{bin,generators,lib,spec}/**/*"]
15
+ s.authors = ["Leigh Caplan"]
16
+ s.files = FileList["[A-Z]*", "{bin,generators,lib,spec}/**/*"]
17
+
18
+ s.add_dependency 'rest-client', '~> 1.6.7'
19
19
  end
20
20
  rescue LoadError
21
21
  puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.6
1
+ 3.0.0
data/bin/buildmeister CHANGED
@@ -3,7 +3,7 @@
3
3
  require File.expand_path(File.dirname(__FILE__) + "/../lib/buildmeister")
4
4
 
5
5
  begin
6
- bm = Buildmeister::Base.new(*ARGV.dup)
6
+ bm = Buildmeister::Launcher.launch(*ARGV.dup)
7
7
  bm.go!
8
8
  rescue Interrupt => i
9
9
  if bm.command == 'notify'
data/lib/buildmeister.rb CHANGED
@@ -1,14 +1,18 @@
1
1
  require 'rubygems'
2
- require 'lighthouse'
3
- require 'active_support'
2
+ require 'rest-client'
4
3
 
5
4
  $: << File.dirname(__FILE__)
6
5
 
7
6
  require 'buildmeister/core_ext'
7
+ require 'buildmeister/json_utils'
8
8
  require 'buildmeister/string_utils'
9
9
  require 'buildmeister/git_utils'
10
10
  require 'buildmeister/finder'
11
11
  require 'buildmeister/base'
12
- require 'buildmeister/notifier'
13
12
  require 'buildmeister/project'
13
+ require 'buildmeister/notifier'
14
14
  require 'buildmeister/bin'
15
+ require 'lighthouse/account'
16
+ require 'lighthouse/project'
17
+ require 'lighthouse/bin'
18
+ require 'lighthouse/ticket'
@@ -1,18 +1,10 @@
1
1
  require 'optparse'
2
+ require 'yaml'
2
3
 
3
4
  module Buildmeister
4
- class Base
5
- include StringUtils
6
- include GitUtils
7
-
8
- RETRY_COUNT = 5
9
-
10
- attr_accessor :projects, :notification_interval, :command, :args
11
-
12
- def initialize(*args)
13
- self.args = args
14
-
15
- @options = {:mode => :verbose}
5
+ class Launcher
6
+ def self.launch(*args)
7
+ @options = {:mode => :verbose}
16
8
 
17
9
  OptionParser.new do |opts|
18
10
  opts.banner = "Usage: buildmeister notify"
@@ -37,22 +29,45 @@ module Buildmeister
37
29
  @options[:bin_name] = p
38
30
  end
39
31
 
32
+ opts.on('-c', '--compare-branch BRANCH', 'Compare From Branch') do |c|
33
+ @options[:compare_branch] = c || 'master'
34
+ end
35
+
40
36
  opts.on_tail("-h", "--help", "Show this message") do
41
37
  puts opts
42
- exit
38
+ exit_app
43
39
  end
44
40
 
45
41
  if args.empty?
46
42
  puts opts
47
- exit
43
+ exit_app
48
44
  end
49
45
  end.parse!(args)
50
46
 
47
+ @options[:command] = args.shift
48
+
49
+ Base.new(@options)
50
+ end
51
+
52
+ def self.exit_app
53
+ exit
54
+ end
55
+ end
56
+
57
+ class Base
58
+ include StringUtils
59
+ include GitUtils
60
+
61
+ RETRY_COUNT = 5
62
+
63
+ attr_accessor :projects, :notification_interval, :command, :args
64
+
65
+ def initialize(options = {})
66
+ @options = options
67
+
51
68
  # Lighthouse setup
52
- @config = Buildmeister::Base.load_config
53
-
54
- Lighthouse.account = @config['account']
55
- Lighthouse.token = @config['token']
69
+ @config = Buildmeister::Base.load_config
70
+ @account = Lighthouse::Account.new(@config['account'], @config['token'])
56
71
 
57
72
  self.projects = []
58
73
 
@@ -60,17 +75,17 @@ module Buildmeister
60
75
 
61
76
  if @options[:project]
62
77
  @config['projects'] = @config['projects'].select { |p| p['name'] == @options[:project] }
63
- raise "#{@options[:project]} did not match any projects in the config file" if @config['projects'].blank?
78
+ raise "#{@options[:project]} did not match any projects in the config file" if (@config['projects'] || []).empty?
64
79
  end
65
80
 
66
- @config['projects'].each do |project|
67
- self.projects << Buildmeister::Project.new(project, @options)
81
+ @config['projects'].each do |project_name|
82
+ self.projects << Buildmeister::Project.new(project_name, @account, @options)
68
83
  end
69
84
 
70
85
  self.notification_interval = @config['notification_interval']
71
86
 
72
87
  # Did we pass in a command?
73
- self.command = args.shift
88
+ self.command = options[:command]
74
89
  end
75
90
 
76
91
  def go!
@@ -105,7 +120,7 @@ module Buildmeister
105
120
  @force = false
106
121
  end
107
122
 
108
- sleep notification_interval.minutes.to_i
123
+ sleep notification_interval * 60
109
124
 
110
125
  refresh!
111
126
 
@@ -168,7 +183,7 @@ module Buildmeister
168
183
  def list_staged_tickets
169
184
  # First, fetch origin to make sure we have all the necessary information
170
185
  system('git fetch origin')
171
- shas = `git log origin/master..HEAD --pretty=format:%H`.split
186
+ shas = `git log origin/#{@options[:compare_branch]}..HEAD --pretty=format:%H`.split
172
187
 
173
188
  # Generate an array of arrays - the inner array lists all branches that contain
174
189
  # each of the SHAs listed above
@@ -1,10 +1,13 @@
1
1
  # Wraps Lighthouse::Bin and keeps track of state
2
+ require 'forwardable'
2
3
 
3
4
  module Buildmeister
4
5
  class Bin
5
6
  attr_accessor :bin, :mode, :value, :last_value, :annotations
7
+
8
+ extend Forwardable
6
9
 
7
- delegate :name, :tickets, :to => :bin
10
+ delegate [:name, :tickets] => :bin
8
11
 
9
12
  def initialize(lighthouse_bin, mode = :verbose, options = {})
10
13
  self.bin = lighthouse_bin
@@ -20,7 +23,7 @@ module Buildmeister
20
23
  case mode
21
24
  when :verbose
22
25
  self.value = bin.tickets.map do |tkt|
23
- str = "#{tkt.id}"
26
+ str = "#{tkt.id}"
24
27
  annotations.each do |tag_name, identifier|
25
28
  str << identifier if tkt.tags.include?(tag_name)
26
29
  end
@@ -39,4 +42,4 @@ module Buildmeister
39
42
  value != last_value
40
43
  end
41
44
  end
42
- end
45
+ end
@@ -1,7 +1,15 @@
1
1
  module Buildmeister
2
2
  module Finder
3
3
  def named(name)
4
- find { |e| e.name == name}
4
+ find_where(name: name)
5
+ end
6
+
7
+ def find_where(attrs)
8
+ find do |o|
9
+ attrs.all? do |name, value|
10
+ o.send(name) == value
11
+ end
12
+ end
5
13
  end
6
14
  end
7
- end
15
+ end
@@ -0,0 +1,9 @@
1
+ require 'json'
2
+
3
+ module Buildmeister
4
+ module JSONTools
5
+ def with_json_response(json, &block)
6
+ yield JSON.parse(json)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'json'
2
+
3
+ module Buildmeister
4
+ module JSONUtils
5
+ def with_json_response(json, &block)
6
+ yield JSON.parse(json)
7
+ end
8
+ end
9
+ end
@@ -4,13 +4,13 @@ module Buildmeister
4
4
 
5
5
  attr_accessor :project, :name, :bins
6
6
 
7
- def initialize(config, options = {})
7
+ def initialize(config, lighthouse_account, options = {})
8
8
  self.name = config['name']
9
9
  self.bins = []
10
10
 
11
11
  bins.extend Finder
12
12
 
13
- self.project = Lighthouse::Project.find(:all).find { |p| p.name == self.name }
13
+ self.project = lighthouse_account.projects.named(name)
14
14
 
15
15
  project_bins = project.bins
16
16
 
@@ -0,0 +1,45 @@
1
+ require 'json'
2
+
3
+ module Lighthouse
4
+ class Account
5
+ include Buildmeister::JSONUtils
6
+
7
+ attr_accessor :name, :token, :resource
8
+
9
+ def initialize(name, token)
10
+ @name = name
11
+ @token = token
12
+
13
+ @url = "https://#{name}.lighthouseapp.com"
14
+
15
+ @resource = create_resource(@url, @token)
16
+ end
17
+
18
+ def projects
19
+ with_json_response( projects_resource.get(accept: 'json') ) do |response|
20
+ response['projects'].map do |p|
21
+ attrs = p['project']
22
+ id = attrs['id']
23
+
24
+ Lighthouse::Project.new(resource["projects/#{id}"], attrs)
25
+ end.tap { |p| p.extend Buildmeister::Finder }
26
+ end
27
+ end
28
+
29
+ def find_projects(*names)
30
+ projects.select { |p| names.include?(p.name) }
31
+ end
32
+
33
+ private
34
+
35
+ def projects_resource
36
+ @projects_resource ||= resource['projects']
37
+ end
38
+
39
+ def create_resource(url, token)
40
+ headers = {'X-LighthouseToken' => token}
41
+
42
+ RestClient::Resource.new(url, headers: headers)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,22 @@
1
+ module Lighthouse
2
+ class Bin
3
+ include Buildmeister::JSONUtils
4
+
5
+ attr_reader :id, :name, :query, :tickets_count
6
+
7
+ def initialize(project, attrs)
8
+ @project = project
9
+
10
+ @name = attrs['name']
11
+ @id = attrs['id']
12
+ @query = attrs['query']
13
+
14
+ @tickets_count = attrs['tickets_count']
15
+ end
16
+
17
+ def tickets
18
+ @project.tickets(@query)
19
+ end
20
+ end
21
+ end
22
+
@@ -0,0 +1,93 @@
1
+ module Lighthouse
2
+ class Project
3
+ include Buildmeister::StringUtils
4
+ include Buildmeister::JSONUtils
5
+
6
+ attr_accessor :id, :name, :resource
7
+
8
+ def initialize(resource, attributes)
9
+ @id = attributes['id']
10
+ @name = attributes['name']
11
+
12
+ @resource = resource
13
+
14
+ # self.bins = []
15
+
16
+ # bins.extend Finder
17
+
18
+ # project_bins = bins
19
+
20
+ # config['bins'].each do |bin_name|
21
+ # bin = project_bins.find { |b| b.name == bin_name }
22
+ # raise "No bin named #{bin_name}" unless bin
23
+
24
+ # bins << Buildmeister::Bin.new(bin, options[:mode], :annotations => config['annotations'])
25
+ # end
26
+
27
+ # config['personal_bins'].each do |bin_name|
28
+ # bin = project_bins.find { |b| !b.shared && (b.name == bin_name) }
29
+ # raise "No bin named #{bin_name}" unless bin
30
+
31
+ # bins << Buildmeister::Bin.new(bin, options[:mode], :annotations => config['annotations'])
32
+ # end if config['personal_bins']
33
+ end
34
+
35
+ def bins
36
+ with_json_response( bins_resource.get(accept: 'json') ) do |r|
37
+ r['ticket_bins'].map do |b|
38
+ attrs = b['ticket_bin']
39
+
40
+ Lighthouse::Bin.new(self, attrs)
41
+ end
42
+ end.tap { |a| a.extend(Buildmeister::Finder) }
43
+ end
44
+
45
+ def tickets(query = "")
46
+ with_json_response( tickets_resource.get(params: {q: query}, accept: 'json') ) do |r|
47
+ (r['tickets'] || []).map do |t|
48
+ attrs = t['ticket']
49
+
50
+ Lighthouse::Ticket.new(attrs)
51
+ end
52
+ end
53
+ end
54
+
55
+ # There's no good way to do this in the Lighthouse API. This is slow, but at least it's
56
+ # easy to write.
57
+ def find_tickets(*ids)
58
+ ids.map do |id|
59
+ project.tickets(:q => id).first
60
+ end.compact
61
+ end
62
+
63
+ def display
64
+ out = ''
65
+ out << name + "\n"
66
+ out << "#{divider}\n"
67
+
68
+ bins.each do |bin|
69
+ out << bin.display + "\n"
70
+ end
71
+
72
+ out
73
+ end
74
+
75
+ def refresh!
76
+ bins.each(&:refresh!)
77
+ end
78
+
79
+ def changed?
80
+ bins.any?(&:changed?)
81
+ end
82
+
83
+ private
84
+
85
+ def bins_resource
86
+ @bins_resource ||= resource['bins']
87
+ end
88
+
89
+ def tickets_resource
90
+ @tickets_resource ||= resource['tickets']
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,15 @@
1
+ module Lighthouse
2
+ class Ticket
3
+ attr_reader :id, :name
4
+
5
+ def initialize(attrs)
6
+ @id = attrs['number']
7
+ @name = attrs['name']
8
+ @tag = attrs['tag']
9
+ end
10
+
11
+ def tags
12
+ (@tag || '').split(',')
13
+ end
14
+ end
15
+ end
@@ -1,67 +1,66 @@
1
1
  require 'spec_helper'
2
2
 
3
+
4
+ describe Buildmeister::Launcher do
5
+ it "should set quiet mode if passed -q" do
6
+ pending
7
+ b = Buildmeister::Launcher.new('-q')
8
+ b.instance_variable_get(:@options)[:mode].should == :quiet
9
+ end
10
+
11
+ it "should set move_from if passed -f" do
12
+ pending
13
+ b = Buildmeister::Launcher.new('-f', 'Cool Bin')
14
+ b.instance_variable_get(:@options)[:move_from].should == 'Cool Bin'
15
+ end
16
+
17
+ it "should set to_state if passed -t" do
18
+ pending
19
+ b = Buildmeister::Launcher.new('-t', 'staged')
20
+ b.instance_variable_get(:@options)[:to_state].should == 'staged'
21
+ end
22
+
23
+ context "passed the -p flag" do
24
+ let(:b) { Buildmeister::Launcher.new('-p', 'Macchiato') }
25
+
26
+ it "should set the project" do
27
+ pending
28
+ b.instance_variable_get(:@options)[:project].should == 'Macchiato'
29
+ end
30
+
31
+ it "should only load the specified project" do
32
+ pending
33
+ b.projects.size.should == 1
34
+ end
35
+ end
36
+ end
37
+
3
38
  describe Buildmeister::Base do
4
39
  before(:each) do
5
40
  Buildmeister::Base.stubs(:load_config).returns(load_test_config)
6
41
  @project_stub = stub(:name => 'Project', :bins => [stub(), stub()])
7
42
  Buildmeister::Project.stubs(:new).returns(@project_stub)
8
43
  end
44
+
45
+ let(:b) { Buildmeister::Base.new }
9
46
 
10
47
  describe '#new' do
11
- it "should create a new instance" do
12
- b = Buildmeister::Base.new
13
- b.should be_an_instance_of(Buildmeister::Base)
14
- end
15
-
16
- it "should set quiet mode if passed -q" do
17
- b = Buildmeister::Base.new('-q')
18
- b.instance_variable_get(:@options)[:mode].should == :quiet
19
- end
20
-
21
- it "should set move_from if passed -f" do
22
- b = Buildmeister::Base.new('-f', 'Cool Bin')
23
- b.instance_variable_get(:@options)[:move_from].should == 'Cool Bin'
24
- end
25
-
26
- it "should set to_state if passed -t" do
27
- b = Buildmeister::Base.new('-t', 'staged')
28
- b.instance_variable_get(:@options)[:to_state].should == 'staged'
29
- end
30
-
31
- context "passed the -p flag" do
32
- before(:each) do
33
- @b = Buildmeister::Base.new('-p', 'Macchiato')
34
- end
35
-
36
- it "should set the project" do
37
- @b.instance_variable_get(:@options)[:project].should == 'Macchiato'
38
- end
39
-
48
+ context "passing in a project" do
40
49
  it "should only load the specified project" do
41
- @b.projects.size.should == 1
50
+ b = Buildmeister::Base.new(project: 'Macchiato')
51
+ b.projects.size.should == 1
42
52
  end
43
53
  end
44
54
 
45
-
46
- it "should set the Lighthouse account from config" do
47
- config = load_test_config
48
- b = Buildmeister::Base.new
49
- Lighthouse.account.should == config['account']
50
- end
51
-
52
- it "should set the Lighthouse token from config" do
53
- config = load_test_config
54
- b = Buildmeister::Base.new
55
- Lighthouse.token.should == config['token']
55
+ it "should create a new instance" do
56
+ b.should be_an_instance_of(Buildmeister::Base)
56
57
  end
57
58
 
58
59
  it "should set up the projects" do
59
- b = Buildmeister::Base.new
60
60
  b.projects.should == [@project_stub, @project_stub]
61
61
  end
62
62
 
63
63
  it "should set the notification interval" do
64
- b = Buildmeister::Base.new
65
64
  b.notification_interval.should == 3
66
65
  end
67
66
  end
@@ -74,7 +73,6 @@ describe Buildmeister::Base do
74
73
  end
75
74
 
76
75
  it "should be true" do
77
- b = Buildmeister::Base.new
78
76
  b.changed?.should be_true
79
77
  end
80
78
  end
@@ -94,7 +92,7 @@ describe Buildmeister::Base do
94
92
 
95
93
  describe "title" do
96
94
  it "should look like this" do
97
- Timecop.freeze(Time.parse('1/1/2010 9am')) do
95
+ Timecop.freeze(Time.new(2010, 1, 1, 9)) do
98
96
  b = Buildmeister::Base.new
99
97
  b.title.should == 'Buildmeister: 01/01 09:00 AM'
100
98
  end
@@ -114,6 +112,4 @@ describe Buildmeister::Base do
114
112
  @b.divider("=", 5).should == '====='
115
113
  end
116
114
  end
117
-
118
-
119
115
  end
@@ -1,33 +1,33 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Buildmeister::Bin do
4
- def ticket_stubs
4
+ let(:ticket_stubs) do
5
5
  [stub('ticket_1', :id => 1), stub('ticket_2', :id => 2)]
6
6
  end
7
7
 
8
- before(:each) do
9
- Lighthouse::Bin.any_instance.stubs(:tickets).returns(ticket_stubs)
8
+ let(:bin_stub) do
9
+ stub(:tickets => ticket_stubs)
10
10
  end
11
11
 
12
12
  describe "#new" do
13
13
  it "should create a new instance" do
14
- b = Buildmeister::Bin.new(Lighthouse::Bin.new)
14
+ b = Buildmeister::Bin.new(bin_stub)
15
15
  end
16
16
 
17
17
  it "should default to verbose mode" do
18
- b = Buildmeister::Bin.new(Lighthouse::Bin.new)
18
+ b = Buildmeister::Bin.new(bin_stub)
19
19
  b.mode.should == :verbose
20
20
  end
21
21
 
22
22
  it "should refresh" do
23
23
  Buildmeister::Bin.any_instance.expects(:refresh!).once
24
- b = Buildmeister::Bin.new(Lighthouse::Bin.new)
24
+ b = Buildmeister::Bin.new(bin_stub)
25
25
  end
26
26
  end
27
27
 
28
28
  describe "#refresh!" do
29
29
  before(:each) do
30
- @b = Buildmeister::Bin.new(Lighthouse::Bin.new)
30
+ @b = Buildmeister::Bin.new(bin_stub)
31
31
  end
32
32
 
33
33
  context "in verbose mode" do
@@ -67,7 +67,7 @@ describe Buildmeister::Bin do
67
67
 
68
68
  describe "#changed?" do
69
69
  before(:each) do
70
- @b = Buildmeister::Bin.new(Lighthouse::Bin.new)
70
+ @b = Buildmeister::Bin.new(Lighthouse::Bin.new(stub(get: []), {}))
71
71
  end
72
72
 
73
73
  context "with identical values" do
@@ -102,4 +102,4 @@ describe Buildmeister::Bin do
102
102
  @b.display.should == 'The Bin: 1, 2'
103
103
  end
104
104
  end
105
- end
105
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+ require 'json'
3
+
4
+ describe Lighthouse::Account do
5
+ let(:name) { 'onehub' }
6
+ let(:token) { '12345' }
7
+ let(:account) { Lighthouse::Account.new(name, token) }
8
+
9
+ it "should have a resource" do
10
+ account.resource.should_not be_nil
11
+ end
12
+
13
+ describe "#projects" do
14
+ let(:projects_response) { File.read('spec/support/projects.json') }
15
+
16
+ before do
17
+ account.resource.stubs(:[]).returns(
18
+ stub(:get => projects_response)
19
+ )
20
+ end
21
+
22
+ it "should succeed" do
23
+ account.projects
24
+ end
25
+ end
26
+
27
+ describe "#find_projects" do
28
+ let(:projects) do
29
+ [stub(:name => 'Project1'), stub(:name => 'Project2'), stub(:name => 'Project3')]
30
+ end
31
+
32
+ before { account.stubs(:projects).returns(projects) }
33
+
34
+ it "should find the correct projects" do
35
+ result = account.find_projects('Project1', 'Project3')
36
+ result.length.should == 2
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe Lighthouse::Bin do
4
+ let(:resource) { stub() }
5
+ let(:bin) do
6
+ Lighthouse::Bin.new(resource, 'name' => 'Bin', 'id' => 1234, 'query' => 'state: resolved', 'tickets_count' => 4)
7
+ end
8
+
9
+ it "should have a name" do
10
+ bin.name.should == 'Bin'
11
+ end
12
+
13
+ it "should have an id" do
14
+ bin.id.should == 1234
15
+ end
16
+
17
+ it "should have a query" do
18
+ bin.query.should == 'state: resolved'
19
+ end
20
+
21
+ it "should have tickets_count" do
22
+ bin.tickets_count.should == 4
23
+ end
24
+
25
+ describe "#tickets" do
26
+ it "should be implemented"
27
+ end
28
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ describe Lighthouse::Project do
4
+ let(:resource) { stub(:[] => stub) }
5
+ let(:attributes) do
6
+ {'id' => '123', 'name' => 'Project'}
7
+ end
8
+ let(:project) do
9
+ Lighthouse::Project.new(resource, attributes)
10
+ end
11
+
12
+ describe "#new" do
13
+ it "should create new given a valid config" do
14
+ project.should be_an_instance_of(Lighthouse::Project)
15
+ end
16
+
17
+ it "should set the name" do
18
+ project.name.should == attributes['name']
19
+ end
20
+
21
+ it "should set the id" do
22
+ project.id.should == attributes['id']
23
+ end
24
+
25
+ it "should set the resource" do
26
+ project.resource.should == resource
27
+ end
28
+ end
29
+
30
+ describe "#bins" do
31
+ let(:bins_response) do
32
+ File.read('spec/support/bins.json')
33
+ end
34
+
35
+ before { project.stubs(:bins_resource).returns(stub(:get => bins_response)) }
36
+
37
+ it "should succeed" do
38
+ project.bins
39
+ end
40
+
41
+ it "should list the bins" do
42
+ bin = project.bins.first
43
+ bin.class.should == Lighthouse::Bin
44
+ end
45
+ end
46
+
47
+ describe "#tickets" do
48
+ let(:tickets_response) do
49
+ File.read('spec/support/tickets.json')
50
+ end
51
+
52
+ before { project.stubs(:tickets_resource).returns(stub(:get => tickets_response)) }
53
+
54
+ it "should succeed" do
55
+ project.tickets
56
+ end
57
+
58
+ it "should list the tickets" do
59
+ project.tickets.all? { |t| t.is_a?(Lighthouse::Ticket) }.should be_true
60
+ end
61
+ end
62
+
63
+ describe "#find_tickets" do
64
+ it "should be implemented"
65
+ end
66
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Lighthouse::Ticket do
4
+
5
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,14 +1,18 @@
1
- require 'spec/autorun'
1
+ Bundler.require(:default, :test)
2
+ require 'rspec/autorun'
2
3
  require 'buildmeister'
3
4
  require 'fakeweb'
4
5
  require 'timecop'
6
+ require 'mocha/api'
5
7
 
6
8
  FakeWeb.allow_net_connect = false
7
9
 
8
- Spec::Runner.configure do |config|
10
+ RSpec.configure do |config|
9
11
  config.mock_with :mocha
12
+ config.filter_run :focus => true
13
+ config.run_all_when_everything_filtered = true
10
14
  end
11
15
 
12
16
  def load_test_config
13
17
  @test_config ||= YAML.load_file(File.dirname(__FILE__) + '/../config/buildmeister_config.sample.yml')
14
- end
18
+ end
@@ -0,0 +1 @@
1
+ {"ticket_bins":[{"ticket_bin":{"default":false,"id":308918,"name":"Current","position":1,"project_id":64437,"query":"state:open not-milestone:'Someday'","shared":true,"tickets_count":105,"updated_at":"2013-10-15T14:40:42-07:00","user_id":15047,"global":false}},{"ticket_bin":{"default":false,"id":252177,"name":"Active","position":2,"project_id":64437,"query":"state:active sort:responsible","shared":true,"tickets_count":13,"updated_at":"2013-10-15T14:40:42-07:00","user_id":16400,"global":false}},{"ticket_bin":{"default":false,"id":252178,"name":"Hold","position":3,"project_id":64437,"query":"state:hold sort:responsible","shared":true,"tickets_count":6,"updated_at":"2013-10-15T14:40:42-07:00","user_id":16400,"global":false}},{"ticket_bin":{"default":false,"id":252180,"name":"Staged","position":4,"project_id":64437,"query":"state:staged sort:responsible","shared":true,"tickets_count":32,"updated_at":"2013-10-15T14:40:42-07:00","user_id":16400,"global":false}},{"ticket_bin":{"default":false,"id":252181,"name":"Verified","position":5,"project_id":64437,"query":"state:verified sort:responsible","shared":true,"tickets_count":0,"updated_at":"2013-10-15T14:40:42-07:00","user_id":16400,"global":false}},{"ticket_bin":{"default":false,"id":252182,"name":"Resolved (Recently)","position":6,"project_id":64437,"query":"state:resolved updated:\"since yesterday\" sort:milestone","shared":true,"tickets_count":2,"updated_at":"2013-10-15T14:40:42-07:00","user_id":16400,"global":false}}]}
@@ -0,0 +1 @@
1
+ {"projects":[{"project":{"archived":false,"closed_states":"resolved/66973b # You can customize colors\r\nhold/fc0 # with 3 or 6 character hex codes\r\ninvalid/c00 # 'A30' expands to 'AA3300'","created_at":"2009-02-11T16:56:39-08:00","default_assigned_user_id":null,"default_milestone_id":0,"default_ticket_text":"","description":"Bugs associated with the Airstrip / Landing pages app.","description_html":"<div><p>Bugs associated with the Airstrip / Landing pages app.</p></div>","enable_points":false,"hidden":false,"id":25331,"license":null,"name":"Airstrip","open_states":"new/f17\r\nopen/828282\r\nactive/09f # Currently bring worked on\r\nstaged/58b28d # Staged and being reviewed\r\nverified/66973b # Staged and verified\r\nhold/fc0 # Punting on or awaiting feedback","open_tickets_count":3,"oss_readonly":false,"permalink":"airstrip","points_scale":null,"public":false,"send_changesets_to_events":true,"todos_completed":{"tickets":true},"updated_at":"2013-08-29T16:56:15-07:00","open_states_list":"new,open,active,staged,verified,hold","closed_states_list":"resolved,hold,invalid"}},{"project":{"archived":false,"closed_states":"resolved/66973b\r\ninvalid/c00","created_at":"2013-10-09T11:43:37-07:00","default_assigned_user_id":16400,"default_milestone_id":0,"default_ticket_text":"","description":"Onehub.com \u2014 All grown up.","description_html":"<div><p>Onehub.com &#8212; All grown up.</p></div>","enable_points":false,"hidden":false,"id":113854,"license":null,"name":"Americano","open_states":"new/f17\r\nopen/828282\r\nactive/09f # Currently bring worked on\r\nstaged/58b28d # Staged and being reviewed\r\nverified/66973b # Staged and verified\r\nhold/fc0 # Punting on or awaiting feedback","open_tickets_count":7,"oss_readonly":false,"permalink":"americano","points_scale":null,"public":false,"send_changesets_to_events":true,"todos_completed":{"projects":true,"milestones":true,"tickets":true},"updated_at":"2013-10-14T16:46:29-07:00","open_states_list":"new,open,active,staged,verified,hold","closed_states_list":"resolved,invalid"}},{"project":{"archived":false,"closed_states":"resolved/66973b # You can customize colors\r\ninvalid/c00 # 'A30' expands to 'AA3300'","created_at":"2012-08-31T16:54:27-07:00","default_assigned_user_id":220805,"default_milestone_id":0,"default_ticket_text":"","description":"Onehub Android app.","description_html":"<div><p>Onehub Android app.</p></div>","enable_points":false,"hidden":false,"id":99396,"license":null,"name":"Android","open_states":"new/f17\r\nopen/828282\r\nactive/09f # Currently bring worked on\r\nready/f60 # Work is ready for review\r\nhold/fc0 # Punting on or awaiting feedback","open_tickets_count":12,"oss_readonly":false,"permalink":"android","points_scale":null,"public":false,"send_changesets_to_events":true,"todos_completed":{"tickets":true,"milestones":true,"projects":true},"updated_at":"2013-10-15T08:34:29-07:00","open_states_list":"new,open,active,ready,hold","closed_states_list":"resolved,invalid"}},{"project":{"archived":false,"closed_states":"resolved/66973b # Deployed to production\r\ninvalid/c00 # Unable to repro or is a duplicate","created_at":"2011-10-10T16:16:04-07:00","default_assigned_user_id":null,"default_milestone_id":null,"default_ticket_text":"","description":"A trusted name in sign-ins.","description_html":"<div><p>A trusted name in sign-ins.</p></div>","enable_points":false,"hidden":false,"id":84347,"license":null,"name":"Aperture","open_states":"new/f17\r\nopen/828282\r\nactive/09f # Currently bring worked on\r\nstaged/58b28d # Staged and being reviewed\r\nverified/66973b # Staged and verified\r\nhold/fc0 # Punting on or awaiting feedback","open_tickets_count":5,"oss_readonly":false,"permalink":"aperture","points_scale":null,"public":false,"send_changesets_to_events":true,"todos_completed":{"milestones":true,"tickets":true},"updated_at":"2013-10-11T09:53:56-07:00","open_states_list":"new,open,active,staged,verified,hold","closed_states_list":"resolved,invalid"}},{"project":{"archived":false,"closed_states":"resolved/66973b # You can customize colors\r\ninvalid/c00 # 'A30' expands to 'AA3300'","created_at":"2009-01-16T15:47:28-08:00","default_assigned_user_id":15047,"default_milestone_id":0,"default_ticket_text":"","description":"","description_html":"","enable_points":false,"hidden":false,"id":23646,"license":null,"name":"Barista","open_states":"new/f17\r\nopen/828282\r\nactive/09f # Currently bring worked on\r\nstaged/58b28d # Staged and being reviewed\r\nverified/66973b # Staged and verified\r\nhold/fc0 # Punting on or awaiting feedback","open_tickets_count":36,"oss_readonly":false,"permalink":"barista","points_scale":null,"public":false,"send_changesets_to_events":true,"todos_completed":{"tickets":true,"milestones":true},"updated_at":"2013-10-10T17:34:36-07:00","open_states_list":"new,open,active,staged,verified,hold","closed_states_list":"resolved,invalid"}},{"project":{"archived":true,"closed_states":"resolved/66973b # You can customize colors\r\ninvalid/c00 # 'A30' expands to 'AA3300'","created_at":"2008-10-13T16:10:27-07:00","default_assigned_user_id":16400,"default_milestone_id":29084,"default_ticket_text":"","description":"Onehub.com, company-wide efforts, and Marketing.","description_html":"<div><p>Onehub.com, company-wide efforts, and Marketing.</p></div>","enable_points":false,"hidden":false,"id":18236,"license":null,"name":"Cappuccino","open_states":"new/f17\r\nopen/828282\r\nactive/09f # Currently bring worked on\r\nstaged/58b28d # Staged and being reviewed\r\nverified/66973b # Staged and verified\r\nhold/fc0 # Punting on or awaiting feedback","open_tickets_count":13,"oss_readonly":false,"permalink":"cappuccino","points_scale":null,"public":false,"send_changesets_to_events":true,"todos_completed":{"tickets":true,"projects":true},"updated_at":"2013-10-14T11:09:55-07:00","open_states_list":"new,open,active,staged,verified,hold","closed_states_list":"resolved,invalid"}},{"project":{"archived":false,"closed_states":"resolved/66973b # Deployed to production\r\ninvalid/c00 # Unable to repro or is a duplicate","created_at":"2012-07-19T10:28:03-07:00","default_assigned_user_id":null,"default_milestone_id":0,"default_ticket_text":"","description":"\"Tailor Onehub Enterprise to suit your environment.\"","description_html":"<div><p>\"Tailor Onehub Enterprise to suit your environment.\"</p></div>","enable_points":false,"hidden":false,"id":97563,"license":null,"name":"Configurator","open_states":"new/f17\r\nopen/828282\r\nactive/09f # Currently bring worked on\r\nstaged/58b28d # Staged and being reviewed\r\nverified/66973b # Staged and verified\r\nhold/fc0 # Punting on or awaiting feedback","open_tickets_count":12,"oss_readonly":false,"permalink":"configurator","points_scale":null,"public":false,"send_changesets_to_events":true,"todos_completed":{"tickets":true},"updated_at":"2013-06-27T11:37:48-07:00","open_states_list":"new,open,active,staged,verified,hold","closed_states_list":"resolved,invalid"}},{"project":{"archived":false,"closed_states":"resolved/66973b # Deployed to production\r\ninvalid/c00 # Unable to repro or is a duplicate","created_at":"2010-11-18T14:22:57-08:00","default_assigned_user_id":null,"default_milestone_id":142029,"default_ticket_text":"","description":"2 Shots of Workspaces","description_html":"<div><p>2 Shots of Workspaces</p></div>","enable_points":false,"hidden":false,"id":64437,"license":null,"name":"Doppio","open_states":"new/f17\r\nopen/828282\r\nactive/09f # Currently being worked on\r\nstaged/58b28d # Staged and being reviewed\r\nverified/66973b # Verified and ready to deploy\r\nhold/fc0 # Punting on or awaiting feedback","open_tickets_count":514,"oss_readonly":false,"permalink":"doppio","points_scale":null,"public":false,"send_changesets_to_events":true,"todos_completed":{"tickets":true,"milestones":true},"updated_at":"2013-10-15T10:28:26-07:00","open_states_list":"new,open,active,staged,verified,hold","closed_states_list":"resolved,invalid"}},{"project":{"archived":false,"closed_states":"resolved/66973b # You can customize colors\r\ninvalid/c00 # 'A30' expands to 'AA3300'","created_at":"2009-09-21T16:10:43-07:00","default_assigned_user_id":null,"default_milestone_id":0,"default_ticket_text":"","description":"A managed file transfer service by Onehub\r\naka TRANSFERS","description_html":"<div><p>A managed file transfer service by Onehub<br>\naka TRANSFERS</p></div>","enable_points":false,"hidden":false,"id":37906,"license":null,"name":"Espresso","open_states":"new/f17\r\nopen/828282\r\nactive/09f # Currently bring worked on\r\nstaged/58b28d # Staged and being reviewed\r\nverified/66973b # Staged and verified\r\nhold/fc0 # Punting on or awaiting feedback","open_tickets_count":67,"oss_readonly":false,"permalink":"espresso","points_scale":null,"public":false,"send_changesets_to_events":true,"todos_completed":{"tickets":true,"milestones":true},"updated_at":"2013-10-10T16:53:06-07:00","open_states_list":"new,open,active,staged,verified,hold","closed_states_list":"resolved,invalid"}},{"project":{"archived":false,"closed_states":"resolved/66973b # You can customize colors\r\ninvalid/c00 # 'A30' expands to 'AA3300'","created_at":"2011-12-21T10:31:38-08:00","default_assigned_user_id":220805,"default_milestone_id":0,"default_ticket_text":"","description":"iOS Applications for Onehub","description_html":"<div><p>iOS Applications for Onehub</p></div>","enable_points":false,"hidden":false,"id":88129,"license":null,"name":"iOS","open_states":"new/f17\r\nopen/828282\r\nactive/09f # Currently bring worked on\r\nready/f60 # Work is ready for review\r\nhold/fc0 # Punting on or awaiting feedback","open_tickets_count":10,"oss_readonly":false,"permalink":"ios","points_scale":null,"public":false,"send_changesets_to_events":true,"todos_completed":{"tickets":true,"projects":true,"milestones":true},"updated_at":"2013-10-15T08:25:09-07:00","open_states_list":"new,open,active,ready,hold","closed_states_list":"resolved,invalid"}},{"project":{"archived":false,"closed_states":"resolved/66973b # Deployed to production\r\ninvalid/c00 # Unable to repro or is a duplicate","created_at":"2008-04-20T14:57:27-07:00","default_assigned_user_id":null,"default_milestone_id":28596,"default_ticket_text":"","description":"An online collaboration service by Onehub\r\naka WORKSPACES","description_html":"<div><p>An online collaboration service by Onehub<br>\naka WORKSPACES</p></div>","enable_points":false,"hidden":false,"id":10239,"license":null,"name":"Macchiato","open_states":"new/f17\r\nopen/828282\r\nactive/09f # Currently bring worked on\r\nstaged/58b28d # Staged and being reviewed\r\nverified/66973b # Staged and verified\r\nhold/fc0 # Punting on or awaiting feedback","open_tickets_count":398,"oss_readonly":false,"permalink":"macchiato","points_scale":null,"public":false,"send_changesets_to_events":true,"todos_completed":{"tickets":true,"milestones":true,"projects":true},"updated_at":"2013-10-11T14:34:00-07:00","open_states_list":"new,open,active,staged,verified,hold","closed_states_list":"resolved,invalid"}},{"project":{"archived":true,"closed_states":"resolved/66973b # You can customize colors\r\nhold/fc0 # with 3 or 6 character hex codes\r\ninvalid/c00 # 'A30' expands to 'AA3300'","created_at":"2009-09-13T13:37:01-07:00","default_assigned_user_id":null,"default_milestone_id":null,"default_ticket_text":"","description":"All issues related to the production and maintenance of the Workspace.me website.","description_html":"<div><p>All issues related to the production and maintenance of the\nWorkspace.me website.</p></div>","enable_points":false,"hidden":false,"id":37374,"license":null,"name":"Workspace.me","open_states":"new/f17\r\nopen/828282\r\nactive/09f # Currently bring worked on\r\nready/f60 # Fixed and ready to be staged\r\nstaged/58b28d # Staged and being reviewed\r\nverified/66973b # Staged and verified","open_tickets_count":2,"oss_readonly":false,"permalink":"workspaceme","points_scale":null,"public":false,"send_changesets_to_events":true,"todos_completed":null,"updated_at":"2012-11-19T12:29:54-08:00","open_states_list":"new,open,active,ready,staged,verified","closed_states_list":"resolved,hold,invalid"}}]}
@@ -0,0 +1 @@
1
+ {"tickets":[{"ticket":{"assigned_user_id":34520,"attachments_count":0,"closed":false,"created_at":"2013-10-14T10:32:20-07:00","creator_id":34520,"importance":0,"milestone_due_on":null,"milestone_id":142029,"milestone_order":9999,"number":3779,"permalink":"users-cant-update-their-address","project_id":64437,"raw_data":null,"spam":false,"state":"verified","tag":null,"title":"Users can't update their address","updated_at":"2013-10-15T16:23:14-07:00","user_id":34520,"version":10,"watchers_ids":[34520],"user_name":"Brandon Caplan","creator_name":"Brandon Caplan","assigned_user_name":"Brandon Caplan","url":"http://onehub.lighthouseapp.com/projects/64437/tickets/3779","milestone_title":"Someday","priority":9999,"original_body":"They can add one, but cannot change it.","latest_body":"They can add one, but cannot change it.","original_body_html":"<div><p>They can add one, but cannot change it.</p></div>","state_color":"66973b"}},{"ticket":{"assigned_user_id":17763,"attachments_count":0,"closed":false,"created_at":"2013-10-15T13:36:20-07:00","creator_id":17763,"importance":0,"milestone_due_on":"2013-01-01T00:00:00-08:00","milestone_id":168932,"milestone_order":9999,"number":3782,"permalink":"ip_address-is-not-correct-when-checking-if-assets-are-dangling","project_id":64437,"raw_data":null,"spam":false,"state":"new","tag":null,"title":"IP_ADDRESS is not correct when checking if assets are dangling","updated_at":"2013-10-15T13:36:22-07:00","user_id":17763,"version":1,"watchers_ids":[34520,17763],"user_name":"Brian Moran","creator_name":"Brian Moran","assigned_user_name":"Brian Moran","url":"http://onehub.lighthouseapp.com/projects/64437/tickets/3782","milestone_title":"Maintenance","priority":9999,"original_body":"Bug Description.","latest_body":"Bug Description.","original_body_html":"<div><p>Bug Description.</p></div>","state_color":"ff1177"}},{"ticket":{"assigned_user_id":16400,"attachments_count":0,"closed":false,"created_at":"2013-10-15T12:44:21-07:00","creator_id":16400,"importance":0,"milestone_due_on":"2013-11-01T00:00:00-07:00","milestone_id":186450,"milestone_order":9999,"number":13,"permalink":"improve-the-grid-settings","project_id":113854,"raw_data":null,"spam":false,"state":"active","tag":null,"title":"Improve the grid settings","updated_at":"2013-10-15T12:44:25-07:00","user_id":16400,"version":1,"watchers_ids":[16400],"user_name":"Matthew Anderson","creator_name":"Matthew Anderson","assigned_user_name":"Matthew Anderson","url":"http://onehub.lighthouseapp.com/projects/113854/tickets/13","milestone_title":"Launch","priority":9999,"original_body":"Defaults at each breakpoint?","latest_body":"Defaults at each breakpoint?","original_body_html":"<div><p>Defaults at each breakpoint?</p></div>","state_color":"09f"}}]}
metadata CHANGED
@@ -1,47 +1,83 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: buildmeister
3
- version: !ruby/object:Gem::Version
4
- hash: 3
5
- prerelease:
6
- segments:
7
- - 2
8
- - 0
9
- - 6
10
- version: 2.0.6
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.0.0
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Leigh Caplan
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2013-02-08 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- version_requirements: &id001 !ruby/object:Gem::Requirement
22
- none: false
23
- requirements:
24
- - - ~>
25
- - !ruby/object:Gem::Version
26
- hash: 1
27
- segments:
28
- - 2
29
- - 1
30
- version: "2.1"
31
- requirement: *id001
11
+ date: 2013-10-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: buildmeister
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
32
21
  prerelease: false
33
- name: lighthouse
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: jeweler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
34
  type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rest-client
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.6.7
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 1.6.7
35
69
  description: Dead simple tools for managing Lighthouse and Git deployment workflow
36
70
  email: lcaplan@onehub.com
37
- executables:
71
+ executables:
38
72
  - buildmeister
39
73
  - git_cleanup
40
74
  extensions: []
41
-
42
- extra_rdoc_files:
75
+ extra_rdoc_files:
43
76
  - README.rdoc
44
- files:
77
+ files:
78
+ - Gemfile
79
+ - Gemfile.lock
80
+ - Guardfile
45
81
  - History.txt
46
82
  - README.rdoc
47
83
  - Rakefile
@@ -54,47 +90,48 @@ files:
54
90
  - lib/buildmeister/core_ext.rb
55
91
  - lib/buildmeister/finder.rb
56
92
  - lib/buildmeister/git_utils.rb
93
+ - lib/buildmeister/json_tools.rb
94
+ - lib/buildmeister/json_utils.rb
57
95
  - lib/buildmeister/notifier.rb
58
96
  - lib/buildmeister/project.rb
59
97
  - lib/buildmeister/string_utils.rb
60
98
  - lib/git_cleanup.rb
99
+ - lib/lighthouse/account.rb
100
+ - lib/lighthouse/bin.rb
101
+ - lib/lighthouse/project.rb
102
+ - lib/lighthouse/ticket.rb
61
103
  - spec/buildmeister/base_spec.rb
62
104
  - spec/buildmeister/bin_spec.rb
63
- - spec/buildmeister/project_spec.rb
105
+ - spec/lighthouse/account_spec.rb
106
+ - spec/lighthouse/bin_spec.rb
107
+ - spec/lighthouse/project_spec.rb
108
+ - spec/lighthouse/ticket_spec.rb
64
109
  - spec/spec.opts
65
110
  - spec/spec_helper.rb
111
+ - spec/support/bins.json
112
+ - spec/support/projects.json
113
+ - spec/support/tickets.json
66
114
  homepage: http://github.com/onehub/buildmeister
67
115
  licenses: []
68
-
116
+ metadata: {}
69
117
  post_install_message:
70
118
  rdoc_options: []
71
-
72
- require_paths:
119
+ require_paths:
73
120
  - lib
74
- required_ruby_version: !ruby/object:Gem::Requirement
75
- none: false
76
- requirements:
77
- - - ">="
78
- - !ruby/object:Gem::Version
79
- hash: 3
80
- segments:
81
- - 0
82
- version: "0"
83
- required_rubygems_version: !ruby/object:Gem::Requirement
84
- none: false
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- hash: 3
89
- segments:
90
- - 0
91
- version: "0"
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
92
131
  requirements: []
93
-
94
132
  rubyforge_project:
95
- rubygems_version: 1.8.24
133
+ rubygems_version: 2.1.8
96
134
  signing_key:
97
- specification_version: 3
135
+ specification_version: 4
98
136
  summary: Dead simple tools for managing Lighthouse and Git deployment workflow
99
137
  test_files: []
100
-
@@ -1,84 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'Buildmeister::Project' do
4
- def valid_config
5
- @valid_config ||= load_test_config['projects'].first
6
- end
7
-
8
- def project_stub
9
- stub(:name => valid_config['name'], :bins => valid_config['bins'].map { |b| stub({:name => b}) })
10
- end
11
-
12
- before(:each) do
13
- Lighthouse::Project.stubs(:find).returns([project_stub])
14
- @p = Buildmeister::Project.new(valid_config)
15
- end
16
-
17
- describe "#new" do
18
- it "should create new given a valid config" do
19
- @p.should be_an_instance_of(Buildmeister::Project)
20
- end
21
-
22
- it "should set the name" do
23
- @p.name.should == valid_config['name']
24
- end
25
-
26
- it "should set the project" do
27
- @p.project
28
- end
29
-
30
- it "should set up the appropriate number of bins" do
31
- @p.should have(valid_config['bins'].size).bins
32
- end
33
-
34
- it "should set up Buildmeister::Bin objects" do
35
- @p.bins.all? { |b| b.is_a?(Buildmeister::Bin) }.should be_true
36
- end
37
-
38
- it "should keep bins in order" do
39
- @p.bins.map(&:name).should == ['Ready', 'Staged', 'Verified', 'Ready (Experimental)', 'Staged (Experimental)']
40
- end
41
- end
42
-
43
- describe "#changed?" do
44
- context "with changed bins" do
45
- before(:each) do
46
- @p.bins.each { |b| b.stubs(:changed?).returns(true) }
47
- end
48
-
49
- it "should be true" do
50
- @p.changed?.should be_true
51
- end
52
- end
53
-
54
- context "with no changed bins" do
55
- before(:each) do
56
- @p.bins.each { |b| b.stubs(:changed?).returns(false) }
57
- end
58
-
59
- it "should be false" do
60
- @p.changed?.should be_false
61
- end
62
- end
63
- end
64
-
65
- describe "#bins" do
66
- it "should search using named" do
67
- @p.bins.named('Ready').should be_an_instance_of(Buildmeister::Bin)
68
- end
69
- end
70
-
71
- describe "#display" do
72
- it "should display the bins" do
73
- @p.display.should == <<-STRING_CHEESE
74
- Macchiato
75
- ----------
76
- Ready:
77
- Staged:
78
- Verified:
79
- Ready (Experimental):
80
- Staged (Experimental):
81
- STRING_CHEESE
82
- end
83
- end
84
- end