hackle-ruby-sdk 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -3
  3. data/hackle-ruby-sdk.gemspec +1 -1
  4. data/lib/hackle-ruby-sdk.rb +2 -21
  5. data/lib/hackle.rb +76 -0
  6. data/lib/hackle/client.rb +127 -0
  7. data/lib/{hackle-ruby-sdk → hackle}/config.rb +1 -1
  8. data/lib/hackle/decision/bucketer.rb +44 -0
  9. data/lib/hackle/decision/decider.rb +69 -0
  10. data/lib/{hackle-ruby-sdk → hackle}/events/event_dispatcher.rb +31 -24
  11. data/lib/{hackle-ruby-sdk → hackle}/events/event_processor.rb +22 -11
  12. data/lib/hackle/events/user_event.rb +61 -0
  13. data/lib/{hackle-ruby-sdk → hackle}/http/http.rb +7 -9
  14. data/lib/hackle/models/bucket.rb +26 -0
  15. data/lib/hackle/models/event.rb +26 -0
  16. data/lib/hackle/models/event_type.rb +22 -0
  17. data/lib/hackle/models/experiment.rb +69 -0
  18. data/lib/hackle/models/slot.rb +22 -0
  19. data/lib/hackle/models/user.rb +24 -0
  20. data/lib/hackle/models/variation.rb +21 -0
  21. data/lib/{hackle-ruby-sdk → hackle}/version.rb +2 -2
  22. data/lib/hackle/workspaces/http_workspace_fetcher.rb +24 -0
  23. data/lib/{hackle-ruby-sdk → hackle}/workspaces/polling_workspace_fetcher.rb +4 -1
  24. data/lib/hackle/workspaces/workspace.rb +100 -0
  25. metadata +22 -19
  26. data/lib/hackle-ruby-sdk/client.rb +0 -108
  27. data/lib/hackle-ruby-sdk/decision/bucketer.rb +0 -26
  28. data/lib/hackle-ruby-sdk/decision/decider.rb +0 -54
  29. data/lib/hackle-ruby-sdk/events/event.rb +0 -33
  30. data/lib/hackle-ruby-sdk/models/bucket.rb +0 -15
  31. data/lib/hackle-ruby-sdk/models/event_type.rb +0 -10
  32. data/lib/hackle-ruby-sdk/models/experiment.rb +0 -39
  33. data/lib/hackle-ruby-sdk/models/slot.rb +0 -15
  34. data/lib/hackle-ruby-sdk/models/variation.rb +0 -11
  35. data/lib/hackle-ruby-sdk/workspaces/http_workspace_fetcher.rb +0 -24
  36. 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,11 +0,0 @@
1
- module Hackle
2
- class Variation
3
- attr_reader :id, :key, :dropped
4
-
5
- def initialize(id, key, dropped)
6
- @id = id
7
- @key = key
8
- @dropped = dropped
9
- end
10
- end
11
- 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