vimaly 0.2.0 → 1.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d14adbbb6cfb6bcd28a369de71608726014a378b
4
- data.tar.gz: bcc970b7e562eed22ae9b180a1e9737aa2bf103d
2
+ SHA256:
3
+ metadata.gz: 42d7553c8960f23093c3fd2deafc378f7970fc0b62d35ceafc94b42a0473c970
4
+ data.tar.gz: a8ddca4b4d5421ad916b69d11e9d69e1fb48fe0b1bdca933ff70162a56d170f3
5
5
  SHA512:
6
- metadata.gz: 6b422a4e99ebb3dc15fc35bf4ef43c90c85582d951ee335cfd1069c35a184c0c741801e9b211125caedcc855fb3bb794343dda60dae0bf9d0780cdee727c9a51
7
- data.tar.gz: d2c65390339e2c1791865126c9951d484cedfe6a4bae5c5bfb55acaaa65020a90a1b02628e9bcf0cd5c11e9bafae2b24b9fa4a7b8729e6206c35c29f4bee1b60
6
+ metadata.gz: 0dd8df6c3e2fe09a36ff2be2f48ed21a2d8a7338cf69e4c17b407c5a51af0828bb5ec1c072bc1886a853b6fa8e4c551e3fa708b9f11cc6c60a984e90bcf2dd98
7
+ data.tar.gz: a593b96cd95a00e11712080109af2d9e35668ee2cdaeafc833f8703eb8647a374ded79ff97413c9af9b286d7b7df0fa4e2111ca6897a4d0a3cd4fb6a7b0219f0
data/.gitignore CHANGED
@@ -7,7 +7,6 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
- .ruby-version
11
10
  .ruby-gemset
12
11
  /_ignore
13
12
  .idea/
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.6.5
data/.travis.yml CHANGED
@@ -1,5 +1,6 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.3.0
5
- before_install: gem install bundler -v 1.12.5
4
+ - 2.5.3
5
+ - 2.6.3
6
+ before_install: gem install bundler
data/CHANGELOG.md CHANGED
@@ -1,12 +1,71 @@
1
1
  # CHANGELOG
2
2
 
3
- ## 0.1.0 (not yet released)
3
+ ## 1.1.0
4
4
 
5
- * initial copy from the `investapp`
5
+ * add support for searching tickets [#19](https://github.com/sharesight/vimaly/pull/19)
6
+
7
+ ## 1.0.2
8
+
9
+ * Fix unfriendly filenames not attaching to Vimaly tickets [#17](https://github.com/sharesight/vimaly/pull/17)
10
+
11
+ ## 1.0.1
12
+
13
+ * Update for Ruby 2.6.3 compatibility.
14
+
15
+ ## 1.0.0
16
+
17
+ * allow adding attachments with providing a content-type [#15](https://github.com/sharesight/vimaly/pull/15)
18
+
19
+ ## 0.5.3
20
+
21
+ * add support for Ruby `2.5.3` [#14](https://github.com/sharesight/vimaly/pull/14)
22
+
23
+ ## 0.5.2
24
+
25
+ * return the correct ticket-id after creating a ticket [#13](https://github.com/sharesight/vimaly/pull/13)
26
+
27
+ ## 0.5.1
28
+
29
+ * return the ticket-id after updating a ticket [#12](https://github.com/sharesight/vimaly/pull/12)
30
+
31
+ ## 0.5.0
32
+
33
+ * add support for adding attachments to tickets [#11](https://github.com/sharesight/vimaly/pull/11)
34
+
35
+ ## 0.4.0
36
+
37
+ * support API version 2 [#10](https://github.com/sharesight/vimaly/pull/10)
38
+
39
+ ## 0.3.1
40
+
41
+ * use Ruby `2.5.1` [#9](https://github.com/sharesight/vimaly/pull/9)
42
+
43
+ ## 0.3.0
44
+
45
+ * ask for more bins [#8](https://github.com/sharesight/vimaly/pull/8)
46
+
47
+ ## 0.2.5
48
+
49
+ * Ruby 2.5.0 support
50
+
51
+ ## 0.2.4
52
+
53
+ * Ruby 2.4.2 support
54
+
55
+ ## 0.2.3
56
+
57
+ * Ruby 2.4.1 support
58
+
59
+ ## 0.2.2
60
+
61
+ * handle Bad Gateway 502 errors
62
+
63
+ ## 0.2.1
64
+
65
+ * Fix creation of duplicated tickets (due to caching)
6
66
 
7
67
  ## 0.2.0
8
68
 
9
69
  * Support the ability to retrieve all tickets for a bin, and to run a matcher through this
10
70
  * Support custom fields on ticket
11
71
  * Add an integration test (site configured)
12
-
data/lib/vimaly.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require_relative "vimaly/version"
2
+ require_relative "vimaly/exceptions"
2
3
  require_relative "vimaly/bin"
3
4
  require_relative "vimaly/ticket_type"
4
5
  require_relative "vimaly/ticket"
data/lib/vimaly/client.rb CHANGED
@@ -8,10 +8,10 @@ module Vimaly
8
8
  VIMALY_ROOT_URL = "https://o1.vimaly.com"
9
9
  CUSTOM_FIELD_TYPES = [::NilClass, ::String, ::Float, ::Integer, ::Array, ::Date]
10
10
 
11
- def initialize(company_id, username, password, logger=nil)
11
+ def initialize(company_id, user_credentials: nil, auth_key: nil, logger: nil)
12
12
  @company_id = company_id
13
- @username = username
14
- @password = password
13
+ @user_credentials = user_credentials
14
+ @auth_key = auth_key
15
15
  @logger = logger
16
16
 
17
17
  @bin_tickets = {}
@@ -27,11 +27,12 @@ module Vimaly
27
27
  merge(others)
28
28
  )
29
29
 
30
+ ticket_id = next_ticket_id
30
31
  ticket_to_json = ticket.to_json(custom_field_name_map)
31
- response = post("/tickets/#{next_ticket_id}", ticket_to_json)
32
+ response = post("/tickets/#{ticket_id}", ticket_to_json)
32
33
  case response.status
33
34
  when 200..299
34
- true
35
+ ticket_id
35
36
  else
36
37
  log_warn "status: #{response.status}"
37
38
  log_warn " #{response.inspect}"
@@ -44,12 +45,33 @@ module Vimaly
44
45
 
45
46
  response = put("/tickets/#{id}", ticket.to_json(custom_field_name_map, true))
46
47
  case response.status
47
- when 200..299
48
- true
49
- else
50
- log_warn "status: #{response.status}"
51
- log_warn " #{response.inspect}"
52
- false
48
+ when 200..299
49
+ id
50
+ else
51
+ log_warn "status: #{response.status}"
52
+ log_warn " #{response.inspect}"
53
+ false
54
+ end
55
+ end
56
+
57
+ def search_tickets(query_string, state: 'active')
58
+ ticket_type_map = Hash[ticket_types.map { |t| [t.id, t] }]
59
+ bin_map = Hash[bins.map { |b| [b.id, b] }]
60
+
61
+ get("/ticket-search?text=#{query_string}&state=#{state}").map do |ticket_data|
62
+ Ticket.from_vimaly(ticket_data, ticket_type_map, bin_map, custom_fields)
63
+ end
64
+ end
65
+
66
+ def add_attachment(ticket_id, file_name, file_content, request_options={})
67
+ response = post("/tickets/#{ticket_id}/attachments?name=#{CGI.escape(file_name)}", file_content, request_options)
68
+ case response.status
69
+ when 200..299
70
+ true
71
+ else
72
+ log_warn "status: #{response.status}"
73
+ log_warn " #{response.inspect}"
74
+ false
53
75
  end
54
76
  end
55
77
 
@@ -64,7 +86,7 @@ module Vimaly
64
86
 
65
87
  def bins
66
88
  @bins ||= begin
67
- get('/bins').map do |bin_data|
89
+ get('/bins?max-results=500').map do |bin_data|
68
90
  Bin.new(bin_data['_id'], bin_data['name'])
69
91
  end
70
92
  end
@@ -97,10 +119,8 @@ module Vimaly
97
119
  ticket_type_map = Hash[ticket_types.map { |t| [t.id, t] }]
98
120
  bin_map = Hash[bins.map { |b| [b.id, b] }]
99
121
 
100
- @bin_tickets[bin_id] ||= begin
101
- get("/tickets?bin_id=#{bin_id}").map do |ticket_data|
102
- Ticket.from_vimaly(ticket_data, ticket_type_map, bin_map, custom_fields)
103
- end
122
+ get("/tickets?bin_id=#{bin_id}").map do |ticket_data|
123
+ Ticket.from_vimaly(ticket_data, ticket_type_map, bin_map, custom_fields)
104
124
  end
105
125
  end
106
126
 
@@ -140,34 +160,40 @@ module Vimaly
140
160
  end
141
161
 
142
162
  def get(api_path)
143
- response = faraday.get("/rest/1/#{@company_id}#{api_path}") do |request|
144
- request.headers.update({ accept: 'application/json', content_type: 'application/json' })
163
+ response = faraday.get("/rest/2/#{@company_id}#{api_path}") do |request|
164
+ update_request_headers(request)
145
165
  end
146
166
  unless response.success?
147
- raise("Vimaly #{api_path} call failed")
167
+ raise Vimaly::ConnectionError.new("Vimaly #{api_path} call failed with response #{response.status}")
148
168
  end
149
169
  JSON.parse(response.body)
150
170
  end
151
171
 
152
- def post(api_path, json)
153
- faraday.post("/rest/1/#{@company_id}#{api_path}", json) do |request|
154
- request.headers.update({ accept: 'application/json', content_type: 'application/json' })
172
+ def post(api_path, content, headers={})
173
+ faraday.post("/rest/2/#{@company_id}#{api_path}", content) do |request|
174
+ update_request_headers(request, headers)
155
175
  end
156
176
  end
157
177
 
158
178
  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' })
179
+ faraday.put("/rest/2/#{@company_id}#{api_path}", json) do |request|
180
+ update_request_headers(request)
161
181
  end
162
182
  end
163
183
 
164
184
  def faraday
165
185
  @faraday ||= Faraday.new(VIMALY_ROOT_URL).tap do |connection|
166
- connection.basic_auth(@username, @password)
186
+ connection.basic_auth(@user_credentials[:username], @user_credentials[:password]) if @user_credentials
167
187
  connection.request(:json)
168
188
  end
169
189
  end
170
190
 
191
+ def update_request_headers(request, headers={})
192
+ request.headers.update({ accept: 'application/json', content_type: 'application/json' })
193
+ request.headers.update({ authorization: "bearer #{@auth_key}" }) if @auth_key
194
+ request.headers.update(headers)
195
+ end
196
+
171
197
  def log_warn(s)
172
198
  @logger.warn(s) if @logger
173
199
  end
@@ -0,0 +1,3 @@
1
+ module Vimaly
2
+ class ConnectionError < RuntimeError; end
3
+ end
data/lib/vimaly/ticket.rb CHANGED
@@ -1,12 +1,14 @@
1
+ require "active_support/core_ext/hash/indifferent_access"
2
+
1
3
  module Vimaly
2
4
  class Ticket
3
5
 
4
6
  # title, description, format, ticket_type, bin, id=nil
5
7
  def initialize(*params)
6
8
  if params.first.is_a?(Hash)
7
- @ticket_fields = params.first
9
+ @ticket_fields = HashWithIndifferentAccess.new(params.first)
8
10
  else
9
- @ticket_fields = {}
11
+ @ticket_fields = HashWithIndifferentAccess.new
10
12
  [:title, :description, :format, :ticket_type, :bin, :id].each_with_index do |param_key, idx|
11
13
  break if idx>=params.size
12
14
  @ticket_fields[param_key] = params[idx]
@@ -44,19 +46,22 @@ module Vimaly
44
46
  def to_vimaly(custom_field_name_map, for_update=false)
45
47
  vimaly_fields = Hash[@ticket_fields.map do |field_name, field_value|
46
48
  case(field_name)
47
- when :format
49
+ when 'id'
50
+ nil # id should not be in ticket body
51
+ when 'format'
48
52
  ['rtformat', field_value]
49
- when :title
53
+ when 'title'
50
54
  ['name', field_value]
51
- when :description
55
+ when 'description'
52
56
  ['description', normalise(field_value)]
53
- when :ticket_type
57
+ when 'ticket_type'
54
58
  ['ticketType_id', field_value.id]
55
- when :bin
59
+ when 'bin'
56
60
  ['bin_id', field_value.id]
57
61
  else
58
62
  if for_update
59
- fdef = custom_field_name_map[field_name.to_s]
63
+ fdef = custom_field_name_map[field_name]
64
+ raise "Field type #{field_name} is not a defined custom or standard field in Vimaly" unless fdef
60
65
  ["customFields.#{fdef[:id]}", cast_to_vimaly(field_value, fdef[:type])]
61
66
  else
62
67
  nil
@@ -66,7 +71,7 @@ module Vimaly
66
71
  ]
67
72
 
68
73
  unless for_update
69
- custom_fields = @ticket_fields.select {|fn, _v| ![:format, :title, :description, :ticket_type, :bin].include?(fn) }
74
+ custom_fields = @ticket_fields.select {|fn, _v| ![:format, :title, :description, :ticket_type, :bin].include?(fn.to_sym) }
70
75
  if custom_fields && !custom_fields.empty?
71
76
  vimaly_fields['customFields'] =
72
77
  Hash[custom_fields.map do |field_name, field_value|
@@ -98,6 +103,11 @@ module Vimaly
98
103
  to_vimaly(custom_field_name_map, for_update).to_json
99
104
  end
100
105
 
106
+ def add_id(id)
107
+ raise "Ticket already has id #{@ticket_fields[:'_id']} and we try and add #{id}" if @ticket_fields[:'_id']
108
+ @ticket_fields['_id'] = id
109
+ end
110
+
101
111
  def [](name)
102
112
  @ticket_fields[name]
103
113
  end
@@ -108,6 +118,10 @@ module Vimaly
108
118
  super
109
119
  end
110
120
 
121
+ def update_fields(fields)
122
+ @ticket_fields.merge!(fields)
123
+ end
124
+
111
125
  private
112
126
 
113
127
  def normalise(text)
@@ -1,3 +1,3 @@
1
1
  module Vimaly
2
- VERSION = "0.2.0"
2
+ VERSION = "1.1.0".freeze
3
3
  end
data/vimaly.gemspec CHANGED
@@ -21,9 +21,10 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.add_dependency "faraday"
23
23
  spec.add_dependency "faraday_middleware"
24
+ spec.add_dependency "activesupport"
24
25
 
25
- spec.add_development_dependency "bundler", "~> 1.12"
26
- spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.add_development_dependency "bundler"
27
+ spec.add_development_dependency "rake"
27
28
  spec.add_development_dependency "pry"
28
29
  spec.add_development_dependency "maxitest", '~> 1'
29
30
  spec.add_development_dependency "shoulda-context"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vimaly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thorsten Boettger
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-02-14 00:00:00.000000000 Z
11
+ date: 2021-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -38,34 +38,48 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activesupport
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'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - "~>"
59
+ - - ">="
46
60
  - !ruby/object:Gem::Version
47
- version: '1.12'
61
+ version: '0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - "~>"
66
+ - - ">="
53
67
  - !ruby/object:Gem::Version
54
- version: '1.12'
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rake
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - "~>"
73
+ - - ">="
60
74
  - !ruby/object:Gem::Version
61
- version: '10.0'
75
+ version: '0'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - "~>"
80
+ - - ">="
67
81
  - !ruby/object:Gem::Version
68
- version: '10.0'
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: pry
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -130,6 +144,7 @@ extensions: []
130
144
  extra_rdoc_files: []
131
145
  files:
132
146
  - ".gitignore"
147
+ - ".ruby-version"
133
148
  - ".travis.yml"
134
149
  - CHANGELOG.md
135
150
  - CODE_OF_CONDUCT.md
@@ -142,6 +157,7 @@ files:
142
157
  - lib/vimaly.rb
143
158
  - lib/vimaly/bin.rb
144
159
  - lib/vimaly/client.rb
160
+ - lib/vimaly/exceptions.rb
145
161
  - lib/vimaly/ticket.rb
146
162
  - lib/vimaly/ticket_type.rb
147
163
  - lib/vimaly/version.rb
@@ -150,7 +166,7 @@ homepage: https://github.com/sharesight/vimaly
150
166
  licenses:
151
167
  - MIT
152
168
  metadata: {}
153
- post_install_message:
169
+ post_install_message:
154
170
  rdoc_options: []
155
171
  require_paths:
156
172
  - lib
@@ -165,9 +181,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
165
181
  - !ruby/object:Gem::Version
166
182
  version: '0'
167
183
  requirements: []
168
- rubyforge_project:
169
- rubygems_version: 2.6.8
170
- signing_key:
184
+ rubygems_version: 3.0.6
185
+ signing_key:
171
186
  specification_version: 4
172
187
  summary: Wrapper for the Vimaly API
173
188
  test_files: []