posthog-ruby 3.5.3 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9401944abdf80537015fd06feb6f1ce795bf0c011271f22216537c75a062dcb8
4
- data.tar.gz: cea7ce9ff778f181f1e011657b1423ffe74ecb530cc1a5213e43b5d1663424ef
3
+ metadata.gz: a707a12f37f1d97a91f179b0b6fa6695b6c6342957de137b38f66ebc0e008a5d
4
+ data.tar.gz: ecace6615c9121841987baaed7178327e1a50db76f73b5b890f6e42da7c30656
5
5
  SHA512:
6
- metadata.gz: a1a717bec693f592ce65145bbb2a41cf7764bbecddfa6eb8ac95aca68ac43f6a36357397106e1929b607495c681448900076e0dd0f024d0d2ee14071f23bc8f7
7
- data.tar.gz: 4ff35396b4819bd246fa38096b38715863741d7419f798598f75f4e32c28388e5548e5ff9fafa17cd096e9dfb38c6a94eb20d1a58eb04868ed961d5beeaf1d80
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PostHog
4
- VERSION = '3.5.3'
4
+ VERSION = '3.5.5'
5
5
  end
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.3
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: 1980-01-02 00:00:00.000000000 Z
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: 4.0.3
77
+ rubygems_version: 3.5.10
78
+ signing_key:
76
79
  specification_version: 4
77
80
  summary: PostHog library
78
81
  test_files: []