zenbox 0.0.2
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/Gemfile +5 -0
- data/INSTALL +15 -0
- data/MIT-LICENSE +22 -0
- data/README.md +465 -0
- data/Rakefile +60 -0
- data/contextify.gemspec +22 -0
- data/generators/contextify/contextify_generator.rb +85 -0
- data/generators/contextify/lib/insert_commands.rb +34 -0
- data/generators/contextify/lib/rake_commands.rb +24 -0
- data/generators/contextify/templates/contextify_tasks.rake +25 -0
- data/generators/contextify/templates/initializer.rb +6 -0
- data/install.rb +1 -0
- data/lib/contextify.rb +74 -0
- data/lib/contextify/configuration.rb +115 -0
- data/lib/contextify/rails.rb +19 -0
- data/lib/contextify/railtie.rb +16 -0
- data/lib/contextify/sender.rb +123 -0
- data/lib/contextify/shared_tasks.rb +8 -0
- data/lib/contextify/tasks.rb +50 -0
- data/lib/contextify/user_helper.rb +39 -0
- data/lib/contextify/version.rb +3 -0
- data/lib/rails/generators/contextify/contextify_generator.rb +100 -0
- data/rails/init.rb +1 -0
- data/resources/README.md +46 -0
- data/resources/ca-bundle.crt +3376 -0
- metadata +94 -0
data/Rakefile
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rubygems/package_task'
|
4
|
+
require 'bundler'
|
5
|
+
Bundler::GemHelper.install_tasks
|
6
|
+
|
7
|
+
require './lib/contextify/version'
|
8
|
+
|
9
|
+
namespace :changeling do
|
10
|
+
desc "Bumps the version by a minor or patch version, depending on what was passed in."
|
11
|
+
task :bump, :part do |t, args|
|
12
|
+
# Thanks, Jeweler!
|
13
|
+
if Contextify::VERSION =~ /^(\d+)\.(\d+)\.(\d+)(?:\.(.*?))?$/
|
14
|
+
major = $1.to_i
|
15
|
+
minor = $2.to_i
|
16
|
+
patch = $3.to_i
|
17
|
+
build = $4
|
18
|
+
else
|
19
|
+
abort
|
20
|
+
end
|
21
|
+
|
22
|
+
case args[:part]
|
23
|
+
when /minor/
|
24
|
+
minor += 1
|
25
|
+
patch = 0
|
26
|
+
when /patch/
|
27
|
+
patch += 1
|
28
|
+
else
|
29
|
+
abort
|
30
|
+
end
|
31
|
+
|
32
|
+
version = [major, minor, patch, build].compact.join('.')
|
33
|
+
|
34
|
+
File.open(File.join("lib", "contextify", "version.rb"), "w") do |f|
|
35
|
+
f.write <<EOF
|
36
|
+
module Contextify
|
37
|
+
VERSION = "#{version}".freeze
|
38
|
+
end
|
39
|
+
EOF
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
desc "Bump by a minor version (1.2.3 => 1.3.0)"
|
44
|
+
task :minor do |t|
|
45
|
+
Rake::Task['changeling:bump'].invoke(t.name)
|
46
|
+
end
|
47
|
+
|
48
|
+
desc "Bump by a patch version, (1.2.3 => 1.2.4)"
|
49
|
+
task :patch do |t|
|
50
|
+
Rake::Task['changeling:bump'].invoke(t.name)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
begin
|
55
|
+
require 'yard'
|
56
|
+
YARD::Rake::YardocTask.new do |t|
|
57
|
+
t.files = ['lib/**/*.rb', 'TESTING.rdoc']
|
58
|
+
end
|
59
|
+
rescue LoadError
|
60
|
+
end
|
data/contextify.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "contextify/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = %q{zenbox}
|
7
|
+
s.version = Contextify::VERSION.dup
|
8
|
+
s.summary = %q{Send your user information to our hosted service and contextify your inbox.}
|
9
|
+
|
10
|
+
s.require_paths = ["lib"]
|
11
|
+
s.files = Dir["{generators/**/*,lib/**/*,rails/**/*,resources/*,script/*}"] +
|
12
|
+
%w(contextify.gemspec Gemfile INSTALL MIT-LICENSE Rakefile README.md install.rb)
|
13
|
+
s.test_files = Dir.glob("{test,spec,features}/**/*")
|
14
|
+
|
15
|
+
s.add_runtime_dependency("json")
|
16
|
+
|
17
|
+
s.authors = ["Contextify"]
|
18
|
+
s.email = %q{support@cloudfuji.com}
|
19
|
+
s.homepage = "http://cloudfuji.com"
|
20
|
+
|
21
|
+
s.platform = Gem::Platform::RUBY
|
22
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/lib/insert_commands.rb")
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + "/lib/rake_commands.rb")
|
3
|
+
|
4
|
+
class ContextifyGenerator < Rails::Generator::Base
|
5
|
+
def add_options!(opt)
|
6
|
+
opt.on('-k', '--api-key=token', String, "Your Contextify API key") { |v| options[:api_key] = v}
|
7
|
+
opt.on('-h', '--heroku', "Use the Heroku addon to provide your Contextify API key") { |v| options[:heroku] = v}
|
8
|
+
opt.on('-a', '--app=myapp', String, "Your Heroku app name (only required if deploying to >1 Heroku app)") { |v| options[:app] = v}
|
9
|
+
end
|
10
|
+
|
11
|
+
def manifest
|
12
|
+
if !api_key_configured? && !options[:api_key] && !options[:heroku]
|
13
|
+
puts "Must pass --api-key or --heroku or create config/initializers/contextify.rb"
|
14
|
+
exit
|
15
|
+
end
|
16
|
+
|
17
|
+
record do |m|
|
18
|
+
m.directory 'lib/tasks'
|
19
|
+
m.file 'contextify_tasks.rake', 'lib/tasks/contextify_tasks.rake'
|
20
|
+
|
21
|
+
if api_key_expression
|
22
|
+
if use_initializer?
|
23
|
+
m.template 'initializer.rb', 'config/initializers/contextify.rb',
|
24
|
+
:assigns => {:api_key => api_key_expression}
|
25
|
+
else
|
26
|
+
m.template 'initializer.rb', 'config/contextify.rb',
|
27
|
+
:assigns => {:api_key => api_key_expression}
|
28
|
+
m.append_to 'config/environment.rb', "require 'config/contextify'"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
determine_api_key if heroku?
|
32
|
+
m.rake "contextify:test --trace", :generate_only => true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def api_key_expression
|
37
|
+
s = if options[:api_key]
|
38
|
+
"'#{options[:api_key]}'"
|
39
|
+
elsif options[:heroku]
|
40
|
+
"ENV['CONTEXTIFY_API_KEY']"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def determine_api_key
|
45
|
+
puts "Attempting to determine your API key from Heroku..."
|
46
|
+
ENV['CONTEXTIFY_API_KEY'] = heroku_api_key
|
47
|
+
if ENV['CONTEXTIFY_API_KEY'].blank?
|
48
|
+
puts "... Failed."
|
49
|
+
puts "WARNING: We were unable to detect the Contextify API key from your Heroku environment."
|
50
|
+
puts "Your Heroku application environment may not be configured correctly."
|
51
|
+
exit 1
|
52
|
+
else
|
53
|
+
puts "... Done."
|
54
|
+
puts "Heroku's Contextify API key is '#{ENV['CONTEXTIFY_API_KEY']}'"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def heroku_var(var,app_name = nil)
|
59
|
+
app = app_name ? "--app #{app_name}" : ''
|
60
|
+
`heroku config #{app} | grep -E "#{var.upcase}" | awk '{ print $3; }'`.strip
|
61
|
+
end
|
62
|
+
|
63
|
+
def heroku_api_key
|
64
|
+
heroku_var("contextify_api_key",options[:app]).split.find {|x| x unless x.blank?}
|
65
|
+
end
|
66
|
+
|
67
|
+
def heroku?
|
68
|
+
options[:heroku] ||
|
69
|
+
system("grep CONTEXTIFY_API_KEY config/initializers/contextify.rb") ||
|
70
|
+
system("grep CONTEXTIFY_API_KEY config/environment.rb")
|
71
|
+
end
|
72
|
+
|
73
|
+
def use_initializer?
|
74
|
+
Rails::VERSION::MAJOR > 1
|
75
|
+
end
|
76
|
+
|
77
|
+
def api_key_configured?
|
78
|
+
File.exists?('config/initializers/contextify.rb') ||
|
79
|
+
system("grep Contextify config/environment.rb")
|
80
|
+
end
|
81
|
+
|
82
|
+
def plugin_is_present?
|
83
|
+
File.exists?('vendor/plugins/contextify')
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# Mostly pinched from http://github.com/ryanb/nifty-generators/tree/master
|
2
|
+
|
3
|
+
Rails::Generator::Commands::Base.class_eval do
|
4
|
+
def file_contains?(relative_destination, line)
|
5
|
+
File.read(destination_path(relative_destination)).include?(line)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
Rails::Generator::Commands::Create.class_eval do
|
10
|
+
def append_to(file, line)
|
11
|
+
logger.insert "#{line} appended to #{file}"
|
12
|
+
unless options[:pretend] || file_contains?(file, line)
|
13
|
+
File.open(file, "a") do |file|
|
14
|
+
file.puts
|
15
|
+
file.puts line
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Rails::Generator::Commands::Destroy.class_eval do
|
22
|
+
def append_to(file, line)
|
23
|
+
logger.remove "#{line} removed from #{file}"
|
24
|
+
unless options[:pretend]
|
25
|
+
gsub_file file, "\n#{line}", ''
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
Rails::Generator::Commands::List.class_eval do
|
31
|
+
def append_to(file, line)
|
32
|
+
logger.insert "#{line} appended to #{file}"
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Rails::Generator::Commands::Create.class_eval do
|
2
|
+
def rake(cmd, opts = {})
|
3
|
+
logger.rake "rake #{cmd}"
|
4
|
+
unless system("rake #{cmd}")
|
5
|
+
logger.rake "#{cmd} failed. Rolling back"
|
6
|
+
command(:destroy).invoke!
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
Rails::Generator::Commands::Destroy.class_eval do
|
12
|
+
def rake(cmd, opts = {})
|
13
|
+
unless opts[:generate_only]
|
14
|
+
logger.rake "rake #{cmd}"
|
15
|
+
system "rake #{cmd}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
Rails::Generator::Commands::List.class_eval do
|
21
|
+
def rake(cmd, opts = {})
|
22
|
+
logger.rake "rake #{cmd}"
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Don't load anything when running the gems:* tasks.
|
2
|
+
# Otherwise, contextify will be considered a framework gem.
|
3
|
+
# https://thoughtbot.lighthouseapp.com/projects/14221/tickets/629
|
4
|
+
unless ARGV.any? {|a| a =~ /^gems/}
|
5
|
+
|
6
|
+
Dir[File.join(Rails.root, 'vendor', 'gems', 'contextify-*')].each do |vendored_notifier|
|
7
|
+
$: << File.join(vendored_notifier, 'lib')
|
8
|
+
end
|
9
|
+
|
10
|
+
begin
|
11
|
+
require 'contextify/tasks'
|
12
|
+
rescue LoadError => exception
|
13
|
+
namespace :contextify do
|
14
|
+
%w(deploy test log_stdout).each do |task_name|
|
15
|
+
desc "Missing dependency for contextify:#{task_name}"
|
16
|
+
task task_name do
|
17
|
+
$stderr.puts "Failed to run contextify:#{task_name} because of missing dependency."
|
18
|
+
$stderr.puts "You probably need to run `rake gems:install` to install the contextify gem"
|
19
|
+
abort exception.inspect
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
data/install.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
puts IO.read(File.join(File.dirname(__FILE__), 'INSTALL'))
|
data/lib/contextify.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'net/https'
|
3
|
+
require 'rubygems'
|
4
|
+
require 'contextify/version'
|
5
|
+
require 'contextify/configuration'
|
6
|
+
require 'contextify/sender'
|
7
|
+
require 'contextify/user_helper'
|
8
|
+
|
9
|
+
require 'contextify/railtie' if defined?(Rails::Railtie)
|
10
|
+
|
11
|
+
module Contextify
|
12
|
+
API_VERSION = "1.0"
|
13
|
+
LOG_PREFIX = "** [Contextify] "
|
14
|
+
|
15
|
+
class << self
|
16
|
+
# The sender object is responsible for delivering formatted data to the Contextify server.
|
17
|
+
# Must respond to #send_to_contextify. See Contextify::Sender.
|
18
|
+
attr_accessor :sender
|
19
|
+
|
20
|
+
# Names the Contextify model we should be watching. Set
|
21
|
+
# automatically when using contextify_user
|
22
|
+
attr_accessor :model
|
23
|
+
|
24
|
+
# A Contextify configuration object. Must act like a hash and return sensible
|
25
|
+
# values for all Contextify configuration options. See Contextify::Configuration.
|
26
|
+
attr_writer :configuration
|
27
|
+
|
28
|
+
# Prints out the response body from Contextify for debugging help
|
29
|
+
def report_response_body(response)
|
30
|
+
write_verbose_log("Response from Contextify: \n#{response}")
|
31
|
+
end
|
32
|
+
|
33
|
+
# Writes out the given message to the #logger
|
34
|
+
def write_verbose_log(message)
|
35
|
+
logger.info LOG_PREFIX + message if logger
|
36
|
+
end
|
37
|
+
|
38
|
+
# Look for the Rails logger currently defined
|
39
|
+
def logger
|
40
|
+
self.configuration.logger
|
41
|
+
end
|
42
|
+
|
43
|
+
# Call this method to modify defaults in your initializers.
|
44
|
+
#
|
45
|
+
# @example
|
46
|
+
# Contextify.configure do |config|
|
47
|
+
# config.api_key = '1234567890abcdef'
|
48
|
+
# config.secure = false
|
49
|
+
# end
|
50
|
+
def configure(silent = false)
|
51
|
+
yield(configuration)
|
52
|
+
self.sender = Sender.new(configuration)
|
53
|
+
end
|
54
|
+
|
55
|
+
# The configuration object.
|
56
|
+
# @see Contextify.configure
|
57
|
+
def configuration
|
58
|
+
@configuration ||= Configuration.new
|
59
|
+
end
|
60
|
+
|
61
|
+
# Sends data to contextify
|
62
|
+
#
|
63
|
+
# @param [String] email The email address you want to send data about.
|
64
|
+
# @param [Hash] opts Data that will be sent to Contextify.
|
65
|
+
def post(email, data)
|
66
|
+
post_data = {
|
67
|
+
:api_key => configuration.api_key,
|
68
|
+
:email => email,
|
69
|
+
:data => data.to_json
|
70
|
+
}
|
71
|
+
sender.send_to_contextify(post_data)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
module Contextify
|
2
|
+
# Used to set up and modify settings for the notifier.
|
3
|
+
class Configuration
|
4
|
+
|
5
|
+
OPTIONS = [:api_key, :host, :http_open_timeout, :http_read_timeout,
|
6
|
+
:port, :proxy_host, :proxy_pass, :proxy_port, :proxy_user, :secure,
|
7
|
+
:use_system_ssl_cert_chain].freeze
|
8
|
+
|
9
|
+
|
10
|
+
# The API key for your Contextify account.
|
11
|
+
attr_accessor :api_key
|
12
|
+
|
13
|
+
# The host to connect to (defaults to contextify.me).
|
14
|
+
attr_accessor :host
|
15
|
+
|
16
|
+
# The port on which your Contextify server runs (defaults to 443 for secure
|
17
|
+
# connections, 80 for insecure connections).
|
18
|
+
attr_accessor :port
|
19
|
+
|
20
|
+
# +true+ for https connections, +false+ for http connections.
|
21
|
+
attr_accessor :secure
|
22
|
+
|
23
|
+
# +true+ to use whatever CAs OpenSSL has installed on your system. +false+ to use the ca-bundle.crt file included in Contextify itself (recommended and default)
|
24
|
+
attr_accessor :use_system_ssl_cert_chain
|
25
|
+
|
26
|
+
# The HTTP open timeout in seconds (defaults to 2).
|
27
|
+
attr_accessor :http_open_timeout
|
28
|
+
|
29
|
+
# The HTTP read timeout in seconds (defaults to 5).
|
30
|
+
attr_accessor :http_read_timeout
|
31
|
+
|
32
|
+
# The hostname of your proxy server (if using a proxy)
|
33
|
+
attr_accessor :proxy_host
|
34
|
+
|
35
|
+
# The port of your proxy server (if using a proxy)
|
36
|
+
attr_accessor :proxy_port
|
37
|
+
|
38
|
+
# The username to use when logging into your proxy server (if using a proxy)
|
39
|
+
attr_accessor :proxy_user
|
40
|
+
|
41
|
+
# The password to use when logging into your proxy server (if using a proxy)
|
42
|
+
attr_accessor :proxy_pass
|
43
|
+
|
44
|
+
# The logger used by Contextify
|
45
|
+
attr_accessor :logger
|
46
|
+
|
47
|
+
alias_method :secure?, :secure
|
48
|
+
alias_method :use_system_ssl_cert_chain?, :use_system_ssl_cert_chain
|
49
|
+
|
50
|
+
def initialize
|
51
|
+
@secure = false
|
52
|
+
@use_system_ssl_cert_chain= false
|
53
|
+
@host = 'contextify.me'
|
54
|
+
@http_open_timeout = 2
|
55
|
+
@http_read_timeout = 5
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
# Allows config options to be read like a hash
|
60
|
+
#
|
61
|
+
# @param [Symbol] option Key for a given attribute
|
62
|
+
def [](option)
|
63
|
+
send(option)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Returns a hash of all configurable options
|
67
|
+
def to_hash
|
68
|
+
OPTIONS.inject({}) do |hash, option|
|
69
|
+
hash.merge(option.to_sym => send(option))
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Returns a hash of all configurable options merged with +hash+
|
74
|
+
#
|
75
|
+
# @param [Hash] hash A set of configuration options that will take precedence over the defaults
|
76
|
+
def merge(hash)
|
77
|
+
to_hash.merge(hash)
|
78
|
+
end
|
79
|
+
|
80
|
+
def port
|
81
|
+
@port || default_port
|
82
|
+
end
|
83
|
+
|
84
|
+
def protocol
|
85
|
+
if secure?
|
86
|
+
'https'
|
87
|
+
else
|
88
|
+
'http'
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def ca_bundle_path
|
93
|
+
if use_system_ssl_cert_chain? && File.exist?(OpenSSL::X509::DEFAULT_CERT_FILE)
|
94
|
+
OpenSSL::X509::DEFAULT_CERT_FILE
|
95
|
+
else
|
96
|
+
local_cert_path # ca-bundle.crt built from source, see resources/README.md
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def local_cert_path
|
101
|
+
File.expand_path(File.join("..", "..", "..", "resources", "ca-bundle.crt"), __FILE__)
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
def default_port
|
106
|
+
if secure?
|
107
|
+
443
|
108
|
+
else
|
109
|
+
80
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|