userlist-rails 0.2.1 → 0.5.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.
@@ -1,12 +1,21 @@
1
1
  require 'userlist/config'
2
2
 
3
+ require 'userlist/rails/transforms/user'
4
+ require 'userlist/rails/transforms/company'
5
+ require 'userlist/rails/transforms/relationship'
6
+
3
7
  module Userlist
4
8
  module Rails
5
9
  module Config
6
10
  DEFAULT_CONFIGURATION = {
7
11
  user_model: nil,
8
12
  company_model: nil,
9
- auto_discover: true
13
+ relationship_model: nil,
14
+ auto_discover: true,
15
+ script_url: 'https://js.userlist.com/v1',
16
+ user_transform: Userlist::Rails::Transforms::User,
17
+ company_transform: Userlist::Rails::Transforms::Company,
18
+ relationship_transform: Userlist::Rails::Transforms::Relationship
10
19
  }.freeze
11
20
 
12
21
  def default_config
@@ -18,13 +27,15 @@ module Userlist
18
27
  end
19
28
 
20
29
  def user_model
21
- model = super
22
- model && model.to_s.constantize
30
+ (model = super) && model.is_a?(Class) ? model : model&.to_s&.constantize
23
31
  end
24
32
 
25
33
  def company_model
26
- model = super
27
- model && model.to_s.constantize
34
+ (model = super) && model.is_a?(Class) ? model : model&.to_s&.constantize
35
+ end
36
+
37
+ def relationship_model
38
+ (model = super) && model.is_a?(Class) ? model : model&.to_s&.constantize
28
39
  end
29
40
 
30
41
  Userlist::Config.send(:prepend, self)
@@ -0,0 +1,30 @@
1
+ module Userlist
2
+ module Rails
3
+ module Extensions
4
+ module Company
5
+ module ClassMethods
6
+ def from_payload(payload, config = Userlist.config)
7
+ company_model = config.company_model
8
+ company_transform = config.company_transform
9
+
10
+ payload = company_transform.new(payload, config) if company_model && payload.is_a?(company_model)
11
+
12
+ super
13
+ end
14
+ end
15
+
16
+ def self.included(base)
17
+ base.extend(ClassMethods)
18
+ end
19
+
20
+ def push?
21
+ super && (!payload.respond_to?(:push?) || payload.push?)
22
+ end
23
+
24
+ def delete?
25
+ super && (!payload.respond_to?(:delete?) || payload.delete?)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ module Userlist
2
+ module Rails
3
+ module Extensions
4
+ module Event
5
+ module ClassMethods
6
+ def new(payload, config = Userlist.config)
7
+ payload[:user] = Userlist::Rails.current_user unless payload.key?(:user)
8
+ payload[:company] = Userlist::Rails.current_company unless payload.key?(:company)
9
+
10
+ super
11
+ end
12
+ end
13
+
14
+ def self.included(base)
15
+ base.extend(ClassMethods)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,30 @@
1
+ module Userlist
2
+ module Rails
3
+ module Extensions
4
+ module Relationship
5
+ module ClassMethods
6
+ def from_payload(payload, config = Userlist.config)
7
+ relationship_model = config.relationship_model
8
+ relationship_transform = config.relationship_transform
9
+
10
+ payload = relationship_transform.new(payload, config) if relationship_model && payload.is_a?(relationship_model)
11
+
12
+ super
13
+ end
14
+ end
15
+
16
+ def self.included(base)
17
+ base.extend(ClassMethods)
18
+ end
19
+
20
+ def push?
21
+ super && (!payload.respond_to?(:push?) || payload.push?)
22
+ end
23
+
24
+ def delete?
25
+ super && (!payload.respond_to?(:delete?) || payload.delete?)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ module Userlist
2
+ module Rails
3
+ module Extensions
4
+ module User
5
+ module ClassMethods
6
+ def from_payload(payload, config = Userlist.config)
7
+ user_model = config.user_model
8
+ user_transform = config.user_transform
9
+
10
+ payload = user_transform.new(payload, config) if user_model && payload.is_a?(user_model)
11
+
12
+ super
13
+ end
14
+ end
15
+
16
+ def self.included(base)
17
+ base.extend(ClassMethods)
18
+ end
19
+
20
+ def push?
21
+ super && (!payload.respond_to?(:push?) || payload.push?)
22
+ end
23
+
24
+ def delete?
25
+ super && (!payload.respond_to?(:delete?) || payload.delete?)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,31 @@
1
+ module Userlist
2
+ module Rails
3
+ module Helpers
4
+ def userlist_script_tag(*args) # rubocop:disable Metrics/CyclomaticComplexity
5
+ config = Userlist.config
6
+ logger = Userlist.logger
7
+
8
+ options = args.extract_options!
9
+
10
+ user = args.first
11
+ user ||= current_user if respond_to?(:current_user)
12
+ user ||= Userlist::Rails.current_user
13
+
14
+ options[:async] = true
15
+
16
+ if user
17
+ options[:data] ||= {}
18
+ options[:data][:userlist] = Userlist::Token.generate(user, config)
19
+ end
20
+
21
+ script_tag = javascript_tag('window.userlist=window.userlist||function(){(userlist.q=userlist.q||[]).push(arguments)};')
22
+ include_tag = javascript_include_tag(config.script_url, options)
23
+
24
+ script_tag + include_tag
25
+ rescue Userlist::Error => e
26
+ logger.error(e.message)
27
+ raw("<!-- #{e.class}: #{e.message} -->") unless ::Rails.env.production?
28
+ end
29
+ end
30
+ end
31
+ end
@@ -3,29 +3,46 @@ require 'rails/railtie'
3
3
  require 'userlist'
4
4
  require 'userlist/config'
5
5
  require 'userlist/rails/logger'
6
- require 'userlist/rails/push'
7
- require 'userlist/rails/user'
8
- require 'userlist/rails/company'
6
+
7
+ require 'userlist/rails/extensions/user'
8
+ require 'userlist/rails/extensions/company'
9
+ require 'userlist/rails/extensions/relationship'
10
+ require 'userlist/rails/extensions/event'
11
+
12
+ require 'userlist/rails/helpers'
9
13
 
10
14
  module Userlist
11
15
  module Rails
12
16
  class Railtie < ::Rails::Railtie
13
17
  rake_tasks do
14
- load 'tasks/userlist.rake'
18
+ load 'userlist/rails/tasks/userlist.rake'
15
19
  end
16
20
 
17
21
  initializer 'userlist.config' do
18
22
  config.userlist = Userlist.config
19
23
  end
20
24
 
25
+ initializer 'userlist.strategy' do
26
+ config.after_initialize do
27
+ strategy = config.userlist.push_strategy
28
+ Userlist::Push::Strategies.require_strategy(strategy)
29
+ end
30
+ end
31
+
21
32
  initializer 'userlist.logger' do
22
33
  config.after_initialize do
23
34
  Userlist.logger = Userlist::Rails::Logger.new(::Rails.logger, config.userlist)
24
35
  end
25
36
  end
26
37
 
38
+ initializer 'userlist.helpers' do
39
+ ActiveSupport.on_load :action_view do
40
+ include Userlist::Rails::Helpers
41
+ end
42
+ end
43
+
27
44
  initializer 'userlist.extensions' do
28
- Userlist::Push.send(:prepend, Userlist::Rails::Push)
45
+ Userlist::Rails.setup_extensions
29
46
  end
30
47
 
31
48
  initializer 'userlist.models' do
@@ -35,18 +52,26 @@ module Userlist
35
52
  if userlist.auto_discover
36
53
  Userlist.logger.info('Automatically discovering models')
37
54
 
38
- userlist.user_model ||= Userlist::Rails.detect_model('User')
39
- userlist.company_model ||= Userlist::Rails.detect_model('Account', 'Company')
55
+ userlist.user_model = Userlist::Rails.detect_model('User')
56
+ userlist.company_model = Userlist::Rails.detect_model('Account', 'Company', 'Team', 'Organization')
57
+ userlist.relationship_model = Userlist::Rails.detect_relationship(userlist.user_model, userlist.company_model)
40
58
  end
41
59
 
42
60
  if user_model = userlist.user_model
43
61
  Userlist.logger.info("Preparing user model #{user_model}")
44
- user_model.send(:include, Userlist::Rails::User)
62
+ Userlist::Rails.check_deprecations(user_model)
63
+ Userlist::Rails.setup_callbacks(user_model, :users)
45
64
  end
46
65
 
47
66
  if company_model = userlist.company_model
48
67
  Userlist.logger.info("Preparing company model #{company_model}")
49
- company_model.send(:include, Userlist::Rails::Company)
68
+ Userlist::Rails.check_deprecations(company_model)
69
+ Userlist::Rails.setup_callbacks(company_model, :companies)
70
+ end
71
+
72
+ if relationship_model = userlist.relationship_model
73
+ Userlist.logger.info("Preparing relationship model #{relationship_model}")
74
+ Userlist::Rails.setup_callbacks(relationship_model, :relationships)
50
75
  end
51
76
  end
52
77
  end
@@ -4,24 +4,24 @@ require 'userlist/rails/importer'
4
4
 
5
5
  namespace :userlist do
6
6
  namespace :import do
7
- desc 'Import users into Userlist.io'
7
+ desc 'Import users into Userlist'
8
8
  task users: :environment do
9
9
  if user_model = Rails.application.config.userlist.user_model
10
10
  importer = Userlist::Rails::Importer.new
11
11
  importer.import(user_model) do |user|
12
- push.user(user.send(:userlist_payload))
12
+ push.users.create(user)
13
13
  end
14
14
  else
15
15
  puts 'No user model defined. Skipping import.'
16
16
  end
17
17
  end
18
18
 
19
- desc 'Import companies into Userlist.io'
19
+ desc 'Import companies into Userlist'
20
20
  task companies: :environment do
21
21
  if company_model = Rails.application.config.userlist.company_model
22
22
  importer = Userlist::Rails::Importer.new
23
23
  importer.import(company_model) do |company|
24
- push.company(company.send(:userlist_payload))
24
+ push.companies.create(company)
25
25
  end
26
26
  else
27
27
  puts 'No company model defined. Skipping import.'
@@ -29,7 +29,7 @@ namespace :userlist do
29
29
  end
30
30
  end
31
31
 
32
- desc 'Import users and companies into Userlist.io'
32
+ desc 'Import users and companies into Userlist'
33
33
  task import: ['userlist:import:users', 'userlist:import:companies']
34
34
  end
35
35
 
@@ -0,0 +1,42 @@
1
+ module Userlist
2
+ module Rails
3
+ class Transform
4
+ def self.attributes
5
+ @attributes = []
6
+ end
7
+
8
+ def initialize(model, config = Userlist.config)
9
+ @model = model
10
+ @config = config
11
+ end
12
+
13
+ def [](name)
14
+ public_send(name) if key?(name)
15
+ end
16
+
17
+ def key?(name)
18
+ keys.include?(name.to_sym)
19
+ end
20
+
21
+ def keys
22
+ self.class.attributes
23
+ end
24
+
25
+ def hash
26
+ model.hash
27
+ end
28
+
29
+ def push?
30
+ (!model.respond_to?(:push?) || model.push?)
31
+ end
32
+
33
+ def delete?
34
+ (!model.respond_to?(:delete?) || model.delete?)
35
+ end
36
+
37
+ private
38
+
39
+ attr_reader :model, :config
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,41 @@
1
+ require 'userlist/rails/transform'
2
+
3
+ module Userlist
4
+ module Rails
5
+ module Transforms
6
+ class Company < Userlist::Rails::Transform
7
+ def self.attributes
8
+ @attributes ||= [
9
+ :identifier,
10
+ :properties,
11
+ :relationships,
12
+ :name,
13
+ :signed_up_at
14
+ ]
15
+ end
16
+
17
+ def identifier
18
+ model.try(:userlist_identifier) || "#{model.class.name}-#{model.id}".parameterize
19
+ end
20
+
21
+ def properties
22
+ model.try(:userlist_properties) || {}
23
+ end
24
+
25
+ def relationships
26
+ relationships_method = Userlist::Rails.find_reflection(config.company_model, config.relationship_model)&.name
27
+
28
+ model.try(:userlist_relationships) || (relationships_method && model.try(relationships_method))
29
+ end
30
+
31
+ def name
32
+ model.try(:userlist_name) || model.try(:name)
33
+ end
34
+
35
+ def signed_up_at
36
+ model.try(:created_at)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,33 @@
1
+ require 'userlist/rails/transform'
2
+
3
+ module Userlist
4
+ module Rails
5
+ module Transforms
6
+ class Relationship < Userlist::Rails::Transform
7
+ def self.attributes
8
+ @attributes ||= [
9
+ :user,
10
+ :company,
11
+ :properties
12
+ ]
13
+ end
14
+
15
+ def properties
16
+ model.try(:userlist_properties) || {}
17
+ end
18
+
19
+ def user
20
+ user_method = Userlist::Rails.find_reflection(config.relationship_model, config.user_model)&.name
21
+
22
+ model.try(:userlist_user) || (user_method && model.try(user_method))
23
+ end
24
+
25
+ def company
26
+ company_method = Userlist::Rails.find_reflection(config.relationship_model, config.company_model)&.name
27
+
28
+ model.try(:userlist_company) || (company_method && model.try(company_method))
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,41 @@
1
+ require 'userlist/rails/transform'
2
+
3
+ module Userlist
4
+ module Rails
5
+ module Transforms
6
+ class User < Userlist::Rails::Transform
7
+ def self.attributes
8
+ @attributes ||= [
9
+ :identifier,
10
+ :properties,
11
+ :relationships,
12
+ :email,
13
+ :signed_up_at
14
+ ]
15
+ end
16
+
17
+ def identifier
18
+ model.try(:userlist_identifier) || "#{model.class.name}-#{model.id}".parameterize
19
+ end
20
+
21
+ def properties
22
+ model.try(:userlist_properties) || {}
23
+ end
24
+
25
+ def relationships
26
+ relationships_method = Userlist::Rails.find_reflection(config.user_model, config.relationship_model)&.name
27
+
28
+ model.try(:userlist_relationships) || (relationships_method && model.try(relationships_method))
29
+ end
30
+
31
+ def email
32
+ model.try(:userlist_email) || model.try(:email)
33
+ end
34
+
35
+ def signed_up_at
36
+ model.try(:created_at)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end