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.
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: []