posthog-ruby 3.5.4 → 3.5.5
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/lib/posthog/feature_flags.rb +127 -0
- data/lib/posthog/version.rb +1 -1
- metadata +6 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a707a12f37f1d97a91f179b0b6fa6695b6c6342957de137b38f66ebc0e008a5d
|
|
4
|
+
data.tar.gz: ecace6615c9121841987baaed7178327e1a50db76f73b5b890f6e42da7c30656
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3f584a56131c572124ab4c46b452ca96538b94c386934ee99b768de5dd84c5a34236e65edfefde9bed167fde431b311f70f08fd36786dd586b4173556029b6a2
|
|
7
|
+
data.tar.gz: ddd803d8420443ea7ee1fb015a46dfad302a11eab98c02ef70a16820e5e8bea73a82bea644bfb6d1109b11e744739be82810ac4bdaf8375cd9cb2847d79df4eb
|
|
@@ -422,6 +422,103 @@ module PostHog
|
|
|
422
422
|
parsed_dt
|
|
423
423
|
end
|
|
424
424
|
|
|
425
|
+
# Parse a semver string into a comparable [major, minor, patch] integer array.
|
|
426
|
+
# Handles v-prefix, whitespace, pre-release suffixes. Defaults missing components to 0.
|
|
427
|
+
def self.parse_semver(value)
|
|
428
|
+
raise InconclusiveMatchError, 'Invalid semver format' if value.nil?
|
|
429
|
+
|
|
430
|
+
text = value.to_s.strip.sub(/^[vV]/, '')
|
|
431
|
+
|
|
432
|
+
raise InconclusiveMatchError, 'Invalid semver format' if text.empty?
|
|
433
|
+
|
|
434
|
+
# Strip pre-release and build metadata suffixes
|
|
435
|
+
text = text.split('-')[0].split('+')[0]
|
|
436
|
+
parts = text.split('.')
|
|
437
|
+
|
|
438
|
+
raise InconclusiveMatchError, 'Invalid semver format' if parts.empty? || parts[0].to_s.empty?
|
|
439
|
+
|
|
440
|
+
# Check for leading dot or non-numeric parts
|
|
441
|
+
parts.each do |part|
|
|
442
|
+
raise InconclusiveMatchError, 'Invalid semver format' if part.empty? || part !~ /^\d+$/
|
|
443
|
+
end
|
|
444
|
+
|
|
445
|
+
major = parts[0].to_i
|
|
446
|
+
minor = parts.length > 1 ? parts[1].to_i : 0
|
|
447
|
+
patch = parts.length > 2 ? parts[2].to_i : 0
|
|
448
|
+
|
|
449
|
+
[major, minor, patch]
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
# Returns bounds for tilde (~) range:
|
|
453
|
+
# ~X → >=X.0.0 <(X+1).0.0
|
|
454
|
+
# ~X.Y → >=X.Y.0 <X.(Y+1).0
|
|
455
|
+
# ~X.Y.Z → >=X.Y.Z <X.(Y+1).0
|
|
456
|
+
def self.semver_tilde_bounds(value)
|
|
457
|
+
major, minor, patch = parse_semver(value)
|
|
458
|
+
lower = [major, minor, patch]
|
|
459
|
+
|
|
460
|
+
# Determine how many components were provided
|
|
461
|
+
text = value.to_s.strip.sub(/^[vV]/, '')
|
|
462
|
+
text = text.split('-')[0].split('+')[0]
|
|
463
|
+
component_count = text.split('.').length
|
|
464
|
+
|
|
465
|
+
upper = if component_count == 1
|
|
466
|
+
# Major-only: bump major
|
|
467
|
+
[major + 1, 0, 0]
|
|
468
|
+
else
|
|
469
|
+
# Major.minor or major.minor.patch: bump minor
|
|
470
|
+
[major, minor + 1, 0]
|
|
471
|
+
end
|
|
472
|
+
|
|
473
|
+
[lower, upper]
|
|
474
|
+
end
|
|
475
|
+
|
|
476
|
+
# Returns bounds for caret (^) range per semver spec:
|
|
477
|
+
# ^X.Y.Z where X > 0 → >=X.Y.Z <(X+1).0.0
|
|
478
|
+
# ^0.Y.Z where Y > 0 → >=0.Y.Z <0.(Y+1).0
|
|
479
|
+
# ^0.0.Z → >=0.0.Z <0.0.(Z+1)
|
|
480
|
+
def self.semver_caret_bounds(value)
|
|
481
|
+
major, minor, patch = parse_semver(value)
|
|
482
|
+
lower = [major, minor, patch]
|
|
483
|
+
|
|
484
|
+
upper = if major.positive?
|
|
485
|
+
[major + 1, 0, 0]
|
|
486
|
+
elsif minor.positive?
|
|
487
|
+
[0, minor + 1, 0]
|
|
488
|
+
else
|
|
489
|
+
[0, 0, patch + 1]
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
[lower, upper]
|
|
493
|
+
end
|
|
494
|
+
|
|
495
|
+
# Returns bounds for wildcard (*) range:
|
|
496
|
+
# X.* or X → >=X.0.0 <(X+1).0.0
|
|
497
|
+
# X.Y.* → >=X.Y.0 <X.(Y+1).0
|
|
498
|
+
def self.semver_wildcard_bounds(value)
|
|
499
|
+
cleaned = value.to_s.strip.sub(/^[vV]/, '').gsub('*', '').chomp('.')
|
|
500
|
+
parts = cleaned.split('.').reject(&:empty?)
|
|
501
|
+
|
|
502
|
+
raise InconclusiveMatchError, 'Invalid semver wildcard format' if parts.empty?
|
|
503
|
+
|
|
504
|
+
parts.each do |part|
|
|
505
|
+
raise InconclusiveMatchError, 'Invalid semver wildcard format' if part !~ /^\d+$/
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
major = parts[0].to_i
|
|
509
|
+
case parts.length
|
|
510
|
+
when 1
|
|
511
|
+
[[major, 0, 0], [major + 1, 0, 0]]
|
|
512
|
+
when 2
|
|
513
|
+
minor = parts[1].to_i
|
|
514
|
+
[[major, minor, 0], [major, minor + 1, 0]]
|
|
515
|
+
else
|
|
516
|
+
minor = parts[1].to_i
|
|
517
|
+
patch = parts[2].to_i
|
|
518
|
+
[[major, minor, patch], [major, minor, patch + 1]]
|
|
519
|
+
end
|
|
520
|
+
end
|
|
521
|
+
|
|
425
522
|
def self.match_property(property, property_values, cohort_properties = {})
|
|
426
523
|
# only looks for matches where key exists in property_values
|
|
427
524
|
# doesn't support operator is_not_set
|
|
@@ -496,6 +593,36 @@ module PostHog
|
|
|
496
593
|
elsif operator == 'is_date_after'
|
|
497
594
|
override_date > parsed_date
|
|
498
595
|
end
|
|
596
|
+
when 'semver_eq', 'semver_neq', 'semver_gt', 'semver_gte', 'semver_lt', 'semver_lte'
|
|
597
|
+
override_parsed = parse_semver(override_value)
|
|
598
|
+
flag_parsed = parse_semver(value)
|
|
599
|
+
|
|
600
|
+
case operator
|
|
601
|
+
when 'semver_eq'
|
|
602
|
+
override_parsed == flag_parsed
|
|
603
|
+
when 'semver_neq'
|
|
604
|
+
override_parsed != flag_parsed
|
|
605
|
+
when 'semver_gt'
|
|
606
|
+
(override_parsed <=> flag_parsed) == 1
|
|
607
|
+
when 'semver_gte'
|
|
608
|
+
(override_parsed <=> flag_parsed) >= 0
|
|
609
|
+
when 'semver_lt'
|
|
610
|
+
(override_parsed <=> flag_parsed) == -1
|
|
611
|
+
when 'semver_lte'
|
|
612
|
+
(override_parsed <=> flag_parsed) <= 0
|
|
613
|
+
end
|
|
614
|
+
when 'semver_tilde'
|
|
615
|
+
override_parsed = parse_semver(override_value)
|
|
616
|
+
lower, upper = semver_tilde_bounds(value)
|
|
617
|
+
(override_parsed <=> lower) >= 0 && (override_parsed <=> upper) == -1
|
|
618
|
+
when 'semver_caret'
|
|
619
|
+
override_parsed = parse_semver(override_value)
|
|
620
|
+
lower, upper = semver_caret_bounds(value)
|
|
621
|
+
(override_parsed <=> lower) >= 0 && (override_parsed <=> upper) == -1
|
|
622
|
+
when 'semver_wildcard'
|
|
623
|
+
override_parsed = parse_semver(override_value)
|
|
624
|
+
lower, upper = semver_wildcard_bounds(value)
|
|
625
|
+
(override_parsed <=> lower) >= 0 && (override_parsed <=> upper) == -1
|
|
499
626
|
else
|
|
500
627
|
raise InconclusiveMatchError, "Unknown operator: #{operator}"
|
|
501
628
|
end
|
data/lib/posthog/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: posthog-ruby
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.5.
|
|
4
|
+
version: 3.5.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- ''
|
|
8
|
+
autorequire:
|
|
8
9
|
bindir: bin
|
|
9
10
|
cert_chain: []
|
|
10
|
-
date:
|
|
11
|
+
date: 2026-03-05 00:00:00.000000000 Z
|
|
11
12
|
dependencies:
|
|
12
13
|
- !ruby/object:Gem::Dependency
|
|
13
14
|
name: concurrent-ruby
|
|
@@ -58,6 +59,7 @@ licenses:
|
|
|
58
59
|
- MIT
|
|
59
60
|
metadata:
|
|
60
61
|
rubygems_mfa_required: 'true'
|
|
62
|
+
post_install_message:
|
|
61
63
|
rdoc_options: []
|
|
62
64
|
require_paths:
|
|
63
65
|
- lib
|
|
@@ -72,7 +74,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
72
74
|
- !ruby/object:Gem::Version
|
|
73
75
|
version: '0'
|
|
74
76
|
requirements: []
|
|
75
|
-
rubygems_version:
|
|
77
|
+
rubygems_version: 3.5.10
|
|
78
|
+
signing_key:
|
|
76
79
|
specification_version: 4
|
|
77
80
|
summary: PostHog library
|
|
78
81
|
test_files: []
|