informant-rails 2.1.0 → 2.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
  SHA256:
3
- metadata.gz: '09cbcd0c5777f13bb8349e55a5ce8fcb632a9440e2e74b3d689caa42a827dcd7'
4
- data.tar.gz: 271fbd0dbfb43bfd7b77b3baa557838b6edd00c8c14bfd1086e66e018ff9dccf
3
+ metadata.gz: 69200fabf6b1767d2cb6a26d3a9c46e7c3c8fdb1d3d08a3ad9b63a919a0bc8c8
4
+ data.tar.gz: dbd81e0ed5e7c86ea0afa48a7bd0587d55b2f647ec896a09534e6571a25eee70
5
5
  SHA512:
6
- metadata.gz: b4c230402306aedf9f97ac782ed3326d422a6af5ba616555c99f0daa4e6a102cce4b97ac63c0410a3581e651253e4f75b635cf6ace522626cb5ada7aeab64441
7
- data.tar.gz: 607df63cd48e566a382040bb5953a3e194536ce5a8f3dfc6f72e4b51b09e8713fb748710eb6c82f311e960c1cddaf9978956fb8b36c99e0d42ef3c8da83bb970
6
+ metadata.gz: c9220c0cfc3ddb9d4a5845851b31b50d2d6d6b53963ae9cb2b657c15fd179cb67a506c0e9a4b8ac77fb209e5c7945ecac06e930df40af7aeb714a0a018226bf9
7
+ data.tar.gz: 2746d2d97cae5c6fc47b67fe223e9bf097d08f72de1c1ac06cfa3bd14bcb0773be649b3d63b2eb061619d8a19ade22c1348c32be7c3f0626cbebb0320eab75b9
@@ -8,12 +8,11 @@ The informant-rails gem provides Rails and ActiveRecord hooks for The Informant.
8
8
 
9
9
  ## Compatibility
10
10
 
11
- The informant-rails gem officially supports Ruby 2.0+.
11
+ The informant-rails gem officially supports Ruby 2.5+.
12
12
 
13
- It will work automatically with Rails 3 and up as well as Mongoid 3 and up.
13
+ It will work automatically with Rails 5.2+ as well as Mongoid 6.2 and up.
14
14
 
15
- [![Build Status](https://travis-ci.org/informantapp/informant-rails.svg?branch=master)](https://travis-ci.org/informantapp/informant-rails)
16
- [![Code Climate](https://codeclimate.com/github/informantapp/informant-rails.png)](https://codeclimate.com/github/informantapp/informant-rails)
15
+ [![pipeline status](https://gitlab.com/informantapp/informant-rails/badges/master/pipeline.svg)](https://gitlab.com/informantapp/informant-rails/-/commits/master)
17
16
 
18
17
  ## Installation
19
18
 
@@ -28,6 +27,10 @@ It will work automatically with Rails 3 and up as well as Mongoid 3 and up.
28
27
  4. Deploy with the gem installed
29
28
  5. Submit a form and you'll see it appear in our web interface
30
29
 
30
+ We've set up
31
+ [informant-rails-example](https://gitlab.com/informantapp/informant-rails-example)
32
+ as a demonstrate of installation and operation.
33
+
31
34
  ## Usage
32
35
 
33
36
  By default, any request that causes an ActiveRecord or Mongoid model to be validated will be tracked by the Informant once the gem is added to your project.
data/Rakefile CHANGED
@@ -1,12 +1,12 @@
1
- require "bundler/setup"
2
- require "bundler/gem_tasks"
1
+ require 'bundler/setup'
2
+ require 'bundler/gem_tasks'
3
3
 
4
- if !ENV["APPRAISAL_INITIALIZED"] && !ENV["TRAVIS"]
5
- require "appraisal/task"
4
+ if !ENV['APPRAISAL_INITIALIZED']
5
+ require 'appraisal/task'
6
6
  Appraisal::Task.new
7
7
  task default: :appraisal
8
8
  else
9
- require "rspec/core/rake_task"
9
+ require 'rspec/core/rake_task'
10
10
  RSpec::Core::RakeTask.new
11
11
  task default: :spec
12
12
  end
@@ -3,23 +3,15 @@ if defined?(Rake)
3
3
  Dir[File.join(File.dirname(__FILE__), 'tasks', '**/*.rake')].each { |rake| load rake }
4
4
  end
5
5
 
6
+ require 'informant-common'
7
+
6
8
  module InformantRails
7
9
  autoload :Config, 'informant-rails/config'
8
10
  autoload :Diagnostic, 'informant-rails/diagnostic'
9
- autoload :Client, 'informant-rails/client'
10
- autoload :FieldError, 'informant-rails/field_error'
11
11
  autoload :Middleware, 'informant-rails/middleware'
12
- autoload :Model, 'informant-rails/model'
13
- autoload :ParameterFilter, 'informant-rails/parameter_filter'
14
12
  autoload :RequestTracking, 'informant-rails/request_tracking'
15
13
  autoload :ValidationTracking, 'informant-rails/validation_tracking'
16
14
  autoload :VERSION, 'informant-rails/version'
17
-
18
- module Event
19
- autoload :Base, 'informant-rails/event/base'
20
- autoload :ClientInfo, 'informant-rails/event/client_info'
21
- autoload :FormSubmission, 'informant-rails/event/form_submission'
22
- end
23
15
  end
24
16
 
25
17
  require 'informant-rails/railtie'
@@ -1,24 +1,13 @@
1
- module InformantRails::Config
2
- extend self
3
-
4
- attr_accessor :api_token, :exclude_models, :filter_parameters, :value_tracking
5
-
6
- self.api_token
7
- self.exclude_models = []
8
- self.filter_parameters = []
9
- self.value_tracking = true
10
-
11
- def configure; yield self end
12
-
13
- def self.client_identifier
14
- @client_identifier ||= "informant-rails-#{InformantRails::VERSION}"
15
- end
16
-
17
- def self.enabled?
18
- api_token.present?
19
- end
20
-
21
- def self.collector_host
22
- @collector_host ||= ENV['INFORMANT_COLLECTOR_HOST'] || 'https://collector-api.informantapp.com'
1
+ module InformantRails
2
+ module Config
3
+ extend self
4
+
5
+ delegate :api_token, :api_token=,
6
+ :collector_host,
7
+ :enabled?,
8
+ :exclude_models, :exclude_models=,
9
+ :filter_parameters, :filter_parameters=,
10
+ :value_tracking?, :value_tracking=,
11
+ to: InformantCommon::Config
23
12
  end
24
13
  end
@@ -1,34 +1,23 @@
1
1
  class TestClass
2
- def errors
3
- {
4
- field_name: 'must be unique'
5
- }
6
- end
2
+ include ActiveModel::Model
7
3
 
8
- def [](field)
9
- 'field_value'
10
- end
4
+ attr_accessor :field_name
5
+
6
+ validates_presence_of :field_name
11
7
  end
12
8
 
13
9
  module InformantRails
14
10
  class Diagnostic
15
- def self.run; new.run end
11
+ def self.run
12
+ new.run
13
+ end
16
14
 
17
15
  def run
18
16
  if Config.api_token.blank?
19
17
  Rails.logger.info missing_api_token_message
20
18
  else
21
- form_submission = InformantRails::Event::FormSubmission.new
22
- form_submission.filename = 'Connectivity'
23
- form_submission.action = 'test'
24
- form_submission.process_model(TestClass.new)
25
- response = Client.transmit(form_submission).join.value
26
-
27
- if response.code == '204'
28
- Rails.logger.info success_message
29
- else
30
- Rails.logger.info bad_response_message(response.body)
31
- end
19
+ response = InformantCommon::Client.transmit(test_form_submission).join.value
20
+ display_response_message(response)
32
21
  end
33
22
 
34
23
  Rails.logger.info assistance_message
@@ -54,11 +43,26 @@ module InformantRails
54
43
  end
55
44
 
56
45
  def success_message
57
- "Everything looks good. You should see a test request on your dashboard."
46
+ 'Everything looks good. You should see a test request on your dashboard.'
58
47
  end
59
48
 
60
49
  def assistance_message
61
50
  "If you need assistance or have any questions, send an email to support@informantapp.com or tweet @informantapp and we'll help you out!"
62
51
  end
52
+
53
+ def test_form_submission
54
+ InformantCommon::Event::FormSubmission.new.tap do |form_submission|
55
+ form_submission.handler = 'Connectivity#test'
56
+ form_submission.process_model(InformantCommon::Model::ActiveModel.new(TestClass.new.tap(&:valid?)))
57
+ end
58
+ end
59
+
60
+ def display_response_message(response)
61
+ if response.code == '204'
62
+ Rails.logger.info success_message
63
+ else
64
+ Rails.logger.info bad_response_message(response.body)
65
+ end
66
+ end
63
67
  end
64
68
  end
@@ -1,9 +1,13 @@
1
1
  module InformantRails
2
- class Middleware < Struct.new(:app)
2
+ class Middleware
3
+ def initialize(app)
4
+ @app = app
5
+ end
6
+
3
7
  def call(env)
4
- Client.record(env)
5
- response = app.call(env)
6
- Client.process
8
+ InformantCommon::Client.start_transaction!(env['REQUEST_METHOD'])
9
+ response = @app.call(env)
10
+ InformantCommon::Client.process
7
11
  response
8
12
  end
9
13
  end
@@ -1,11 +1,14 @@
1
1
  module InformantRails
2
2
  class Railtie < ::Rails::Railtie
3
3
  initializer 'informant' do |config|
4
- Config.api_token ||= ENV['INFORMANT_API_KEY']
5
-
6
4
  begin
7
5
  if Config.enabled?
8
- InformantRails::Client.log_client_info
6
+ InformantCommon::Client.transmit(
7
+ InformantCommon::Event::AgentInfo.new(
8
+ agent_identifier: "informant-rails-#{InformantRails::VERSION}",
9
+ framework_version: "rails-#{Rails.version}"
10
+ )
11
+ )
9
12
  InformantRails::Config.filter_parameters = Rails.configuration.filter_parameters
10
13
 
11
14
  config.middleware.use InformantRails::Middleware
@@ -22,8 +25,8 @@ module InformantRails
22
25
  include InformantRails::ValidationTracking
23
26
  end
24
27
  end
25
- rescue
26
- puts "Unable to bootstrap informant."
28
+ rescue StandardError => e
29
+ puts "Unable to bootstrap informant: #{e.message}"
27
30
  end
28
31
  end
29
32
  end
@@ -5,11 +5,11 @@ module InformantRails
5
5
  included do
6
6
  if defined? before_action
7
7
  before_action do
8
- InformantRails::Client.record_action(controller_name, action_name)
8
+ InformantCommon::Client.current_transaction&.handler = [controller_name, action_name].join('#')
9
9
  end
10
10
  else
11
11
  before_filter do
12
- InformantRails::Client.record_action(controller_name, action_name)
12
+ InformantCommon::Client.current_transaction&.handler = [controller_name, action_name].join('#')
13
13
  end
14
14
  end
15
15
  end
@@ -3,9 +3,7 @@ module InformantRails
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- set_callback(:validate, :after) do
7
- InformantRails::Client.record_validated_model(self)
8
- end
6
+ include InformantCommon::ValidationTracking
9
7
  end
10
8
  end
11
9
  end
@@ -1,3 +1,3 @@
1
1
  module InformantRails
2
- VERSION = '2.1.0'
2
+ VERSION = '2.2.0'.freeze
3
3
  end
@@ -1,9 +1,7 @@
1
1
  namespace :informant do
2
-
3
- desc "Verify connectivity from your app to Informant"
4
- task :diagnostic => :environment do
2
+ desc 'Verify connectivity from your app to Informant'
3
+ task diagnostic: :environment do
5
4
  Rails.logger = Logger.new(STDOUT)
6
5
  InformantRails::Diagnostic.run
7
6
  end
8
-
9
7
  end
metadata CHANGED
@@ -1,22 +1,36 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: informant-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Informant, LLC
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-07 00:00:00.000000000 Z
11
+ date: 2020-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: informant-common
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.1.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.1.1
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rails
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - ">="
18
32
  - !ruby/object:Gem::Version
19
- version: 3.2.0
33
+ version: 5.2.0
20
34
  - - "<"
21
35
  - !ruby/object:Gem::Version
22
36
  version: 7.0.0
@@ -26,10 +40,24 @@ dependencies:
26
40
  requirements:
27
41
  - - ">="
28
42
  - !ruby/object:Gem::Version
29
- version: 3.2.0
43
+ version: 5.2.0
30
44
  - - "<"
31
45
  - !ruby/object:Gem::Version
32
46
  version: 7.0.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: appraisal
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
33
61
  description: The Informant tracks what users do wrong in your forms so you can make
34
62
  them better.
35
63
  email:
@@ -42,16 +70,9 @@ files:
42
70
  - README.markdown
43
71
  - Rakefile
44
72
  - lib/informant-rails.rb
45
- - lib/informant-rails/client.rb
46
73
  - lib/informant-rails/config.rb
47
74
  - lib/informant-rails/diagnostic.rb
48
- - lib/informant-rails/event/base.rb
49
- - lib/informant-rails/event/client_info.rb
50
- - lib/informant-rails/event/form_submission.rb
51
- - lib/informant-rails/field_error.rb
52
75
  - lib/informant-rails/middleware.rb
53
- - lib/informant-rails/model.rb
54
- - lib/informant-rails/parameter_filter.rb
55
76
  - lib/informant-rails/railtie.rb
56
77
  - lib/informant-rails/request_tracking.rb
57
78
  - lib/informant-rails/validation_tracking.rb
@@ -76,8 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
97
  - !ruby/object:Gem::Version
77
98
  version: '0'
78
99
  requirements: []
79
- rubyforge_project:
80
- rubygems_version: 2.7.8
100
+ rubygems_version: 3.0.3
81
101
  signing_key:
82
102
  specification_version: 4
83
103
  summary: The Informant tracks server-side validation errors and gives you metrics
@@ -1,70 +0,0 @@
1
- require 'net/http'
2
-
3
- module InformantRails
4
- class Client
5
- def self.enabled?; @enabled end
6
- def self.disable!; @enabled = false end
7
- def self.enable!; @enabled = true end
8
- enable!
9
-
10
- def self.supported_request_methods
11
- @supported_request_methods ||= %w(POST PATCH PUT DELETE)
12
- end
13
-
14
- def self.record(env)
15
- new_request if enabled? && supported_request_methods.include?(env['REQUEST_METHOD'])
16
- end
17
-
18
- def self.record_action(controller_name, action)
19
- if request
20
- request.filename = controller_name
21
- request.action = action
22
- end
23
- end
24
-
25
- def self.record_validated_model(model)
26
- request.process_model(model) if request && include_model?(model)
27
- end
28
-
29
- def self.process
30
- if request && request.models.any?
31
- this_request = request
32
- transmit(this_request)
33
- end
34
- ensure
35
- cleanup
36
- end
37
-
38
- def self.request
39
- Thread.current[:informant_request]
40
- end
41
-
42
- def self.cleanup
43
- Thread.current[:informant_request] = nil
44
- end
45
-
46
- def self.transmit(event)
47
- Thread.new(Client) do |client_class|
48
- Net::HTTP.start(*event.net_http_start_arguments) do |http|
49
- response = http.request(event.post_request)
50
- client_class.disable! if response.code == '401'
51
- response
52
- end
53
- end
54
- end
55
-
56
- def self.log_client_info
57
- transmit(InformantRails::Event::ClientInfo.new)
58
- end
59
-
60
- private
61
-
62
- def self.include_model?(model)
63
- !Config.exclude_models.include?(model.class.to_s)
64
- end
65
-
66
- def self.new_request
67
- Thread.current[:informant_request] = Event::FormSubmission.new
68
- end
69
- end
70
- end
@@ -1,25 +0,0 @@
1
- module InformantRails::Event
2
- class Base
3
- def self.endpoint
4
- raise 'Must implement'
5
- end
6
- def endpoint; self.class.endpoint end
7
-
8
- def self.authorization_header_value
9
- @authorization_header_value ||= ActionController::HttpAuthentication::Token.encode_credentials(InformantRails::Config.api_token)
10
- end
11
- def authorization_header_value; self.class.authorization_header_value end
12
-
13
- def post_request
14
- Net::HTTP::Post.new(endpoint, {
15
- "Authorization" => authorization_header_value,
16
- "Content-Type" => "application/json"
17
- }).tap { |r| r.body = to_json }
18
- end
19
-
20
- def self.net_http_start_arguments
21
- @net_http_start_arguments ||= [endpoint.host, endpoint.port, use_ssl: endpoint.scheme == 'https']
22
- end
23
- def net_http_start_arguments; self.class.net_http_start_arguments end
24
- end
25
- end
@@ -1,16 +0,0 @@
1
- module InformantRails::Event
2
- class ClientInfo < Base
3
- def as_json(*args)
4
- {
5
- agent_identifier: InformantRails::Config.client_identifier,
6
- framework_version: "rails-#{Rails.version}",
7
- runtime_version: "ruby-#{RUBY_VERSION}",
8
- mongoid_version: defined?(Mongoid) ? Mongoid::VERSION : nil
9
- }
10
- end
11
-
12
- def self.endpoint
13
- @endpoint ||= URI("#{InformantRails::Config.collector_host}/v2/client-info")
14
- end
15
- end
16
- end
@@ -1,36 +0,0 @@
1
- module InformantRails::Event
2
- class FormSubmission < Base
3
- attr_accessor :filename, :action
4
-
5
- def process_model(model)
6
- if model && untracked?(model)
7
- models << InformantRails::Model.new(model)
8
- end
9
- end
10
-
11
- def models
12
- @models ||= []
13
- end
14
-
15
- def as_json(*args)
16
- {
17
- name: [filename, action].compact.join('#'),
18
- models: models.map(&:as_json)
19
- }
20
- end
21
-
22
- def self.endpoint
23
- @endpoint ||= URI("#{InformantRails::Config.collector_host}/v2/form-submissions")
24
- end
25
-
26
- protected
27
-
28
- def rails_version
29
- @rails_version ||= Rails.version
30
- end
31
-
32
- def untracked?(model)
33
- !models.detect { |container| container.model == model }
34
- end
35
- end
36
- end
@@ -1,19 +0,0 @@
1
- module InformantRails
2
- class FieldError
3
- attr_accessor :name, :value, :message
4
-
5
- def initialize(name, value, message=nil)
6
- self.name = name
7
- self.value = value
8
- self.message = message
9
- end
10
-
11
- def value=(value)
12
- @value = InformantRails::ParameterFilter.filter(name, value)
13
- end
14
-
15
- def as_json(*args)
16
- { name: name, value: value, message: message }
17
- end
18
- end
19
- end
@@ -1,17 +0,0 @@
1
- module InformantRails
2
- class Model < Struct.new(:model)
3
- def name
4
- model.class.name
5
- end
6
-
7
- def errors
8
- model.errors.map do |field, error|
9
- InformantRails::FieldError.new(field.to_s, model[field], error)
10
- end
11
- end
12
-
13
- def as_json(*args)
14
- { name: name, errors: errors.map(&:as_json) }
15
- end
16
- end
17
- end
@@ -1,13 +0,0 @@
1
- module InformantRails
2
- class ParameterFilter
3
- def self.filter(name, value)
4
- Config.value_tracking && !matcher.match(name) ? value : '[FILTERED]'
5
- end
6
-
7
- protected
8
-
9
- def self.matcher
10
- @matcher ||= Regexp.new(/#{Config.filter_parameters.join('|').presence || '$^'}/)
11
- end
12
- end
13
- end