firebase-stats 1.0.3 → 1.0.4

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: aaeab070afaf270810993c11137363d74ff5700131a95e52e798cb8e62337525
4
- data.tar.gz: d6fd22e36775bf9ffa6fcab773c027839fa3f67dc6eb0f5aec18ac526bf8a6d0
3
+ metadata.gz: 42d5a812445ad1d9db51a4f816f6f678ea749df62b8c7e510b6cbe7843a950d3
4
+ data.tar.gz: 826c4fe794426ac4efe62df7ad63665e077958c9705c56aa5978b4626ed2d939
5
5
  SHA512:
6
- metadata.gz: ffd869cca7971501c8d066c0ca2a5b9e1ec266c2e33d078345b313678e6df4a64af29b1a337ba64017af63d5379c6991d6fc1e955fc82a5462b80b184816946e
7
- data.tar.gz: be9b8f09955a53e35335e0c7c80c8e0f340ebe0649e8da6249e128ddd9edabf3f284c2ab5b8027b5b8559b799c29d04be10ebef519dcfc70bc1cd663572e3ddd
6
+ metadata.gz: cd7329b485308ff80da4e3be8446b936b1416de11b67db024a3a9fb478420a7bb3747e5bd658ef351504278854b21a58cb5a506e08a04f44f54f49a577906b1b
7
+ data.tar.gz: 761f3532a97601e44363e40cf3b31a9bd18fbda00fb54aac02d401072276fbc1228b683738cf594e899ca9b7e793e77c715fa4953588db1746d49d24b1c0e0cf
data/bin/firebase-stats CHANGED
@@ -34,8 +34,8 @@ command :devices do |c|
34
34
 
35
35
  platform = map_platform(options)
36
36
 
37
- wrapper = FirebaseStats::Wrapper.new(stats, platform)
38
- tp wrapper.devices(friendly: options.friendly, limit: options.limit)
37
+ wrapper = FirebaseStats::Wrapper.new(stats)
38
+ tp wrapper.devices(friendly: options.friendly, limit: options.limit, platform: platform)
39
39
  end
40
40
  end
41
41
 
@@ -53,15 +53,13 @@ command :os do |c|
53
53
 
54
54
  platform = map_platform(options)
55
55
 
56
- wrapper = FirebaseStats::Wrapper.new(stats, platform)
56
+ wrapper = FirebaseStats::Wrapper.new(stats)
57
57
 
58
- data = options.grouped.nil? ? wrapper.os_version : wrapper.os_grouped
58
+ grouped = options.grouped || false
59
+ major_order = options.version_sorted || false
60
+
61
+ data = wrapper.os(platform: platform, grouped: grouped, major_order: major_order)
59
62
 
60
- unless options.version_sorted.nil?
61
- data = data.sort_by do |row|
62
- row['version']
63
- end.reverse
64
- end
65
63
  tp data
66
64
  end
67
65
  end
@@ -77,7 +75,7 @@ command :gender do |c|
77
75
 
78
76
  platform = map_platform(options)
79
77
 
80
- wrapper = FirebaseStats::Wrapper.new(stats, platform)
78
+ wrapper = FirebaseStats::Wrapper.new(stats)
81
79
  tp wrapper.gender
82
80
  end
83
81
  end
@@ -93,7 +91,7 @@ command :gender_age do |c|
93
91
 
94
92
  platform = map_platform(options)
95
93
 
96
- wrapper = FirebaseStats::Wrapper.new(stats, platform)
94
+ wrapper = FirebaseStats::Wrapper.new(stats)
97
95
  tp wrapper.gender_age
98
96
  end
99
97
  end
@@ -0,0 +1,24 @@
1
+ module FirebaseStats
2
+ # Parses the Firebase CSV file into sections
3
+ class DeviceUtils
4
+ # Is this device name an iOS device?
5
+ # @param [CSV::Row] device_name
6
+ def self.ios_device?(device_name)
7
+ device_name.downcase.include?('iphone') or device_name.downcase.include?('ipad') or device_name.downcase.include?('ipod')
8
+ end
9
+
10
+ # Filters a device list to only the requested platform
11
+ # @param [CSV::Table] device_data
12
+ # @param [Symbol] platform One of :all, :ios, :android
13
+ def self.filter_device(device_data, platform)
14
+ case platform
15
+ when :android
16
+ device_data.reject { |row| ios_device? row['Device model'] }
17
+ when :ios
18
+ device_data.select { |row| ios_device? row['Device model'] }
19
+ else
20
+ device_data
21
+ end
22
+ end
23
+ end
24
+ end
@@ -3,3 +3,4 @@
3
3
  require 'reader'
4
4
  require 'wrapper'
5
5
  require 'version'
6
+ require 'device_utils'
data/lib/reader.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class FirebaseStats
3
+ module FirebaseStats
4
4
  require 'csv'
5
5
 
6
6
  # Parses the Firebase CSV file into sections
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class FirebaseStats
4
- VERSION = '1.0.3'
3
+ module FirebaseStats
4
+ VERSION = '1.0.4'
5
5
  end
data/lib/wrapper.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class FirebaseStats
3
+ module FirebaseStats
4
4
  require 'csv'
5
5
  require 'android/devices'
6
6
  require 'open-uri'
@@ -8,58 +8,34 @@ class FirebaseStats
8
8
  # Transforms the parsed Firebase file into something more user friendly
9
9
  class Wrapper
10
10
  # @param [FirebaseStats::Reader] stats
11
- # @param [Symbol] platform One of :all, :ios, :android
12
- def initialize(stats, platform = :all)
11
+ def initialize(stats)
13
12
  super()
14
13
  @stats = stats
15
- @platform = platform
16
14
  end
17
15
 
18
- def os_version
19
- filtered = filter_os(@stats.data[:os_version], @platform)
20
-
21
- cleaned = []
22
- filtered.each do |row|
23
- cleaned << {
24
- 'version' => row['OS with version'],
25
- 'count' => row['Users'].to_i,
26
- 'percentage' => as_percentage(os_total, row['Users'].to_f)
27
- }
28
- end
29
- cleaned
30
- end
31
-
32
- def os_grouped
33
- raw_os = @stats.data[:os_version]
34
-
35
- grouped = case @platform
36
- when :ios
37
- ios_os_group(raw_os)
38
- when :android
39
- android_os_group(raw_os)
40
- else
41
- android_os_group(raw_os).merge ios_os_group(raw_os)
42
- end
43
- computed = []
44
- grouped.each do |k, v|
45
- version_name = k
46
- total = v.map { |version| version['Users'].to_i }.reduce(0, :+)
47
- computed << { 'version' => version_name, 'total' => total, 'percentage' => as_percentage(os_total, total.to_f) }
48
- end
49
- computed
50
- end
51
-
52
- def os_total
53
- filtered = filter_os(@stats.data[:os_version], @platform)
54
- total = 0
55
- filtered.each do |row|
56
- total += row['Users'].to_i
57
- end
58
- total
16
+ # Get all OS versions, grouped by Major version
17
+ # @param [Symbol] platform One of :all, :ios, :android
18
+ # @param [Boolean] grouped Group by Major OS version
19
+ # @param [Boolean] major_order Order by Major OS version (instead of percentage)
20
+ def os(platform: :all, grouped: true, major_order: true)
21
+ os_data = all_os
22
+ filtered = filter_os(os_data, platform)
23
+
24
+ data = if grouped
25
+ make_group_stats(filtered, platform)
26
+ else
27
+ filtered
28
+ end
29
+
30
+ major_order ? major_version_sort(data) : data
59
31
  end
60
32
 
61
- def devices(friendly: false, limit: 10)
62
- filtered = filter_device(@stats.data[:devices], @platform)
33
+ # Gets all devices
34
+ # @param [Boolean] friendly Transform the Android model numbers into their human numaes
35
+ # @param [Integer] limit Number of devices to turn
36
+ # @param [Symbol] platform One of :all, :ios, :android
37
+ def devices(friendly: false, limit: 10, platform: :all)
38
+ filtered = DeviceUtils.filter_device(@stats.data[:devices], @platform)
63
39
  filtered = filtered.take(limit || 10)
64
40
  cleaned = []
65
41
  filtered.each do |row|
@@ -113,32 +89,14 @@ class FirebaseStats
113
89
  def filter_os(os_data, platform)
114
90
  case platform
115
91
  when :android
116
- os_data.select { |row| row['OS with version'].downcase.include?('android') }
92
+ os_data.select { |row| row['version'].downcase.include?('android') }
117
93
  when :ios
118
- os_data.select { |row| row['OS with version'].downcase.include?('ios') }
94
+ os_data.select { |row| row['version'].downcase.include?('ios') }
119
95
  else
120
96
  os_data
121
97
  end
122
98
  end
123
99
 
124
- # @param [CSV::Table] device_data
125
- # @param [Symbol] platform One of :all, :ios, :android
126
- def filter_device(device_data, platform)
127
- case platform
128
- when :android
129
- device_data.reject { |row| ios_device? row['Device model'] }
130
- when :ios
131
- device_data.select { |row| ios_device? row['Device model'] }
132
- else
133
- device_data
134
- end
135
- end
136
-
137
- # @param [CSV::Row] device_name
138
- def ios_device?(device_name)
139
- device_name.downcase.include?('iphone') or device_name.downcase.include?('ipad') or device_name.downcase.include?('ipod')
140
- end
141
-
142
100
  def as_percentage(total, value)
143
101
  percentage = (value / total) * 100
144
102
  if percentage < 0.01
@@ -149,11 +107,59 @@ class FirebaseStats
149
107
  end
150
108
 
151
109
  def ios_os_group(os_details)
152
- filter_os(os_details, :ios).group_by { |row| row['OS with version'].match('(iOS [0-9]{1,2})').captures[0] }
110
+ filter_os(os_details, :ios).group_by { |row| row['version'].match('(iOS [0-9]{1,2})').captures[0] }
153
111
  end
154
112
 
155
113
  def android_os_group(os_details)
156
- filter_os(os_details, :android).group_by { |row| row['OS with version'].match('(Android [0-9]{1,2})').captures[0] }
114
+ filter_os(os_details, :android).group_by { |row| row['version'].match('(Android [0-9]{1,2})').captures[0] }
115
+ end
116
+
117
+ # Get all OS versions
118
+ def all_os
119
+ data = @stats.data[:os_version]
120
+
121
+ data.map do |row|
122
+ {
123
+ 'version' => row['OS with version'],
124
+ 'count' => row['Users'].to_i
125
+ }
126
+ end
127
+ end
128
+
129
+ def make_group_stats(os_data, platform)
130
+ data = make_os_groups(os_data, platform)
131
+
132
+ total_devices = os_total(os_data)
133
+ data.map do |k, v|
134
+ version_name = k
135
+ group_total = v.map { |version| version['count'].to_i }.reduce(0, :+)
136
+ { 'version' => version_name,
137
+ 'total' => group_total,
138
+ 'percentage' => as_percentage(total_devices.to_f, group_total) }
139
+ end
140
+ end
141
+
142
+ def make_os_groups(os_data, platform)
143
+ case platform
144
+ when :ios
145
+ ios_os_group(os_data)
146
+ when :android
147
+ android_os_group(os_data)
148
+ else
149
+ android_os_group(os_data).merge ios_os_group(os_data)
150
+ end
151
+ end
152
+
153
+ def os_total(os_data)
154
+ os_data.map { |row| row['count'] }.reduce(0, :+)
155
+ end
156
+
157
+ def major_version_sort(data)
158
+ data.sort_by do |row|
159
+ version = row['version']
160
+ number = version.match('([0-9.]+)').captures[0]
161
+ Gem::Version.new(number)
162
+ end.reverse
157
163
  end
158
164
  end
159
165
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: firebase-stats
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - chedabob
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-19 00:00:00.000000000 Z
11
+ date: 2021-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: android-devices
@@ -104,6 +104,7 @@ extra_rdoc_files: []
104
104
  files:
105
105
  - bin/firebase-stats
106
106
  - lib/.DS_Store
107
+ - lib/device_utils.rb
107
108
  - lib/firebase-stats.rb
108
109
  - lib/reader.rb
109
110
  - lib/version.rb