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 +4 -4
- data/bin/firebase-stats +9 -11
- data/lib/device_utils.rb +24 -0
- data/lib/firebase-stats.rb +1 -0
- data/lib/reader.rb +1 -1
- data/lib/version.rb +2 -2
- data/lib/wrapper.rb +75 -69
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 42d5a812445ad1d9db51a4f816f6f678ea749df62b8c7e510b6cbe7843a950d3
|
4
|
+
data.tar.gz: 826c4fe794426ac4efe62df7ad63665e077958c9705c56aa5978b4626ed2d939
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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
|
56
|
+
wrapper = FirebaseStats::Wrapper.new(stats)
|
57
57
|
|
58
|
-
|
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
|
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
|
94
|
+
wrapper = FirebaseStats::Wrapper.new(stats)
|
97
95
|
tp wrapper.gender_age
|
98
96
|
end
|
99
97
|
end
|
data/lib/device_utils.rb
ADDED
@@ -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
|
data/lib/firebase-stats.rb
CHANGED
data/lib/reader.rb
CHANGED
data/lib/version.rb
CHANGED
data/lib/wrapper.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
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
|
-
|
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
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
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
|
-
|
62
|
-
|
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['
|
92
|
+
os_data.select { |row| row['version'].downcase.include?('android') }
|
117
93
|
when :ios
|
118
|
-
os_data.select { |row| row['
|
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['
|
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['
|
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.
|
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-
|
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
|