appygram 1.0.0 → 1.0.1
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.
- data/README.md +118 -0
- data/Rakefile +6 -0
- data/lib/appygram.rb +56 -9
- data/lib/appygram/version.rb +1 -1
- data/test/local.rb +35 -0
- data/test/network.rb +23 -0
- metadata +10 -5
- data/README.markdown +0 -55
data/README.md
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
# Appygram <http://www.appygram.com>
|
2
|
+
|
3
|
+
Appygram is a simple service to handle messages from your web
|
4
|
+
or mobile app. This gem provides communication with the Appygram
|
5
|
+
service via a simple API. Useful features higher in the stack
|
6
|
+
are found in gems that depend on this one, e.g. appygram-rails,
|
7
|
+
which automatically turns uncaught Rails exceptions into traces.
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
1. Add gem entry to Gemfile
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem 'appygram'
|
15
|
+
```
|
16
|
+
|
17
|
+
2. Run <code>bundle install</code>
|
18
|
+
|
19
|
+
3. Configure your API Key in an initializer, e.g. config/appygram.rb
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
Appygram.configure :api_key => 'your_api_key'
|
23
|
+
```
|
24
|
+
|
25
|
+
using a valid API key for your app provided by Appygram
|
26
|
+
|
27
|
+
## Invocation
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
require 'appygram'
|
31
|
+
|
32
|
+
# Sending an appygram
|
33
|
+
Appygram.send :topic => 'Test', :message => 'This is a test.'
|
34
|
+
|
35
|
+
# Sending a trace
|
36
|
+
Appygram.trace some_exception
|
37
|
+
|
38
|
+
# Sending a trace with accompanying appygram fields
|
39
|
+
Appygram.trace some_exception, :email => 'some_user@domain'
|
40
|
+
```
|
41
|
+
|
42
|
+
## Supported fields in an appygram
|
43
|
+
|
44
|
+
* topic - of principal importance in message routing
|
45
|
+
* subject
|
46
|
+
* message
|
47
|
+
* name
|
48
|
+
* email
|
49
|
+
* phone
|
50
|
+
* platform ('web' by default for this connector)
|
51
|
+
* software ('appygram.rb [VERSION]' by default for this connector)
|
52
|
+
* app_json - Any object assigned to this field will be serialized
|
53
|
+
into JSON. If it is a hash, top level keys will be addressable
|
54
|
+
in the message routing and formatting.
|
55
|
+
|
56
|
+
## Traces
|
57
|
+
|
58
|
+
* Traces send the current stack trace from your application.
|
59
|
+
* Appygram deduplicates traces and treats them statistically;
|
60
|
+
traces are converted to notifications based on rules agreed by
|
61
|
+
the system and the user.
|
62
|
+
* If you send fields (like "name" and "email") along with the
|
63
|
+
trace, Appygram can put that information into notifications.
|
64
|
+
For example, if you generate a trace because of an unexpected
|
65
|
+
exception, and you include the contact information for the
|
66
|
+
logged-in user who experienced the exception, responders can
|
67
|
+
more easily identify and communicate with the affected user
|
68
|
+
about what might have led to the exception.
|
69
|
+
|
70
|
+
## Additional configuration options
|
71
|
+
|
72
|
+
You can call Appygram.configure multiple times safely, or pack
|
73
|
+
all the options you need into one call.
|
74
|
+
|
75
|
+
To minimize network bandwidth in the event that your app generates
|
76
|
+
a LOT of traces, you can throttle the trace sender when you configure
|
77
|
+
Appygram. You can throttle all traces on a per-second basis, or
|
78
|
+
duplicate traces per day.
|
79
|
+
|
80
|
+
```ruby
|
81
|
+
Appygram.configure :max_traces_per_second => 3
|
82
|
+
# and/or
|
83
|
+
Appygram.configure :max_duplicate_traces_per_day => 1
|
84
|
+
```
|
85
|
+
|
86
|
+
You can set defaults for the platform or software at configuration time.
|
87
|
+
|
88
|
+
```ruby
|
89
|
+
Appygram.configure :platform => 'Ruboto'
|
90
|
+
# and/or
|
91
|
+
Appygram.configure :software => 'awesomesauce'
|
92
|
+
```
|
93
|
+
|
94
|
+
The standard endpoints for Appygram are built in. If you need to change
|
95
|
+
them, you can configure <code>:appygram_endpoint</code> and
|
96
|
+
<code>:trace_endpoint</code> to the full URL destination where data is
|
97
|
+
to be sent.
|
98
|
+
|
99
|
+
If you send traces, you can provide a map of uri stubs to paths
|
100
|
+
within your application. Appygram will use these to hyperlink
|
101
|
+
the traces to the appropriate repository online. This map may
|
102
|
+
be also populated by higher level gems, like appygram_rails;
|
103
|
+
anything you supply here will be additively merged.
|
104
|
+
|
105
|
+
```ruby
|
106
|
+
Appygram.add_trace_uris 'lib' => 'http://github.com/anythinglabs/appygram.rb'
|
107
|
+
```
|
108
|
+
|
109
|
+
## Rules for improvement
|
110
|
+
|
111
|
+
* This gem must not have other dependencies.
|
112
|
+
* This gem may take advantage of other gems (e.g. async i/o,
|
113
|
+
background queueing, http pooling) if detected, and the advantage
|
114
|
+
is related directly to communication with the service
|
115
|
+
* Effort should be made to retain parity with other fully supported
|
116
|
+
connectors
|
117
|
+
|
118
|
+
Copyright © 2012 Solertium
|
data/Rakefile
CHANGED
data/lib/appygram.rb
CHANGED
@@ -1,14 +1,28 @@
|
|
1
1
|
require "appygram/version"
|
2
2
|
require 'net/http'
|
3
3
|
require 'net/https'
|
4
|
+
require 'json'
|
4
5
|
|
5
6
|
module Appygram
|
6
7
|
def self.configure(params)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
if params[:api_key]
|
9
|
+
Appygram::Config.api_key = params[:api_key]
|
10
|
+
end
|
11
|
+
if params[:appygram_endpoint]
|
12
|
+
appygram_endpoint = params[:appygram_endpoint] || 'https://appygram.herokuapp.com/appygrams'
|
13
|
+
Appygram::Config.appygram_endpoint = URI appygram_endpoint
|
14
|
+
end
|
15
|
+
if params[:trace_endpoint]
|
16
|
+
trace_endpoint = params[:trace_endpoint] || 'https://appygram.appspot.com/traces'
|
17
|
+
Appygram::Config.trace_endpoint = URI trace_endpoint
|
18
|
+
end
|
19
|
+
if params[:platform]
|
20
|
+
Appygram::Config.platform = params[:platform] || 'web'
|
21
|
+
end
|
22
|
+
if params[:software]
|
23
|
+
Appygram::Config.software = params[:software] || "appygram.rb #{Appygram::VERSION}"
|
24
|
+
end
|
25
|
+
# TODO: respect throttling per readme
|
12
26
|
end
|
13
27
|
|
14
28
|
def self.send(params)
|
@@ -16,8 +30,38 @@ module Appygram
|
|
16
30
|
pc[:api_key] = Appygram::Config.api_key
|
17
31
|
pc[:platform] = Appygram::Config.platform unless pc[:platform]
|
18
32
|
pc[:software] = Appygram::Config.software unless pc[:software]
|
19
|
-
|
33
|
+
if pc[:app_json]
|
34
|
+
pc[:app_json] = JSON pc[:app_json]
|
35
|
+
end
|
36
|
+
url = Appygram::Config.appygram_endpoint
|
37
|
+
req = Net::HTTP::Post.new url.request_uri
|
38
|
+
req.form_data = pc
|
39
|
+
session = Net::HTTP.new(url.hostname, url.port)
|
40
|
+
session.use_ssl = true
|
41
|
+
session.start {|http|
|
42
|
+
http.request(req)
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.trace(exception, params = {})
|
47
|
+
pc = params.clone
|
48
|
+
pc[:api_key] = Appygram::Config.api_key
|
49
|
+
pc[:platform] = Appygram::Config.platform unless pc[:platform]
|
50
|
+
pc[:software] = Appygram::Config.software unless pc[:software]
|
51
|
+
if pc[:app_json]
|
52
|
+
pc[:app_json] = JSON pc[:app_json]
|
53
|
+
end
|
54
|
+
url = Appygram::Config.trace_endpoint
|
20
55
|
req = Net::HTTP::Post.new url.request_uri
|
56
|
+
trace = []
|
57
|
+
exception.backtrace.each do |line|
|
58
|
+
trace << line.split(':')
|
59
|
+
end
|
60
|
+
pc[:trace] = JSON({
|
61
|
+
'class' => exception.class.name,
|
62
|
+
'message' => exception.message,
|
63
|
+
'backtrace' => trace
|
64
|
+
})
|
21
65
|
req.form_data = pc
|
22
66
|
session = Net::HTTP.new(url.hostname, url.port)
|
23
67
|
session.use_ssl = true
|
@@ -28,12 +72,15 @@ module Appygram
|
|
28
72
|
|
29
73
|
class Config
|
30
74
|
class << self
|
31
|
-
attr_accessor :api_key, :
|
75
|
+
attr_accessor :api_key, :appygram_endpoint, :trace_endpoint, :software, :platform
|
32
76
|
def api_key
|
33
77
|
return @api_key unless @api_key.nil?
|
34
78
|
end
|
35
|
-
def
|
36
|
-
return @
|
79
|
+
def appygram_endpoint
|
80
|
+
return @appygram_endpoint unless @appygram_endpoint.nil?
|
81
|
+
end
|
82
|
+
def trace_endpoint
|
83
|
+
return @trace_endpoint unless @trace_endpoint.nil?
|
37
84
|
end
|
38
85
|
def software
|
39
86
|
return @software unless @software.nil?
|
data/lib/appygram/version.rb
CHANGED
data/test/local.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'appygram'
|
3
|
+
|
4
|
+
describe Appygram do
|
5
|
+
describe "when invoking the gem" do
|
6
|
+
it "must have a version number" do
|
7
|
+
Appygram::VERSION.wont_be_nil
|
8
|
+
end
|
9
|
+
end
|
10
|
+
describe "when configuring" do
|
11
|
+
it "must support setting the API key" do
|
12
|
+
Appygram.configure :api_key => '123'
|
13
|
+
Appygram::Config.api_key.must_equal '123'
|
14
|
+
end
|
15
|
+
it "must support setting the platform" do
|
16
|
+
Appygram.configure :platform => 'test_plat'
|
17
|
+
Appygram::Config.platform.must_equal 'test_plat'
|
18
|
+
end
|
19
|
+
it "must support setting the software" do
|
20
|
+
Appygram.configure :software => 'test_sw'
|
21
|
+
Appygram::Config.software.must_equal 'test_sw'
|
22
|
+
end
|
23
|
+
it "must support overriding the appygram endpoint" do
|
24
|
+
Appygram.configure :appygram_endpoint => 'http://a/b'
|
25
|
+
Appygram::Config.appygram_endpoint.to_s.must_equal 'http://a/b'
|
26
|
+
end
|
27
|
+
it "must support overriding the trace endpoint" do
|
28
|
+
Appygram.configure :trace_endpoint => 'http://a/b'
|
29
|
+
Appygram::Config.trace_endpoint.to_s.must_equal 'http://a/b'
|
30
|
+
end
|
31
|
+
it "must not clobber values set earlier" do
|
32
|
+
Appygram::Config.platform.must_equal 'test_plat'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/test/network.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'appygram'
|
3
|
+
|
4
|
+
describe Appygram do
|
5
|
+
before do
|
6
|
+
Appygram.configure :api_key => '6135441b70dc91c092fef59cb983f97eada68b75',
|
7
|
+
:appygram_endpoint => 'https://appygram.herokuapp.com/appygrams',
|
8
|
+
:trace_endpoint => 'https://appygram.appspot.com/traces'
|
9
|
+
end
|
10
|
+
describe "When connected to real servers" do
|
11
|
+
it "sends appygrams" do
|
12
|
+
Appygram.send :topic => 'Test', :message => 'This is a test.',
|
13
|
+
:app_json => { 'key' => 'value' }
|
14
|
+
end
|
15
|
+
it "sends traces" do
|
16
|
+
begin
|
17
|
+
raise "boom"
|
18
|
+
rescue StandardError => e
|
19
|
+
Appygram.trace e
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appygram
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-11-03 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Discovers topics and sends messages
|
15
15
|
email:
|
@@ -20,11 +20,13 @@ extra_rdoc_files: []
|
|
20
20
|
files:
|
21
21
|
- .gitignore
|
22
22
|
- Gemfile
|
23
|
-
- README.
|
23
|
+
- README.md
|
24
24
|
- Rakefile
|
25
25
|
- appygram.gemspec
|
26
26
|
- lib/appygram.rb
|
27
27
|
- lib/appygram/version.rb
|
28
|
+
- test/local.rb
|
29
|
+
- test/network.rb
|
28
30
|
homepage: https://github.com/anythinglabs/appygram.rb
|
29
31
|
licenses: []
|
30
32
|
post_install_message:
|
@@ -45,8 +47,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
45
47
|
version: '0'
|
46
48
|
requirements: []
|
47
49
|
rubyforge_project: appygram
|
48
|
-
rubygems_version: 1.8.
|
50
|
+
rubygems_version: 1.8.17
|
49
51
|
signing_key:
|
50
52
|
specification_version: 3
|
51
53
|
summary: Communicate with the Appygram message routing service
|
52
|
-
test_files:
|
54
|
+
test_files:
|
55
|
+
- test/local.rb
|
56
|
+
- test/network.rb
|
57
|
+
has_rdoc:
|
data/README.markdown
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
# Appygram <http://www.appygram.com>
|
2
|
-
|
3
|
-
Appygram is a simple service to handle messages from your web
|
4
|
-
or mobile app. This gem provides communication with the Appygram
|
5
|
-
service via a simple API. Useful features higher in the stack
|
6
|
-
are found in gems that depend on this one, e.g. appygram-rails,
|
7
|
-
which turns uncaught Rails exceptions into appygrams.
|
8
|
-
|
9
|
-
## Installation
|
10
|
-
|
11
|
-
1. Add gem entry to Gemfile
|
12
|
-
|
13
|
-
```ruby
|
14
|
-
gem 'appygram'
|
15
|
-
```
|
16
|
-
|
17
|
-
2. Run <code>bundle install</code>
|
18
|
-
|
19
|
-
3. Configure your API Key in an initializer, e.g. config/appygram.rb
|
20
|
-
|
21
|
-
```ruby
|
22
|
-
Appygram.configure :api_key => 'your_api_key'
|
23
|
-
```
|
24
|
-
|
25
|
-
using a valid API key for your app provided by Appygram
|
26
|
-
|
27
|
-
## Invocation
|
28
|
-
|
29
|
-
```ruby
|
30
|
-
require 'appygram'
|
31
|
-
|
32
|
-
Appygram.send :topic => 'Test', :message => 'This is a test.'
|
33
|
-
```
|
34
|
-
|
35
|
-
## Supported fields in an appygram
|
36
|
-
|
37
|
-
* topic
|
38
|
-
* subject
|
39
|
-
* message
|
40
|
-
* name
|
41
|
-
* email
|
42
|
-
* phone
|
43
|
-
* platform ('web' by default for this connector)
|
44
|
-
* software ('appygram.rb [VERSION]' by default for this connector)
|
45
|
-
|
46
|
-
## Rules for improvement
|
47
|
-
|
48
|
-
* This gem must not have other dependencies.
|
49
|
-
* This gem may take advantage of other gems (e.g. async i/o,
|
50
|
-
background queueing, http pooling) if detected, and the advantage
|
51
|
-
is related directly to communication with the service
|
52
|
-
* Effort should be made to retain parity with other fully supported
|
53
|
-
connectors
|
54
|
-
|
55
|
-
Copyright © 2012 Solertium
|