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.
- checksums.yaml +4 -4
- data/lib/vwo/constants.rb +5 -2
- data/lib/vwo/core/bucketer.rb +33 -5
- data/lib/vwo/core/variation_decider.rb +422 -133
- data/lib/vwo/enums.rb +6 -1
- data/lib/vwo/logger.rb +4 -2
- data/lib/vwo/schemas/settings_file.rb +32 -1
- data/lib/vwo/services/operand_evaluator.rb +2 -3
- data/lib/vwo/services/segment_evaluator.rb +4 -2
- data/lib/vwo/utils/campaign.rb +60 -2
- data/lib/vwo/utils/feature.rb +2 -0
- data/lib/vwo/utils/utility.rb +40 -0
- data/lib/vwo.rb +204 -190
- metadata +15 -9
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[
|
300
|
-
variation_targeting_variables = options[
|
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
|
-
|
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[
|
474
|
-
variation_targeting_variables = options[
|
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
|
-
|
584
|
-
|
585
|
-
|
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
|
-
|
619
|
+
begin
|
620
|
+
campaign_type = campaign['type']
|
615
621
|
|
616
|
-
|
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::
|
626
|
+
LogMessageEnum::ErrorMessages::INVALID_API,
|
641
627
|
file: FILE,
|
642
|
-
|
628
|
+
api_name: ApiMethods::TRACK,
|
643
629
|
user_id: user_id,
|
644
630
|
campaign_key: campaign['key'],
|
645
|
-
|
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
|
-
|
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
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
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
|
-
|
693
|
-
|
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::
|
658
|
+
LogLevelEnum::ERROR,
|
719
659
|
format(
|
720
|
-
LogMessageEnum::
|
660
|
+
LogMessageEnum::ErrorMessages::TRACK_API_REVENUE_NOT_PASSED_FOR_REVENUE_GOAL,
|
721
661
|
file: FILE,
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
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::
|
690
|
+
LogMessageEnum::InfoMessages::GOAL_ALREADY_TRACKED,
|
733
691
|
file: FILE,
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
|
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']] =
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
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[
|
803
|
-
variation_targeting_variables = options[
|
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
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
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::
|
905
|
+
LogMessageEnum::InfoMessages::MAIN_KEYS_FOR_IMPRESSION,
|
936
906
|
file: FILE,
|
937
|
-
|
938
|
-
|
939
|
-
|
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
|
-
|
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[
|
992
|
-
variation_targeting_variables = options[
|
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.
|
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-
|
11
|
+
date: 2021-10-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: codecov
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
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.
|
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:
|
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:
|
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
|
144
|
+
summary: Ruby SDK for VWO FullStack testing
|
139
145
|
test_files: []
|