help_spot 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ pkg
2
+ doc
3
+ *.gem
4
+ config/help_spot.yml
data/History.txt ADDED
@@ -0,0 +1,14 @@
1
+ == 0.0.2 2009-10-11
2
+
3
+ * Add to SSL
4
+ * Release to Gemcutter
5
+
6
+ == 0.0.1.4 2009-02-09
7
+
8
+ * Pushed to github
9
+
10
+ == 0.0.1 2009-01-05
11
+
12
+ * 1 major enhancement:
13
+ * Initial release
14
+
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2009 Jamie Wilson
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,25 @@
1
+ = HelpSpot
2
+
3
+ Ruby gem to talk to the API of a HelpSpot instance.
4
+
5
+ For information on HelpSpot: http://www.userscape.com/products/helpspot/
6
+
7
+ Details of HelpSpot's API are at: http://www.userscape.com/helpdesk/index.php?pg=kb.book&id=6
8
+
9
+ == License
10
+
11
+ Licensed under the MIT License. See the included LICENSE file.
12
+
13
+ = Usage
14
+
15
+ == Installation
16
+
17
+ Copy the <tt>config/help_spot.yml.sample</tt> file to <tt>THE_ROOT_DIR_OF_YOUR_APP/config/help_spot.yml</tt>. Edit the file to have some sensible values.
18
+
19
+ Somewhere in your application, you'll want to do this once:
20
+
21
+ <tt>HelpSpot.configure</tt>
22
+
23
+ In my app, it also turns out it's useful to do this once:
24
+
25
+ <tt>HELPSPOT_CATEGORIES = HelpSpot.category_key_value_pairs</tt>
data/Rakefile ADDED
@@ -0,0 +1,49 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "help_spot"
8
+ gem.summary = %Q{A package for interacting with UserScape's HelpSpot product.}
9
+ gem.description = %Q{A package for interacting with UserScape's HelpSpot product.}
10
+ gem.email = "jnewland@gmail.com"
11
+ gem.homepage = "http://github.com/jnewland/help_spot"
12
+ gem.authors = ["Jamie Wilson","Jesse Newland"]
13
+ gem.add_development_dependency "rspec"
14
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
+ end
16
+ Jeweler::GemcutterTasks.new
17
+ rescue LoadError
18
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
19
+ end
20
+
21
+ require 'spec/rake/spectask'
22
+ Spec::Rake::SpecTask.new(:spec) do |spec|
23
+ spec.libs << 'lib' << 'spec'
24
+ spec.spec_files = FileList['spec/**/*_spec.rb']
25
+ end
26
+
27
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
28
+ spec.libs << 'lib' << 'spec'
29
+ spec.pattern = 'spec/**/*_spec.rb'
30
+ spec.rcov = true
31
+ end
32
+
33
+ task :spec => :check_dependencies
34
+
35
+ task :default => :spec
36
+
37
+ require 'rake/rdoctask'
38
+ Rake::RDocTask.new do |rdoc|
39
+ if File.exist?('VERSION')
40
+ version = File.read('VERSION')
41
+ else
42
+ version = ""
43
+ end
44
+
45
+ rdoc.rdoc_dir = 'rdoc'
46
+ rdoc.title = "help_spot #{version}"
47
+ rdoc.rdoc_files.include('README*')
48
+ rdoc.rdoc_files.include('lib/**/*.rb')
49
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.2
@@ -0,0 +1,6 @@
1
+ root_url: http://www.example.com/helpspot/api/index.php?format=json
2
+ username: helpspot_user@example.com
3
+ password: my_p@ssw0rd
4
+ hidden_categories:
5
+ - Deactivations
6
+ - 'Contact Us'
data/help_spot.gemspec ADDED
@@ -0,0 +1,54 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{help_spot}
8
+ s.version = "0.0.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jamie Wilson", "Jesse Newland"]
12
+ s.date = %q{2009-10-11}
13
+ s.description = %q{A package for interacting with UserScape's HelpSpot product.}
14
+ s.email = %q{jnewland@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".gitignore",
21
+ "History.txt",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "config/help_spot.yml.sample",
27
+ "help_spot.gemspec",
28
+ "lib/help_spot.rb",
29
+ "spec/help_spot_spec.rb",
30
+ "spec/spec_helper.rb"
31
+ ]
32
+ s.homepage = %q{http://github.com/jnewland/help_spot}
33
+ s.rdoc_options = ["--charset=UTF-8"]
34
+ s.require_paths = ["lib"]
35
+ s.rubygems_version = %q{1.3.3}
36
+ s.summary = %q{A package for interacting with UserScape's HelpSpot product.}
37
+ s.test_files = [
38
+ "spec/help_spot_spec.rb",
39
+ "spec/spec_helper.rb"
40
+ ]
41
+
42
+ if s.respond_to? :specification_version then
43
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
44
+ s.specification_version = 3
45
+
46
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
47
+ s.add_development_dependency(%q<rspec>, [">= 0"])
48
+ else
49
+ s.add_dependency(%q<rspec>, [">= 0"])
50
+ end
51
+ else
52
+ s.add_dependency(%q<rspec>, [">= 0"])
53
+ end
54
+ end
data/lib/help_spot.rb ADDED
@@ -0,0 +1,200 @@
1
+ require 'uri'
2
+ require 'net/http'
3
+ require 'net/https'
4
+ require 'json'
5
+
6
+ ##
7
+ # help_spot
8
+ #
9
+ # A partial basic implementation of a HelpSpot API interface
10
+ #
11
+ # == Using help_spot
12
+ #
13
+ # === Basics
14
+ #
15
+ # Copy and edit the included config file. Include the gem in your app. Call the configure method. Hit the API.
16
+ #
17
+ # require 'help_spot'
18
+ # HelpSpot.configure(:config_file => '/path/to/help_spot.yml')
19
+ # HelpSpot.forums_list
20
+ #
21
+ # => [{"xForumId"=>"1", "fClosed"=>"0", "sForumName"=>"The First Forum", "iOrder"=>"0", "sDescription"=>"A test forum"}, {"xForumId"=>"2", "fClosed"=>"0", "sForumName"=>"Secondary Forum", "iOrder"=>"0", "sDescription"=>"Forum #2"}]
22
+ #
23
+
24
+ module HelpSpot
25
+ class << self
26
+
27
+ # Loads the config file.
28
+ #
29
+ # == Options
30
+ # * config_file (optional)
31
+ # Defaults to '/config/help_spot.yml'
32
+ # Shouldn't be required when using merb or Rails.
33
+ #
34
+ def configure(args={})
35
+ # work out the default app_root
36
+ if defined?(Merb)
37
+ app_root = Merb.root
38
+ elsif defined?(Rails)
39
+ app_root = RAILS_ROOT
40
+ else
41
+ app_root = '.'
42
+ end
43
+
44
+ config_file = args[:config_file] || '/config/help_spot.yml'
45
+ yml_file = app_root+config_file
46
+
47
+ raise yml_file+" not found" unless File.exist? yml_file
48
+ @config = YAML.load_file(yml_file)
49
+ end
50
+
51
+ # sends a feedback request to HelpSpot and returns the request ID number and access key
52
+ #
53
+ # == Options
54
+ # In addition to note you must also have at least one of the following set: first_name, last_name, user_id, email or phone
55
+ # * note
56
+ # The body of the ticket
57
+ # * category
58
+ # * first_name
59
+ # * last_name
60
+ # * user_id
61
+ # * email
62
+ # * phone
63
+ # * urgent
64
+ # A boolean flag. Defaults to false.
65
+ #
66
+ def create(args)
67
+ help_form = {:tNote => args[:note],
68
+ :xCategory => args[:category],
69
+ :sFirstName => args[:first_name],
70
+ :sLastName => args[:last_name],
71
+ :sUserId => args[:user_id],
72
+ :sEmail => args[:email],
73
+ :sPhone => args[:phone],
74
+ :fUrgent => args[:urgent]}.reject!{|k,v| v == nil}
75
+
76
+ JSON.parse(api_request('request.create', 'POST', help_form))['xRequest'] rescue []
77
+ end
78
+
79
+ # Returns an array of tickets belonging to a given user id.
80
+ #
81
+ # == Authentication
82
+ # This method does require authentication.
83
+ #
84
+ # == Options
85
+ # * user_id
86
+ # The user who's tickets you wish to view.
87
+ #
88
+ def get_by_user_id(args)
89
+ JSON.parse(api_request('private.request.search', 'GET', {:sUserId => args[:user_id]}))['request'] rescue nil
90
+ end
91
+
92
+ # Returns ticket categories.
93
+ #
94
+ # == Authentication
95
+ # This method does require authentication.
96
+ #
97
+ # == Options
98
+ # * include_deleted
99
+ # true if you want to include deleted categories.
100
+ #
101
+ def categories(args={})
102
+ res = api_request('private.request.getCategories', 'GET')
103
+ res = JSON.parse(res)['category'] rescue []
104
+
105
+ unless args[:include_deleted] and args[:include_deleted] == true
106
+ res.reject!{|k, v| v['fDeleted'] == '1'} rescue []
107
+ end
108
+
109
+ return res
110
+ end
111
+
112
+ # Returns an array of non-deleted categories, as key value pairs. Useful for select lists.
113
+ #
114
+ # == Authentication
115
+ # This method does require authentication.
116
+ #
117
+ def category_key_value_pairs
118
+ categories.collect{|k,v| [k,v['sCategory']]} rescue []
119
+ end
120
+
121
+ # Returns non-deleted categories, with a list of predefined categories removed
122
+ #
123
+ def category_key_value_pairs_without(categories=nil)
124
+ categories ||= @config['hidden_categories'] rescue nil
125
+
126
+ orig_categories = category_key_value_pairs
127
+ if categories
128
+ categories.each do |category|
129
+ orig_categories.reject!{|i| i[1] == category}
130
+ end
131
+ end
132
+ orig_categories
133
+ end
134
+
135
+ # Returns an array of forums
136
+ #
137
+ def forums_list
138
+ JSON.parse(HelpSpot.api_request('forums.list'))['forum'] rescue []
139
+ end
140
+
141
+ # Returns an array of forums
142
+ #
143
+ # == Options
144
+ # * forum_id
145
+ # The numeric id of the forum you want.
146
+ def forum_get(args)
147
+ JSON.parse(HelpSpot.api_request('forums.get', 'GET', :xForumId => args[:forum_id])) rescue []
148
+ end
149
+
150
+ # Returns an array of topics from a given forum
151
+ #
152
+ # == Options
153
+ # * forum_id
154
+ # The numeric id of the forum you want.
155
+ # * start
156
+ # record set position to start at
157
+ # * length
158
+ # how many records to return
159
+ #
160
+ def forum_get_topics(args={})
161
+ JSON.parse(HelpSpot.api_request('forums.getTopics', 'GET', {:xForumId => args[:forum_id]}.merge(args)))['topic'] rescue []
162
+ end
163
+
164
+ # Returns an array of posts from a given topic
165
+ #
166
+ # == Options
167
+ # * topic_id
168
+ # The numeric id of the topic
169
+ #
170
+ def forum_get_topic_posts(args={})
171
+ JSON.parse(HelpSpot.api_request('forums.getPosts', 'GET', :xTopicId => args[:topic_id]))['post'] rescue []
172
+ end
173
+
174
+ def api_request(api_method, http_method='POST', args={})
175
+ api_params = {:method => api_method, :output => 'json'}.merge(args)
176
+ query_params = api_params.collect{|k,v| [k.to_s, v.to_s]} # [URI.encode(k.to_s),URI.encode(v.to_s.gsub(/\ /, '+'))]
177
+ built_query = query_params.collect{|i| i.join('=')}.join('&') # make a query string
178
+
179
+ ru = URI::parse(@config['root_url']) # where ru = ROOT_URL
180
+ merged_query = [built_query, (ru.query == '' ? nil : ru.query)].compact.join('&') # merge our generated query string with the ROOT_URL's query string
181
+
182
+ url = URI::HTTP.new(ru.scheme, ru.userinfo, ru.host, ru.port, ru.registry, ru.path, ru.opaque, merged_query, ru.fragment)
183
+
184
+ request = nil
185
+ if http_method == 'POST'
186
+ request = Net::HTTP::Post.new(url.path)
187
+ request.set_form_data(query_params)
188
+ else
189
+ request = Net::HTTP::Get.new(url.path+'?'+url.query)
190
+ end
191
+ request.basic_auth @config['username'], @config['password']
192
+ http = Net::HTTP.new(url.host, url.port)
193
+ http.use_ssl = (url.scheme == 'https')
194
+ response = http.start { |h| h.request(request) }
195
+
196
+ response.body
197
+ end
198
+
199
+ end # class
200
+ end # module
@@ -0,0 +1,7 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "HelpSpot" do
4
+ it "fails" do
5
+ fail "hey buddy, you should probably rename this file and start specing for real"
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'help_spot'
4
+ require 'spec'
5
+ require 'spec/autorun'
6
+
7
+ Spec::Runner.configure do |config|
8
+
9
+ end
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: help_spot
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Jamie Wilson
8
+ - Jesse Newland
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2009-10-11 00:00:00 -04:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rspec
18
+ type: :development
19
+ version_requirement:
20
+ version_requirements: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: "0"
25
+ version:
26
+ description: A package for interacting with UserScape's HelpSpot product.
27
+ email: jnewland@gmail.com
28
+ executables: []
29
+
30
+ extensions: []
31
+
32
+ extra_rdoc_files:
33
+ - LICENSE
34
+ - README.rdoc
35
+ files:
36
+ - .gitignore
37
+ - History.txt
38
+ - LICENSE
39
+ - README.rdoc
40
+ - Rakefile
41
+ - VERSION
42
+ - config/help_spot.yml.sample
43
+ - help_spot.gemspec
44
+ - lib/help_spot.rb
45
+ - spec/help_spot_spec.rb
46
+ - spec/spec_helper.rb
47
+ has_rdoc: true
48
+ homepage: http://github.com/jnewland/help_spot
49
+ licenses: []
50
+
51
+ post_install_message:
52
+ rdoc_options:
53
+ - --charset=UTF-8
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: "0"
61
+ version:
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: "0"
67
+ version:
68
+ requirements: []
69
+
70
+ rubyforge_project:
71
+ rubygems_version: 1.3.3
72
+ signing_key:
73
+ specification_version: 3
74
+ summary: A package for interacting with UserScape's HelpSpot product.
75
+ test_files:
76
+ - spec/help_spot_spec.rb
77
+ - spec/spec_helper.rb