hotwire_native_version_gate 0.1.0 → 0.2.0

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: 0a28510bb2899f691c79be862996ac02742b107db5bc52d22ee719a7a20f10fe
4
- data.tar.gz: 55475a89e88294e1e26432c8cdc16cb0db8c9eba448e5359c8218d837f23ed75
3
+ metadata.gz: b384ce481e578f198a0f503b3b3f7230b16f590687f2d8b82338884c51497205
4
+ data.tar.gz: c775c3b942f4e91b9fead131b59f2f1794482ef7b8d747925509cff84786e98d
5
5
  SHA512:
6
- metadata.gz: 7ca0c3871d000b4d5f42c3ebcfa77b888b036d5159739be890f9c98a2b725d2a67883d49e8379def5708db5916453191f120082be6231484c6d69619685d0cf3
7
- data.tar.gz: 88a94760a3c596121ca665951f20444a69e4e66791f29414abeeaa41fc94de848aea8e6e0c4c5a4ef660c6299598e61559e96a5e69c328567a2c542c95399409
6
+ metadata.gz: 712bb5741e30bad54c4f5b909c129113a305223e07a0d950330614059b0d5e0942fb818a84ed66566fbfa39cffe2fcd206fd299a694e6c9936464ca3928b09fb
7
+ data.tar.gz: c5ef5a8af322f641e755e5e718995ed0b811b16afc25dd03e6ad5f161d4ac7a60fd2d3c83f2c91570a4dd43cbe499a942e318c1986da4f007f42db9a0793db82
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -9,8 +9,12 @@ module HotwireNativeVersionGate
9
9
  VersionGate.native_feature(feature, ios: ios, android: android)
10
10
  end
11
11
 
12
- def native_version_regex=(regex)
13
- VersionGate.native_version_regex = regex
12
+ def native_version_regexes
13
+ VersionGate.native_version_regexes
14
+ end
15
+
16
+ def native_version_regexes=(regexes)
17
+ VersionGate.native_version_regexes = regexes
14
18
  end
15
19
  end
16
20
 
@@ -5,18 +5,18 @@ module HotwireNativeVersionGate
5
5
  # Default regex example: Hotwire Native App iOS/1.0.0;
6
6
  # Expected capture groups: platform = (iOS|Android), version = semantic version
7
7
  DEFAULT_NATIVE_VERSION_REGEX = /\bHotwire Native App (?<platform>iOS|Android)\/(?<version>\d+(?:\.\d+)*)\b/
8
+ # Default fallback for apps that don't have the version in the User Agent ex: Hotwire Native iOS;
9
+ FALLBACK_NATIVE_VERSION_REGEX = /\b(Turbo|Hotwire) Native (?<platform>iOS|Android)\b/
8
10
 
9
11
  @native_features = {}
10
- @native_version_regex = DEFAULT_NATIVE_VERSION_REGEX
12
+ @native_version_regexes = [ DEFAULT_NATIVE_VERSION_REGEX, FALLBACK_NATIVE_VERSION_REGEX ]
11
13
 
12
14
  class << self
13
- attr_reader :native_features, :native_version_regex
15
+ attr_reader :native_features, :native_version_regexes
14
16
 
15
- def native_version_regex=(regex)
16
- unless regex.is_a?(Regexp)
17
- raise ArgumentError, "native_version_regex must be a Regexp"
18
- end
19
- @native_version_regex = regex
17
+ def native_version_regexes=(regexes)
18
+ regexes_array = validate_regexes(regexes)
19
+ @native_version_regexes = regexes_array
20
20
  end
21
21
 
22
22
  def native_feature(feature, ios: false, android: false)
@@ -38,12 +38,31 @@ module HotwireNativeVersionGate
38
38
 
39
39
  private
40
40
 
41
- def match_platform(user_agent)
42
- match = user_agent.to_s.match(@native_version_regex)
43
- return match[:platform] if match
41
+ def validate_regexes(regexes)
42
+ # Support both single regex and array of regexes
43
+ regexes_array = Array(regexes)
44
+
45
+ regexes_array.each do |regex|
46
+ unless regex.is_a?(Regexp)
47
+ raise ArgumentError, "native_version_regexes must be an array of Regexp objects, got: #{regex.class}"
48
+ end
49
+ end
50
+
51
+ regexes_array
52
+ end
53
+
54
+ def match_key(user_agent, key)
55
+ @native_version_regexes.each do |regex|
56
+ match = user_agent.to_s.match(regex)
57
+ return match[key] if match&.names&.include?(key.to_s) && match[key]
58
+ end
44
59
  nil
45
60
  end
46
61
 
62
+ def match_platform(user_agent)
63
+ match_key(user_agent, :platform)
64
+ end
65
+
47
66
  def handle_feature(feature_config, user_agent, context: nil)
48
67
  # if false or nil, return false
49
68
  return false unless feature_config
@@ -51,9 +70,9 @@ module HotwireNativeVersionGate
51
70
  return true if feature_config == true
52
71
  # if a string, compare the version
53
72
  if feature_config.is_a?(String)
54
- match = user_agent.to_s.match(@native_version_regex)
55
- return false unless match
56
- return Gem::Version.new(feature_config) <= Gem::Version.new(match[:version])
73
+ version = match_key(user_agent, :version)
74
+ return false unless version
75
+ return Gem::Version.new(feature_config) <= Gem::Version.new(version)
57
76
  end
58
77
  # if a symbol, call the method on the context (if provided) or self
59
78
  if feature_config.is_a?(Symbol)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hotwire_native_version_gate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stuart Yamartino