vwo-sdk 1.14.1 → 1.23.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/vwo.rb CHANGED
@@ -23,6 +23,7 @@ require_relative 'vwo/utils/campaign'
23
23
  require_relative 'vwo/utils/impression'
24
24
  require_relative 'vwo/utils/feature'
25
25
  require_relative 'vwo/utils/custom_dimensions'
26
+ require_relative 'vwo/utils/utility'
26
27
  require_relative 'vwo/constants'
27
28
  require_relative 'vwo/core/variation_decider'
28
29
  require_relative 'vwo/services/batch_events_dispatcher'
@@ -39,6 +40,7 @@ class VWO
39
40
  include Utils::CustomDimensions
40
41
  include Utils::Campaign
41
42
  include Utils::Impression
43
+ include Utils::Utility
42
44
  include CONSTANTS
43
45
 
44
46
  FILE = FileNameEnum::VWO
@@ -62,6 +64,7 @@ class VWO
62
64
  settings_file = nil,
63
65
  options = {}
64
66
  )
67
+ options = convert_to_symbol_hash(options)
65
68
  @account_id = account_id
66
69
  @sdk_key = sdk_key
67
70
  @user_storage = user_storage
@@ -295,9 +298,10 @@ class VWO
295
298
  return
296
299
  end
297
300
 
301
+ options = convert_to_symbol_hash(options)
298
302
  # Retrieve custom variables
299
- custom_variables = options['custom_variables'] || options[:custom_variables]
300
- variation_targeting_variables = options['variation_targeting_variables'] || options[:variation_targeting_variables]
303
+ custom_variables = options[:custom_variables]
304
+ variation_targeting_variables = options[:variation_targeting_variables]
301
305
 
302
306
  should_track_returning_user = get_should_track_returning_user(options)
303
307
  # Validate input parameters
@@ -413,7 +417,6 @@ class VWO
413
417
  )
414
418
  end
415
419
  end
416
- variation['name']
417
420
  else
418
421
  @logger.log(
419
422
  LogLevelEnum::INFO,
@@ -425,8 +428,8 @@ class VWO
425
428
  api_name: ApiMethods::ACTIVATE
426
429
  )
427
430
  )
428
- nil
429
431
  end
432
+ variation['name']
430
433
  rescue StandardError => e
431
434
  @logger.log(
432
435
  LogLevelEnum::ERROR,
@@ -437,7 +440,7 @@ class VWO
437
440
  exception: e
438
441
  )
439
442
  )
440
- nil
443
+ e
441
444
  end
442
445
 
443
446
  # This API method: Gets the variation name assigned for the
@@ -469,9 +472,10 @@ class VWO
469
472
  )
470
473
  return
471
474
  end
475
+ options = convert_to_symbol_hash(options)
472
476
  # Retrieve custom variables
473
- custom_variables = options['custom_variables'] || options[:custom_variables]
474
- variation_targeting_variables = options['variation_targeting_variables'] || options[:variation_targeting_variables]
477
+ custom_variables = options[:custom_variables]
478
+ variation_targeting_variables = options[:variation_targeting_variables]
475
479
 
476
480
  # Validate input parameters
477
481
  unless valid_string?(campaign_key) && valid_string?(user_id) && (custom_variables.nil? || valid_hash?(custom_variables)) &&
@@ -580,9 +584,10 @@ class VWO
580
584
  return false
581
585
  end
582
586
 
583
- revenue_value = options['revenue_value'] || options[:revenue_value]
584
- custom_variables = options['custom_variables'] || options[:custom_variables]
585
- variation_targeting_variables = options['variation_targeting_variables'] || options[:variation_targeting_variables]
587
+ options = convert_to_symbol_hash(options)
588
+ revenue_value = options[:revenue_value]
589
+ custom_variables = options[:custom_variables]
590
+ variation_targeting_variables = options[:variation_targeting_variables]
586
591
  should_track_returning_user = get_should_track_returning_user(options)
587
592
  goal_type_to_track = get_goal_type_to_track(options)
588
593
 
@@ -611,147 +616,149 @@ class VWO
611
616
 
612
617
  result = {}
613
618
  campaigns.each do |campaign|
614
- campaign_type = campaign['type']
619
+ begin
620
+ campaign_type = campaign['type']
615
621
 
616
- if campaign_type == CampaignTypes::FEATURE_ROLLOUT
617
- @logger.log(
618
- LogLevelEnum::ERROR,
619
- format(
620
- LogMessageEnum::ErrorMessages::INVALID_API,
621
- file: FILE,
622
- api_name: ApiMethods::TRACK,
623
- user_id: user_id,
624
- campaign_key: campaign['key'],
625
- campaign_type: campaign_type
626
- )
627
- )
628
- result[campaign['key']] = false
629
- next
630
- end
631
-
632
- variation = @variation_decider.get_variation(user_id, campaign, ApiMethods::TRACK, campaign['key'], custom_variables, variation_targeting_variables, goal_identifier)
633
-
634
- if variation
635
- goal = get_campaign_goal(campaign, goal_identifier)
636
- if goal.nil? || !goal["id"]
622
+ if campaign_type == CampaignTypes::FEATURE_ROLLOUT
637
623
  @logger.log(
638
624
  LogLevelEnum::ERROR,
639
625
  format(
640
- LogMessageEnum::ErrorMessages::TRACK_API_GOAL_NOT_FOUND,
626
+ LogMessageEnum::ErrorMessages::INVALID_API,
641
627
  file: FILE,
642
- goal_identifier: goal_identifier,
628
+ api_name: ApiMethods::TRACK,
643
629
  user_id: user_id,
644
630
  campaign_key: campaign['key'],
645
- api_name: ApiMethods::TRACK
631
+ campaign_type: campaign_type
646
632
  )
647
633
  )
648
634
  result[campaign['key']] = false
649
635
  next
650
- elsif goal['type'] == GoalTypes::REVENUE && !valid_value?(revenue_value)
651
- @logger.log(
652
- LogLevelEnum::ERROR,
653
- format(
654
- LogMessageEnum::ErrorMessages::TRACK_API_REVENUE_NOT_PASSED_FOR_REVENUE_GOAL,
655
- file: FILE,
656
- user_id: user_id,
657
- goal_identifier: goal_identifier,
658
- campaign_key: campaign['key'],
659
- api_name: ApiMethods::TRACK
660
- )
661
- )
662
- result[campaign['key']] = false
663
- next
664
- elsif goal['type'] == GoalTypes::CUSTOM
665
- revenue_value = nil
666
636
  end
667
637
 
668
- if variation['goal_identifier']
669
- identifiers = variation['goal_identifier'].split(VWO_DELIMITER)
670
- else
671
- variation['goal_identifier'] = ''
672
- identifiers = []
673
- end
638
+ variation = @variation_decider.get_variation(user_id, campaign, ApiMethods::TRACK, campaign['key'], custom_variables, variation_targeting_variables, goal_identifier)
674
639
 
675
- if !identifiers.include? goal_identifier
676
- updated_goal_identifier = variation['goal_identifier']
677
- updated_goal_identifier += VWO_DELIMITER + goal_identifier
678
- @variation_decider.save_user_storage(user_id, campaign['key'], variation['name'], updated_goal_identifier) if variation['name']
679
- # set variation at user storage
680
- elsif !should_track_returning_user
681
- @logger.log(
682
- LogLevelEnum::INFO,
683
- format(
684
- LogMessageEnum::InfoMessages::GOAL_ALREADY_TRACKED,
685
- file: FILE,
686
- user_id: user_id,
687
- campaign_key: campaign['key'],
688
- goal_identifier: goal_identifier,
689
- api_name: ApiMethods::TRACK
640
+ if variation
641
+ goal = get_campaign_goal(campaign, goal_identifier)
642
+ if goal.nil? || !goal["id"]
643
+ @logger.log(
644
+ LogLevelEnum::ERROR,
645
+ format(
646
+ LogMessageEnum::ErrorMessages::TRACK_API_GOAL_NOT_FOUND,
647
+ file: FILE,
648
+ goal_identifier: goal_identifier,
649
+ user_id: user_id,
650
+ campaign_key: campaign['key'],
651
+ api_name: ApiMethods::TRACK
652
+ )
690
653
  )
691
- )
692
- result[campaign['key']] = false
693
- next
694
- end
695
-
696
- if defined?(@batch_events)
697
- impression = create_bulk_event_impression(
698
- @settings_file,
699
- campaign['id'],
700
- variation['id'],
701
- user_id,
702
- goal['id'],
703
- revenue_value
704
- )
705
- @batch_events_queue.enqueue(impression)
706
- else
707
- impression = create_impression(
708
- @settings_file,
709
- campaign['id'],
710
- variation['id'],
711
- user_id,
712
- @sdk_key,
713
- goal['id'],
714
- revenue_value
715
- )
716
- if @event_dispatcher.dispatch(impression)
654
+ result[campaign['key']] = false
655
+ next
656
+ elsif goal['type'] == GoalTypes::REVENUE && !valid_value?(revenue_value)
717
657
  @logger.log(
718
- LogLevelEnum::INFO,
658
+ LogLevelEnum::ERROR,
719
659
  format(
720
- LogMessageEnum::InfoMessages::IMPRESSION_SUCCESS,
660
+ LogMessageEnum::ErrorMessages::TRACK_API_REVENUE_NOT_PASSED_FOR_REVENUE_GOAL,
721
661
  file: FILE,
722
- sdk_key: @sdk_key,
723
- account_id: @account_id,
724
- campaign_id: campaign['id'],
725
- variation_id: variation['id'],
726
- end_point: EVENTS::TRACK_GOAL
662
+ user_id: user_id,
663
+ goal_identifier: goal_identifier,
664
+ campaign_key: campaign['key'],
665
+ api_name: ApiMethods::TRACK
727
666
  )
728
667
  )
668
+ result[campaign['key']] = false
669
+ next
670
+ elsif goal['type'] == GoalTypes::CUSTOM
671
+ revenue_value = nil
672
+ end
673
+
674
+ if variation['goal_identifier']
675
+ identifiers = variation['goal_identifier'].split(VWO_DELIMITER)
676
+ else
677
+ variation['goal_identifier'] = ''
678
+ identifiers = []
679
+ end
680
+
681
+ if !identifiers.include? goal_identifier
682
+ updated_goal_identifier = variation['goal_identifier']
683
+ updated_goal_identifier += VWO_DELIMITER + goal_identifier
684
+ @variation_decider.save_user_storage(user_id, campaign['key'], campaign['name'], variation['name'], updated_goal_identifier) if variation['name']
685
+ # set variation at user storage
686
+ elsif !should_track_returning_user
729
687
  @logger.log(
730
688
  LogLevelEnum::INFO,
731
689
  format(
732
- LogMessageEnum::InfoMessages::MAIN_KEYS_FOR_IMPRESSION,
690
+ LogMessageEnum::InfoMessages::GOAL_ALREADY_TRACKED,
733
691
  file: FILE,
734
- sdk_key: @sdk_key,
735
- campaign_id: impression[:experiment_id],
736
- account_id: impression[:account_id],
737
- variation_id: impression[:combination]
692
+ user_id: user_id,
693
+ campaign_key: campaign['key'],
694
+ goal_identifier: goal_identifier,
695
+ api_name: ApiMethods::TRACK
738
696
  )
739
697
  )
698
+ result[campaign['key']] = false
699
+ next
740
700
  end
701
+
702
+ if defined?(@batch_events)
703
+ impression = create_bulk_event_impression(
704
+ @settings_file,
705
+ campaign['id'],
706
+ variation['id'],
707
+ user_id,
708
+ goal['id'],
709
+ revenue_value
710
+ )
711
+ @batch_events_queue.enqueue(impression)
712
+ else
713
+ impression = create_impression(
714
+ @settings_file,
715
+ campaign['id'],
716
+ variation['id'],
717
+ user_id,
718
+ @sdk_key,
719
+ goal['id'],
720
+ revenue_value
721
+ )
722
+ if @event_dispatcher.dispatch(impression)
723
+ @logger.log(
724
+ LogLevelEnum::INFO,
725
+ format(
726
+ LogMessageEnum::InfoMessages::IMPRESSION_SUCCESS,
727
+ file: FILE,
728
+ sdk_key: @sdk_key,
729
+ account_id: @account_id,
730
+ campaign_id: campaign['id'],
731
+ variation_id: variation['id'],
732
+ end_point: EVENTS::TRACK_GOAL
733
+ )
734
+ )
735
+ @logger.log(
736
+ LogLevelEnum::INFO,
737
+ format(
738
+ LogMessageEnum::InfoMessages::MAIN_KEYS_FOR_IMPRESSION,
739
+ file: FILE,
740
+ sdk_key: @sdk_key,
741
+ campaign_id: impression[:experiment_id],
742
+ account_id: impression[:account_id],
743
+ variation_id: impression[:combination]
744
+ )
745
+ )
746
+ end
747
+ end
748
+ result[campaign['key']] = true
749
+ next
741
750
  end
742
- result[campaign['key']] = true
743
- next
744
- end
745
- result[campaign['key']] = false
746
- rescue StandardError => e
747
- @logger.log(
748
- LogLevelEnum::ERROR,
749
- format(
750
- e.message,
751
- file: FILE,
752
- exception: e
751
+ result[campaign['key']] = false
752
+ rescue StandardError => e
753
+ @logger.log(
754
+ LogLevelEnum::ERROR,
755
+ format(
756
+ e.message,
757
+ file: FILE,
758
+ exception: e
759
+ )
753
760
  )
754
- )
761
+ end
755
762
  end
756
763
 
757
764
  if result.length() == 0
@@ -798,9 +805,10 @@ class VWO
798
805
  return false
799
806
  end
800
807
 
808
+ options = convert_to_symbol_hash(options)
801
809
  # Retrieve custom variables
802
- custom_variables = options['custom_variables'] || options[:custom_variables]
803
- variation_targeting_variables = options['variation_targeting_variables'] || options[:variation_targeting_variables]
810
+ custom_variables = options[:custom_variables]
811
+ variation_targeting_variables = options[:variation_targeting_variables]
804
812
  should_track_returning_user = get_should_track_returning_user(options)
805
813
  @logger.log(
806
814
  LogLevelEnum::INFO,
@@ -868,80 +876,85 @@ class VWO
868
876
  return false unless variation
869
877
 
870
878
  # if campaign type is feature_test Send track call to server
871
- if campaign_type == CampaignTypes::FEATURE_TEST
872
- if is_eligible_to_send_impression(should_track_returning_user)
873
- if defined?(@batch_events)
874
- impression = create_bulk_event_impression(
875
- @settings_file,
876
- campaign['id'],
877
- variation['id'],
878
- user_id
879
- )
880
- @batch_events_queue.enqueue(impression)
881
- else
882
- impression = create_impression(
883
- @settings_file,
884
- campaign['id'],
885
- variation['id'],
886
- user_id,
887
- @sdk_key,
888
- goal_id: nil,
889
- revenue: nil,
890
- usage_stats: @usage_stats.usage_stats
891
- )
892
879
 
893
- @event_dispatcher.dispatch(impression)
894
- @logger.log(
895
- LogLevelEnum::INFO,
896
- format(
897
- LogMessageEnum::InfoMessages::MAIN_KEYS_FOR_IMPRESSION,
898
- file: FILE,
899
- campaign_id: impression[:experiment_id],
900
- sdk_key: @sdk_key,
901
- account_id: impression[:account_id],
902
- variation_id: impression[:combination]
903
- )
904
- )
905
- end
906
- result = variation['isFeatureEnabled']
907
- if result
908
- @logger.log(
909
- LogLevelEnum::INFO,
910
- format(
911
- LogMessageEnum::InfoMessages::FEATURE_ENABLED_FOR_USER,
912
- file: FILE,
913
- user_id: user_id,
914
- feature_key: campaign_key,
915
- api_name: ApiMethods::IS_FEATURE_ENABLED
916
- )
917
- )
918
- else
919
- @logger.log(
920
- LogLevelEnum::INFO,
921
- format(
922
- LogMessageEnum::InfoMessages::FEATURE_NOT_ENABLED_FOR_USER,
923
- file: FILE,
924
- user_id: user_id,
925
- feature_key: campaign_key,
926
- api_name: ApiMethods::IS_FEATURE_ENABLED
927
- )
928
- )
929
- end
930
- return result
880
+ if is_eligible_to_send_impression(should_track_returning_user)
881
+ if defined?(@batch_events)
882
+ impression = create_bulk_event_impression(
883
+ @settings_file,
884
+ campaign['id'],
885
+ variation['id'],
886
+ user_id
887
+ )
888
+ @batch_events_queue.enqueue(impression)
931
889
  else
890
+ impression = create_impression(
891
+ @settings_file,
892
+ campaign['id'],
893
+ variation['id'],
894
+ user_id,
895
+ @sdk_key,
896
+ nil,
897
+ nil,
898
+ usage_stats: @usage_stats.usage_stats
899
+ )
900
+
901
+ @event_dispatcher.dispatch(impression)
932
902
  @logger.log(
933
903
  LogLevelEnum::INFO,
934
904
  format(
935
- LogMessageEnum::InfoMessages::USER_ALREADY_TRACKED,
905
+ LogMessageEnum::InfoMessages::MAIN_KEYS_FOR_IMPRESSION,
936
906
  file: FILE,
937
- user_id: user_id,
938
- campaign_key: campaign_key,
939
- api_name: ApiMethods::IS_FEATURE_ENABLED
907
+ campaign_id: impression[:experiment_id],
908
+ sdk_key: @sdk_key,
909
+ account_id: impression[:account_id],
910
+ variation_id: impression[:combination]
940
911
  )
941
912
  )
942
913
  end
914
+
915
+ else
916
+ @logger.log(
917
+ LogLevelEnum::INFO,
918
+ format(
919
+ LogMessageEnum::InfoMessages::USER_ALREADY_TRACKED,
920
+ file: FILE,
921
+ user_id: user_id,
922
+ campaign_key: campaign_key,
923
+ api_name: ApiMethods::IS_FEATURE_ENABLED
924
+ )
925
+ )
943
926
  end
944
- true
927
+ if campaign_type == CampaignTypes::FEATURE_ROLLOUT
928
+ result = true
929
+ else
930
+ result = variation['isFeatureEnabled']
931
+ end
932
+
933
+ if result
934
+ @logger.log(
935
+ LogLevelEnum::INFO,
936
+ format(
937
+ LogMessageEnum::InfoMessages::FEATURE_ENABLED_FOR_USER,
938
+ file: FILE,
939
+ user_id: user_id,
940
+ feature_key: campaign_key,
941
+ api_name: ApiMethods::IS_FEATURE_ENABLED
942
+ )
943
+ )
944
+ else
945
+ @logger.log(
946
+ LogLevelEnum::INFO,
947
+ format(
948
+ LogMessageEnum::InfoMessages::FEATURE_NOT_ENABLED_FOR_USER,
949
+ file: FILE,
950
+ user_id: user_id,
951
+ feature_key: campaign_key,
952
+ api_name: ApiMethods::IS_FEATURE_ENABLED
953
+ )
954
+ )
955
+ end
956
+
957
+ result
945
958
  rescue StandardError => e
946
959
  @logger.log(
947
960
  LogLevelEnum::ERROR,
@@ -987,9 +1000,10 @@ class VWO
987
1000
  return
988
1001
  end
989
1002
 
1003
+ options = convert_to_symbol_hash(options)
990
1004
  # Retrieve custom variables
991
- custom_variables = options['custom_variables'] || options[:custom_variables]
992
- variation_targeting_variables = options['variation_targeting_variables'] || options[:variation_targeting_variables]
1005
+ custom_variables = options[:custom_variables]
1006
+ variation_targeting_variables = options[:variation_targeting_variables]
993
1007
 
994
1008
  unless valid_string?(campaign_key) && valid_string?(variable_key) && valid_string?(user_id) &&
995
1009
  (custom_variables.nil? || valid_hash?(custom_variables)) && (variation_targeting_variables.nil? || valid_hash?(variation_targeting_variables))
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vwo-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.14.1
4
+ version: 1.23.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - VWO
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-10 00:00:00.000000000 Z
11
+ date: 2021-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: coveralls
14
+ name: codecov
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.8.23
19
+ version: 0.4.3
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.8.23
26
+ version: 0.4.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rubocop
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -80,7 +80,7 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0.1'
83
- description: A Ruby SDK for VWO full-stack testing.
83
+ description: Ruby SDK for VWO FullStack testing.
84
84
  email:
85
85
  - dev@wingify.com
86
86
  executables: []
@@ -111,12 +111,18 @@ files:
111
111
  - lib/vwo/utils/impression.rb
112
112
  - lib/vwo/utils/request.rb
113
113
  - lib/vwo/utils/segment.rb
114
+ - lib/vwo/utils/utility.rb
114
115
  - lib/vwo/utils/uuid.rb
115
116
  - lib/vwo/utils/validations.rb
116
117
  homepage: https://vwo.com/fullstack/server-side-testing/
117
118
  licenses:
118
119
  - Apache-2.0
119
- metadata: {}
120
+ metadata:
121
+ bug_tracker_uri: https://github.com/wingify/vwo-ruby-sdk/issues
122
+ changelog_uri: https://github.com/wingify/vwo-ruby-sdk/blob/master/CHANGELOG.md
123
+ documentation_uri: https://developers.vwo.com/docs/ruby-sdk-reference
124
+ homepage_uri: https://github.com/wingify/vwo-ruby-sdk
125
+ source_code_uri: https://github.com/wingify/vwo-ruby-sdk
120
126
  post_install_message:
121
127
  rdoc_options: []
122
128
  require_paths:
@@ -125,7 +131,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
125
131
  requirements:
126
132
  - - ">="
127
133
  - !ruby/object:Gem::Version
128
- version: '0'
134
+ version: 2.2.10
129
135
  required_rubygems_version: !ruby/object:Gem::Requirement
130
136
  requirements:
131
137
  - - ">="
@@ -135,5 +141,5 @@ requirements: []
135
141
  rubygems_version: 3.0.6
136
142
  signing_key:
137
143
  specification_version: 4
138
- summary: Ruby SDK for VWO full-stack testing
144
+ summary: Ruby SDK for VWO FullStack testing
139
145
  test_files: []