equipoise 0.1.0
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +39 -0
- data/LICENSE +202 -0
- data/NOTICE +12 -0
- data/README.md +168 -0
- data/lib/equipoise/batch_result.rb +45 -0
- data/lib/equipoise/client.rb +188 -0
- data/lib/equipoise/configuration.rb +136 -0
- data/lib/equipoise/contacts.rb +149 -0
- data/lib/equipoise/custom_fields.rb +61 -0
- data/lib/equipoise/errors.rb +129 -0
- data/lib/equipoise/railtie.rb +17 -0
- data/lib/equipoise/response.rb +68 -0
- data/lib/equipoise/syncable.rb +78 -0
- data/lib/equipoise/util.rb +25 -0
- data/lib/equipoise/version.rb +12 -0
- data/lib/equipoise.rb +92 -0
- data/lib/generators/equipoise/install_generator.rb +25 -0
- data/lib/generators/equipoise/templates/equipoise.rb +22 -0
- metadata +90 -0
data/lib/equipoise.rb
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# Equipoise (producer gem entrypoint)
|
|
3
|
+
# =============================================================================
|
|
4
|
+
#
|
|
5
|
+
# Thin Ruby client for Equipoise's External CRM Sync API. A "producer" (AMP, a
|
|
6
|
+
# Stripe importer, a spreadsheet job, …) uses it to upsert its people into an
|
|
7
|
+
# Equipoise account's CRM as Contacts. ALL business logic lives server-side in
|
|
8
|
+
# Crm::ContactSyncService — this gem is pure transport (auth header, JSON,
|
|
9
|
+
# bounded retry/backoff, typed errors).
|
|
10
|
+
#
|
|
11
|
+
# api_key and base_url are read from EQUIPOISE_API_KEY / EQUIPOISE_API_URL
|
|
12
|
+
# automatically (rotation-aware — see Configuration); configure just sets the
|
|
13
|
+
# source and any overrides:
|
|
14
|
+
#
|
|
15
|
+
# Equipoise.configure { |c| c.source = "AMP" }
|
|
16
|
+
#
|
|
17
|
+
# Equipoise.client.contacts.sync(external_id: user.id, email: user.email, name: user.name, tags: ["AMP"])
|
|
18
|
+
#
|
|
19
|
+
# Contract: documentation/integrations/EXTERNAL_CRM_SYNC_API.openapi.yaml
|
|
20
|
+
# Guide: documentation/integrations/EXTERNAL_CRM_SYNC.md
|
|
21
|
+
# =============================================================================
|
|
22
|
+
|
|
23
|
+
require "json"
|
|
24
|
+
require "net/http"
|
|
25
|
+
require "openssl"
|
|
26
|
+
require "uri"
|
|
27
|
+
require "erb"
|
|
28
|
+
require "digest"
|
|
29
|
+
require "time"
|
|
30
|
+
|
|
31
|
+
require "equipoise/version"
|
|
32
|
+
require "equipoise/util"
|
|
33
|
+
require "equipoise/errors"
|
|
34
|
+
require "equipoise/configuration"
|
|
35
|
+
require "equipoise/response"
|
|
36
|
+
require "equipoise/batch_result"
|
|
37
|
+
require "equipoise/client"
|
|
38
|
+
require "equipoise/contacts"
|
|
39
|
+
require "equipoise/custom_fields"
|
|
40
|
+
|
|
41
|
+
module Equipoise
|
|
42
|
+
class << self
|
|
43
|
+
# — Claude (External CRM Sync, S12): the process-wide configuration. Built
|
|
44
|
+
# lazily from ENV so a bare `require "equipoise"` is side-effect-free.
|
|
45
|
+
def configuration
|
|
46
|
+
@configuration ||= Configuration.new
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def configure
|
|
50
|
+
yield(configuration) if block_given?
|
|
51
|
+
@client = nil # a re-configure invalidates the memoized client
|
|
52
|
+
configuration
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# — Claude authored — memoized default client. Most callers use this; tests
|
|
56
|
+
# and multi-tenant producers build their own Client with an explicit config.
|
|
57
|
+
def client
|
|
58
|
+
@client ||= Client.new(configuration)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def configured?
|
|
62
|
+
!configuration.api_key.to_s.empty?
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# — Claude authored (#5) — test-mode kill switch. Put `Equipoise.disable!` in
|
|
66
|
+
# a producer's rails_helper (or set test env) so no spec can make a live call
|
|
67
|
+
# even if EQUIPOISE_API_KEY leaks into the environment. Calls become no-ops
|
|
68
|
+
# returning a benign Response.
|
|
69
|
+
def disable!
|
|
70
|
+
configuration.enabled = false
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def enable!
|
|
74
|
+
configuration.enabled = true
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def disabled?
|
|
78
|
+
configuration.disabled?
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# — Claude authored — reset global state (used by the test suite's before
|
|
82
|
+
# hook; also handy in a console).
|
|
83
|
+
def reset!
|
|
84
|
+
@configuration = nil
|
|
85
|
+
@client = nil
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# The Rails add-on (Syncable concern + generator) is opt-in: require it only
|
|
91
|
+
# where wanted so the core gem stays dependency-free.
|
|
92
|
+
require "equipoise/railtie" if defined?(Rails::Railtie)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# Equipoise::Generators::InstallGenerator
|
|
3
|
+
# =============================================================================
|
|
4
|
+
#
|
|
5
|
+
# `rails g equipoise:install` — drops a config/initializers/equipoise.rb that
|
|
6
|
+
# wires Equipoise.configure from the environment. Run once in a producer app.
|
|
7
|
+
#
|
|
8
|
+
# Used by: producer Rails apps (e.g. AMP)
|
|
9
|
+
# =============================================================================
|
|
10
|
+
|
|
11
|
+
require "rails/generators/base"
|
|
12
|
+
|
|
13
|
+
module Equipoise
|
|
14
|
+
module Generators
|
|
15
|
+
class InstallGenerator < Rails::Generators::Base
|
|
16
|
+
source_root File.expand_path("templates", __dir__)
|
|
17
|
+
|
|
18
|
+
desc "Creates an Equipoise initializer at config/initializers/equipoise.rb"
|
|
19
|
+
|
|
20
|
+
def copy_initializer
|
|
21
|
+
template "equipoise.rb", "config/initializers/equipoise.rb"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# Equipoise External CRM Sync — producer configuration
|
|
5
|
+
# =============================================================================
|
|
6
|
+
#
|
|
7
|
+
# Generated by `rails g equipoise:install`. Reads credentials from the
|
|
8
|
+
# environment so secrets stay out of source control and key rotation needs no
|
|
9
|
+
# redeploy. See documentation/integrations/EXTERNAL_CRM_SYNC.md.
|
|
10
|
+
|
|
11
|
+
Equipoise.configure do |config|
|
|
12
|
+
# api_key and base_url are read from EQUIPOISE_API_KEY / EQUIPOISE_API_URL
|
|
13
|
+
# automatically and are rotation-aware — a rotated EQUIPOISE_API_KEY is picked
|
|
14
|
+
# up on the next request with no redeploy. Assign config.api_key here only to
|
|
15
|
+
# source the secret elsewhere (an explicit value is captured, not re-read).
|
|
16
|
+
config.source = "myapp" # this producer's source id (case-sensitive)
|
|
17
|
+
|
|
18
|
+
# config.base_url = "https://app.equipoi.se/api/v1" # override only if needed
|
|
19
|
+
# config.logger = Rails.logger # logs retries + failures
|
|
20
|
+
# config.max_retries = 2
|
|
21
|
+
# config.allow_insecure_http = true # trusted internal HTTP endpoint
|
|
22
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: equipoise
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Equipoise
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: rake
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - "~>"
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '13.0'
|
|
19
|
+
type: :development
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - "~>"
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '13.0'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: rspec
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - "~>"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '3.13'
|
|
33
|
+
type: :development
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '3.13'
|
|
40
|
+
description: A thin, dependency-free transport for syncing a producer's people into
|
|
41
|
+
an Equipoise account's CRM as Contacts. All business logic lives server-side; this
|
|
42
|
+
gem handles auth, JSON, bounded retry/backoff, idempotency, and typed errors.
|
|
43
|
+
email:
|
|
44
|
+
- jay@mindtonic.org
|
|
45
|
+
executables: []
|
|
46
|
+
extensions: []
|
|
47
|
+
extra_rdoc_files: []
|
|
48
|
+
files:
|
|
49
|
+
- CHANGELOG.md
|
|
50
|
+
- LICENSE
|
|
51
|
+
- NOTICE
|
|
52
|
+
- README.md
|
|
53
|
+
- lib/equipoise.rb
|
|
54
|
+
- lib/equipoise/batch_result.rb
|
|
55
|
+
- lib/equipoise/client.rb
|
|
56
|
+
- lib/equipoise/configuration.rb
|
|
57
|
+
- lib/equipoise/contacts.rb
|
|
58
|
+
- lib/equipoise/custom_fields.rb
|
|
59
|
+
- lib/equipoise/errors.rb
|
|
60
|
+
- lib/equipoise/railtie.rb
|
|
61
|
+
- lib/equipoise/response.rb
|
|
62
|
+
- lib/equipoise/syncable.rb
|
|
63
|
+
- lib/equipoise/util.rb
|
|
64
|
+
- lib/equipoise/version.rb
|
|
65
|
+
- lib/generators/equipoise/install_generator.rb
|
|
66
|
+
- lib/generators/equipoise/templates/equipoise.rb
|
|
67
|
+
homepage: https://app.equipoi.se
|
|
68
|
+
licenses:
|
|
69
|
+
- Apache-2.0
|
|
70
|
+
metadata:
|
|
71
|
+
allowed_push_host: https://rubygems.org
|
|
72
|
+
rubygems_mfa_required: 'true'
|
|
73
|
+
rdoc_options: []
|
|
74
|
+
require_paths:
|
|
75
|
+
- lib
|
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
77
|
+
requirements:
|
|
78
|
+
- - ">="
|
|
79
|
+
- !ruby/object:Gem::Version
|
|
80
|
+
version: 3.1.0
|
|
81
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
82
|
+
requirements:
|
|
83
|
+
- - ">="
|
|
84
|
+
- !ruby/object:Gem::Version
|
|
85
|
+
version: '0'
|
|
86
|
+
requirements: []
|
|
87
|
+
rubygems_version: 4.0.10
|
|
88
|
+
specification_version: 4
|
|
89
|
+
summary: Ruby client for the Equipoise External CRM Sync API.
|
|
90
|
+
test_files: []
|