obeya 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 22b1e139ffc2d08751922cfa5e1b0e6109f40ca5
4
- data.tar.gz: 1fea464b707b6589b01d4e84d78d7fe846ee61df
3
+ metadata.gz: 7adf220c51ab91d183c62813d1f3216403d01617
4
+ data.tar.gz: 9c0be6e00be9d76b5bda6b58f598485f06430d3b
5
5
  SHA512:
6
- metadata.gz: bbf64ea647f26fe67b1c31165317c7041006c465f00d985aaa15993f1c4af854375685343a29aff9bdba3f6f14db7396bef9e544aaf7805871ac4e1fdc8c66c1
7
- data.tar.gz: 51b8cc2d62462e2c050a8020f0d40e9d909f33e15014c42090b45e133c041c87fa9eaee244442f0c9b8421544a628fff346ce3689232ce84d0df029a581ee13c
6
+ metadata.gz: 02e81e3735dc745d00a23751994c457be0fbe5f45598b624c1e6db03a91ce8b8d959a1e40eedcb699133f108ee425072da6dc4fc63cdf8dbdb6df7fd8da8e182
7
+ data.tar.gz: c25e312da1575753610a282f46ca1f6eb0ddae3617ecbc0c8d41949f6baa2619dd9c82d9935ccb3d60310e2433247fd3bada0ac13d1e4379217cd2b900984942
data/.gitignore CHANGED
@@ -10,3 +10,7 @@
10
10
  .ruby-version
11
11
  .ruby-gemset
12
12
  /_ignore
13
+ .idea/
14
+
15
+ # Ignore company specific test config
16
+ test/integration/obeya_config.rb
data/CHANGELOG.md CHANGED
@@ -3,3 +3,10 @@
3
3
  ## 0.1.0 (not yet released)
4
4
 
5
5
  * initial copy from the `investapp`
6
+
7
+ ## 0.2.0
8
+
9
+ * Support the ability to retrieve all tickets for a bin, and to run a matcher through this
10
+ * Support custom fields on ticket
11
+ * Add an integration test (site configured)
12
+
data/lib/obeya.rb CHANGED
@@ -1,8 +1,8 @@
1
- require "obeya/version"
2
- require "obeya/bin"
3
- require "obeya/ticket_type"
4
- require "obeya/ticket"
5
- require "obeya/client"
1
+ require_relative "obeya/version"
2
+ require_relative "obeya/bin"
3
+ require_relative "obeya/ticket_type"
4
+ require_relative "obeya/ticket"
5
+ require_relative "obeya/client"
6
6
 
7
7
  module Obeya
8
8
  # Your code goes here...
data/lib/obeya/client.rb CHANGED
@@ -1,37 +1,58 @@
1
1
  require 'faraday'
2
2
  require 'faraday_middleware'
3
+ require 'date'
3
4
 
4
5
  module Obeya
5
6
  class Client
6
7
 
7
8
  OBEYA_ROOT_URL = "https://beta.getobeya.com"
9
+ CUSTOM_FIELD_TYPES = [::NilClass, ::String, ::Float, ::Integer, ::Array, ::Date]
8
10
 
9
- def initialize(company_id, username, password)
11
+ def initialize(company_id, username, password, logger=nil)
10
12
  @company_id = company_id
11
13
  @username = username
12
14
  @password = password
15
+ @logger = logger
16
+
17
+ @bin_tickets = {}
13
18
  end
14
19
 
15
- def create_ticket(title, description, format: 'text', ticket_type_name: 'Bug', bin_name: /please panic/i)
16
- ticket = Ticket.new(
17
- title,
18
- description,
19
- format,
20
- ticket_type(ticket_type_name),
21
- bin(bin_name)
20
+ def create_ticket(title, description, format: 'text', ticket_type_name: 'bug', bin_name: /please panic/i, **others)
21
+ ticket = Ticket.new({
22
+ title: title,
23
+ description: description,
24
+ format: format,
25
+ ticket_type: ticket_type(ticket_type_name),
26
+ bin: bin(bin_name) }.
27
+ merge(others)
22
28
  )
23
29
 
24
- response = post("/tickets/#{next_ticket_id}", ticket.to_json)
30
+ ticket_to_json = ticket.to_json(custom_field_name_map)
31
+ response = post("/tickets/#{next_ticket_id}", ticket_to_json)
25
32
  case response.status
26
33
  when 200..299
27
34
  true
28
35
  else
29
- puts "status: #{response.status}"
30
- puts " #{response.inspect}"
36
+ log_warn "status: #{response.status}"
37
+ log_warn " #{response.inspect}"
31
38
  false
32
39
  end
33
40
  end
34
41
 
42
+ def update_ticket(id, other_fields)
43
+ ticket = Ticket.new(other_fields)
44
+
45
+ response = put("/tickets/#{id}", ticket.to_json(custom_field_name_map, true))
46
+ case response.status
47
+ when 200..299
48
+ true
49
+ else
50
+ log_warn "status: #{response.status}"
51
+ log_warn " #{response.inspect}"
52
+ false
53
+ end
54
+ end
55
+
35
56
  def bin(name_or_regex)
36
57
  case name_or_regex
37
58
  when String
@@ -66,8 +87,54 @@ module Obeya
66
87
  end
67
88
  end
68
89
 
90
+ def tickets_in_named_bin(bin_name)
91
+ named_bin = bin(bin_name)
92
+ raise "Bin #{bin_name} not found" unless named_bin
93
+ tickets_in_bin(named_bin.id)
94
+ end
95
+
96
+ def tickets_in_bin(bin_id)
97
+ ticket_type_map = Hash[ticket_types.map { |t| [t.id, t] }]
98
+ bin_map = Hash[bins.map { |b| [b.id, b] }]
99
+
100
+ @bin_tickets[bin_id] ||= begin
101
+ get("/tickets?bin_id=#{bin_id}").map do |ticket_data|
102
+ Ticket.from_obeya(ticket_data, ticket_type_map, bin_map, custom_fields)
103
+ end
104
+ end
105
+ end
106
+
107
+ def matching_tickets_in_named_bin(bin_name, title_matcher)
108
+ named_bin = bin(bin_name)
109
+ raise "Bin #{bin_name} not found" unless named_bin
110
+ matching_tickets_in_bin(named_bin.id, title_matcher)
111
+ end
112
+
113
+ def matching_tickets_in_bin(bin_id, title_matcher)
114
+ tickets = tickets_in_bin(bin_id)
115
+ case title_matcher
116
+ when String
117
+ tickets.select { |t| t.title == title_matcher }
118
+ when Regexp
119
+ tickets.select { |t| t.title =~ title_matcher }
120
+ end
121
+ end
122
+
123
+ # Get custom fields as a hash of id => {id, name, type}
124
+ def custom_fields
125
+ @custom_fields ||= begin
126
+ Hash[get('/custom-fields').map do |cf|
127
+ [cf['_id'], { id: cf['_id'], name: cf['name'], type: CUSTOM_FIELD_TYPES[cf['type'].to_i] }]
128
+ end]
129
+ end
130
+ end
131
+
69
132
  private
70
133
 
134
+ def custom_field_name_map
135
+ @custom_field_name_map ||= Hash[custom_fields.values.map {|v| [v[:name], v] }]
136
+ end
137
+
71
138
  def next_ticket_id
72
139
  get('/ids?amount=1')[0]
73
140
  end
@@ -77,7 +144,7 @@ module Obeya
77
144
  request.headers.update({ accept: 'application/json', content_type: 'application/json' })
78
145
  end
79
146
  unless response.success?
80
- raise("Obeya #{api_path} call failsed")
147
+ raise("Obeya #{api_path} call failed")
81
148
  end
82
149
  JSON.parse(response.body)
83
150
  end
@@ -88,6 +155,12 @@ module Obeya
88
155
  end
89
156
  end
90
157
 
158
+ def put(api_path, json)
159
+ faraday.put("/rest/1/#{@company_id}#{api_path}", json) do |request|
160
+ request.headers.update({ accept: 'application/json', content_type: 'application/json' })
161
+ end
162
+ end
163
+
91
164
  def faraday
92
165
  @faraday ||= Faraday.new(OBEYA_ROOT_URL).tap do |connection|
93
166
  connection.basic_auth(@username, @password)
@@ -95,5 +168,9 @@ module Obeya
95
168
  end
96
169
  end
97
170
 
171
+ def log_warn(s)
172
+ @logger.warn(s) if @logger
173
+ end
174
+
98
175
  end
99
176
  end
data/lib/obeya/ticket.rb CHANGED
@@ -1,22 +1,111 @@
1
1
  module Obeya
2
2
  class Ticket
3
3
 
4
- def initialize(title, description, format, ticket_type, bin)
5
- @title = title
6
- @description = description
7
- @format = format
8
- @ticket_type = ticket_type
9
- @bin = bin
10
- end
11
-
12
- def to_json
13
- {
14
- "name": @title,
15
- "rtformat": @format,
16
- "description": normalise(@description),
17
- "bin_id": @bin.id,
18
- "ticketType_id": @ticket_type.id
19
- }.to_json
4
+ # title, description, format, ticket_type, bin, id=nil
5
+ def initialize(*params)
6
+ if params.first.is_a?(Hash)
7
+ @ticket_fields = params.first
8
+ else
9
+ @ticket_fields = {}
10
+ [:title, :description, :format, :ticket_type, :bin, :id].each_with_index do |param_key, idx|
11
+ break if idx>=params.size
12
+ @ticket_fields[param_key] = params[idx]
13
+ end
14
+ end
15
+ end
16
+
17
+ def self.from_obeya(src_hash, ticket_types, bins, custom_fields)
18
+ ticket_fields = Hash[
19
+ src_hash.map do |obeya_name, field_value|
20
+ case(obeya_name)
21
+ when 'rtformat'
22
+ [:format, field_value]
23
+ when 'name'
24
+ [:title, field_value]
25
+ when 'ticketType_id'
26
+ [:ticket_type, ticket_types[field_value.to_i]]
27
+ when 'bin_id'
28
+ [:bin, bins[field_value.to_i]]
29
+ when 'customFields'
30
+ nil
31
+ else
32
+ [obeya_name.to_sym, field_value]
33
+ end
34
+ end.compact
35
+ ]
36
+
37
+ (src_hash['customFields'] || []).each do |custom_field_id, value|
38
+ ticket_fields[custom_fields[custom_field_id][:name]] = value
39
+ end
40
+
41
+ Obeya::Ticket::new(ticket_fields)
42
+ end
43
+
44
+ def to_obeya(custom_field_name_map, for_update=false)
45
+ obeya_fields = Hash[@ticket_fields.map do |field_name, field_value|
46
+ case(field_name)
47
+ when :format
48
+ ['rtformat', field_value]
49
+ when :title
50
+ ['name', field_value]
51
+ when :description
52
+ ['description', normalise(field_value)]
53
+ when :ticket_type
54
+ ['ticketType_id', field_value.id]
55
+ when :bin
56
+ ['bin_id', field_value.id]
57
+ else
58
+ if for_update
59
+ fdef = custom_field_name_map[field_name.to_s]
60
+ ["customFields.#{fdef[:id]}", cast_to_obeya(field_value, fdef[:type])]
61
+ else
62
+ nil
63
+ end
64
+ end
65
+ end.compact
66
+ ]
67
+
68
+ unless for_update
69
+ custom_fields = @ticket_fields.select {|fn, _v| ![:format, :title, :description, :ticket_type, :bin].include?(fn) }
70
+ if custom_fields && !custom_fields.empty?
71
+ obeya_fields['customFields'] =
72
+ Hash[custom_fields.map do |field_name, field_value|
73
+ fdef = custom_field_name_map[field_name.to_s]
74
+ [fdef[:id], cast_to_obeya(field_value, fdef[:type])]
75
+ end]
76
+ end
77
+ end
78
+
79
+ obeya_fields
80
+ end
81
+
82
+ def cast_to_obeya(value, type)
83
+ case type.to_s
84
+ when 'String'
85
+ value.to_s
86
+ when 'Float'
87
+ value.to_f
88
+ when 'Integer'
89
+ value.to_i
90
+ when 'Array'
91
+ value
92
+ when 'Date'
93
+ Date.parse(value.to_s).strftime('%Y-%m-%dT%H:%M:%S.%LZ')
94
+ end
95
+ end
96
+
97
+ def to_json(custom_field_name_map, for_update=false)
98
+ to_obeya(custom_field_name_map, for_update).to_json
99
+ end
100
+
101
+ def [](name)
102
+ @ticket_fields[name]
103
+ end
104
+
105
+ def method_missing(name)
106
+ return @ticket_fields[name] if @ticket_fields.key?(name)
107
+
108
+ super
20
109
  end
21
110
 
22
111
  private
data/lib/obeya/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Obeya
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: obeya
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thorsten Boettger
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-07 00:00:00.000000000 Z
11
+ date: 2016-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday