hackle-ruby-sdk 0.0.1 → 1.0.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 +4 -4
 - data/README.md +1 -3
 - data/hackle-ruby-sdk.gemspec +1 -1
 - data/lib/hackle-ruby-sdk.rb +2 -21
 - data/lib/hackle.rb +76 -0
 - data/lib/hackle/client.rb +127 -0
 - data/lib/{hackle-ruby-sdk → hackle}/config.rb +1 -1
 - data/lib/hackle/decision/bucketer.rb +44 -0
 - data/lib/hackle/decision/decider.rb +69 -0
 - data/lib/{hackle-ruby-sdk → hackle}/events/event_dispatcher.rb +31 -24
 - data/lib/{hackle-ruby-sdk → hackle}/events/event_processor.rb +22 -11
 - data/lib/hackle/events/user_event.rb +61 -0
 - data/lib/{hackle-ruby-sdk → hackle}/http/http.rb +7 -9
 - data/lib/hackle/models/bucket.rb +26 -0
 - data/lib/hackle/models/event.rb +26 -0
 - data/lib/hackle/models/event_type.rb +22 -0
 - data/lib/hackle/models/experiment.rb +69 -0
 - data/lib/hackle/models/slot.rb +22 -0
 - data/lib/hackle/models/user.rb +24 -0
 - data/lib/hackle/models/variation.rb +21 -0
 - data/lib/{hackle-ruby-sdk → hackle}/version.rb +2 -2
 - data/lib/hackle/workspaces/http_workspace_fetcher.rb +24 -0
 - data/lib/{hackle-ruby-sdk → hackle}/workspaces/polling_workspace_fetcher.rb +4 -1
 - data/lib/hackle/workspaces/workspace.rb +100 -0
 - metadata +22 -19
 - data/lib/hackle-ruby-sdk/client.rb +0 -108
 - data/lib/hackle-ruby-sdk/decision/bucketer.rb +0 -26
 - data/lib/hackle-ruby-sdk/decision/decider.rb +0 -54
 - data/lib/hackle-ruby-sdk/events/event.rb +0 -33
 - data/lib/hackle-ruby-sdk/models/bucket.rb +0 -15
 - data/lib/hackle-ruby-sdk/models/event_type.rb +0 -10
 - data/lib/hackle-ruby-sdk/models/experiment.rb +0 -39
 - data/lib/hackle-ruby-sdk/models/slot.rb +0 -15
 - data/lib/hackle-ruby-sdk/models/variation.rb +0 -11
 - data/lib/hackle-ruby-sdk/workspaces/http_workspace_fetcher.rb +0 -24
 - data/lib/hackle-ruby-sdk/workspaces/workspace.rb +0 -78
 
| 
         @@ -1,15 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module Hackle
         
     | 
| 
       2 
     | 
    
         
            -
              class Slot
         
     | 
| 
       3 
     | 
    
         
            -
                attr_reader :variation_id
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
                def initialize(start_inclusive, end_exclusive, variation_id)
         
     | 
| 
       6 
     | 
    
         
            -
                  @start_inclusive = start_inclusive
         
     | 
| 
       7 
     | 
    
         
            -
                  @end_exclusive = end_exclusive
         
     | 
| 
       8 
     | 
    
         
            -
                  @variation_id = variation_id
         
     | 
| 
       9 
     | 
    
         
            -
                end
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                def contains?(slot_number)
         
     | 
| 
       12 
     | 
    
         
            -
                  @start_inclusive <= slot_number && slot_number < @end_exclusive
         
     | 
| 
       13 
     | 
    
         
            -
                end
         
     | 
| 
       14 
     | 
    
         
            -
              end
         
     | 
| 
       15 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,24 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'json'
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            module Hackle
         
     | 
| 
       6 
     | 
    
         
            -
              class HttpWorkspaceFetcher
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
                def initialize(config, sdk_info)
         
     | 
| 
       9 
     | 
    
         
            -
                  @client = HTTP.client(config.base_uri)
         
     | 
| 
       10 
     | 
    
         
            -
                  @headers = HTTP.sdk_headers(sdk_info)
         
     | 
| 
       11 
     | 
    
         
            -
                end
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                def fetch
         
     | 
| 
       14 
     | 
    
         
            -
                  request = Net::HTTP::Get.new('/api/v1/workspaces', @headers)
         
     | 
| 
       15 
     | 
    
         
            -
                  response = @client.request(request)
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                  status_code = response.code.to_i
         
     | 
| 
       18 
     | 
    
         
            -
                  HTTP.check_successful(status_code)
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
                  data = JSON.parse(response.body, symbolize_names: true)
         
     | 
| 
       21 
     | 
    
         
            -
                  Workspace.create(data)
         
     | 
| 
       22 
     | 
    
         
            -
                end
         
     | 
| 
       23 
     | 
    
         
            -
              end
         
     | 
| 
       24 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,78 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module Hackle
         
     | 
| 
       2 
     | 
    
         
            -
              class Workspace
         
     | 
| 
       3 
     | 
    
         
            -
                def initialize(experiments, event_types)
         
     | 
| 
       4 
     | 
    
         
            -
                  @experiments = experiments
         
     | 
| 
       5 
     | 
    
         
            -
                  @event_types = event_types
         
     | 
| 
       6 
     | 
    
         
            -
                end
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
                def get_experiment(experiment_key)
         
     | 
| 
       9 
     | 
    
         
            -
                  @experiments[experiment_key]
         
     | 
| 
       10 
     | 
    
         
            -
                end
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
                def get_event_type(event_type_key)
         
     | 
| 
       13 
     | 
    
         
            -
                  @event_types[event_type_key]
         
     | 
| 
       14 
     | 
    
         
            -
                end
         
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
                class << self
         
     | 
| 
       17 
     | 
    
         
            -
                  def create(data)
         
     | 
| 
       18 
     | 
    
         
            -
                    buckets = Hash[data[:buckets].map { |b| [b[:id], bucket(b)] }]
         
     | 
| 
       19 
     | 
    
         
            -
                    running_experiments = Hash[data[:experiments].map { |re| [re[:key], running_experiment(re, buckets)] }]
         
     | 
| 
       20 
     | 
    
         
            -
                    completed_experiment = Hash[data[:completedExperiments].map { |ce| [ce[:experimentKey], completed_experiment(ce)] }]
         
     | 
| 
       21 
     | 
    
         
            -
                    event_types = Hash[data[:events].map { |e| [e[:key], event_type(e)] }]
         
     | 
| 
       22 
     | 
    
         
            -
                    experiments = running_experiments.merge(completed_experiment)
         
     | 
| 
       23 
     | 
    
         
            -
                    Workspace.new(experiments, event_types)
         
     | 
| 
       24 
     | 
    
         
            -
                  end
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                  private
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
                  def running_experiment(data, buckets)
         
     | 
| 
       29 
     | 
    
         
            -
                    Experiment::Running.new(
         
     | 
| 
       30 
     | 
    
         
            -
                      data[:id],
         
     | 
| 
       31 
     | 
    
         
            -
                      data[:key],
         
     | 
| 
       32 
     | 
    
         
            -
                      buckets[data[:bucketId]],
         
     | 
| 
       33 
     | 
    
         
            -
                      Hash[data[:variations].map { |v| [v[:id], variation(v)] }],
         
     | 
| 
       34 
     | 
    
         
            -
                      Hash[data[:execution][:userOverrides].map { |u| [u[:userId], u[:variationId]] }]
         
     | 
| 
       35 
     | 
    
         
            -
                    )
         
     | 
| 
       36 
     | 
    
         
            -
                  end
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
                  def completed_experiment(data)
         
     | 
| 
       39 
     | 
    
         
            -
                    Experiment::Completed.new(
         
     | 
| 
       40 
     | 
    
         
            -
                      data[:experimentId],
         
     | 
| 
       41 
     | 
    
         
            -
                      data[:experimentKey],
         
     | 
| 
       42 
     | 
    
         
            -
                      data[:winnerVariationKey]
         
     | 
| 
       43 
     | 
    
         
            -
                    )
         
     | 
| 
       44 
     | 
    
         
            -
                  end
         
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
                  def variation(data)
         
     | 
| 
       47 
     | 
    
         
            -
                    Variation.new(
         
     | 
| 
       48 
     | 
    
         
            -
                      data[:id],
         
     | 
| 
       49 
     | 
    
         
            -
                      data[:key],
         
     | 
| 
       50 
     | 
    
         
            -
                      data[:status] == 'DROPPED'
         
     | 
| 
       51 
     | 
    
         
            -
                    )
         
     | 
| 
       52 
     | 
    
         
            -
                  end
         
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
                  def bucket(data)
         
     | 
| 
       55 
     | 
    
         
            -
                    Bucket.new(
         
     | 
| 
       56 
     | 
    
         
            -
                      data[:seed],
         
     | 
| 
       57 
     | 
    
         
            -
                      data[:slotSize],
         
     | 
| 
       58 
     | 
    
         
            -
                      data[:slots].map { |s| slot(s) }
         
     | 
| 
       59 
     | 
    
         
            -
                    )
         
     | 
| 
       60 
     | 
    
         
            -
                  end
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
                  def slot(data)
         
     | 
| 
       63 
     | 
    
         
            -
                    Slot.new(
         
     | 
| 
       64 
     | 
    
         
            -
                      data[:startInclusive],
         
     | 
| 
       65 
     | 
    
         
            -
                      data[:endExclusive],
         
     | 
| 
       66 
     | 
    
         
            -
                      data[:variationId]
         
     | 
| 
       67 
     | 
    
         
            -
                    )
         
     | 
| 
       68 
     | 
    
         
            -
                  end
         
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
                  def event_type(data)
         
     | 
| 
       71 
     | 
    
         
            -
                    EventType.new(
         
     | 
| 
       72 
     | 
    
         
            -
                      data[:id],
         
     | 
| 
       73 
     | 
    
         
            -
                      data[:key]
         
     | 
| 
       74 
     | 
    
         
            -
                    )
         
     | 
| 
       75 
     | 
    
         
            -
                  end
         
     | 
| 
       76 
     | 
    
         
            -
                end
         
     | 
| 
       77 
     | 
    
         
            -
              end
         
     | 
| 
       78 
     | 
    
         
            -
            end
         
     |