firebase-stats 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/firebase-stats +53 -9
- data/lib/reader.rb +1 -1
- data/lib/version.rb +1 -1
- data/lib/wrapper.rb +41 -8
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 02e80c2483750c226661b360380901045e4c62b56241649462a97601f0ad3c39
|
4
|
+
data.tar.gz: 6ef53c34c50fe8b5a769fd8786a4a5a3f475e74c87283938997b41a19cbed5a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05e6a9d46726b08cbf16a2b594a295984cbb84e64a6943e40933a14b5d9ad521a1dacb998b0bd82b604d06aa9b3abe946fa8c1cdda577431963280558ac93b22
|
7
|
+
data.tar.gz: f5eba9bbb41bbb4501d493233df567326269d02a1da7fdef476ec7d0d11e0749e5ff1d7bb324f78356574db1a45fcc635988fa5c4065edcf65004876fedbcf2c
|
data/bin/firebase-stats
CHANGED
@@ -9,8 +9,8 @@ require 'table_print'
|
|
9
9
|
program :name, 'firebase-stats'
|
10
10
|
program :version, FirebaseStats::VERSION
|
11
11
|
program :description, 'A CLI tool to get different stats out of the huge Firebase Analytics CSV'
|
12
|
+
program :help_formatter, Commander::HelpFormatter::TerminalCompact
|
12
13
|
|
13
|
-
global_option('--platform STRING', String, 'Show only stats for this OS. Either ios, android or all (default)')
|
14
14
|
|
15
15
|
def map_platform(options)
|
16
16
|
raw_platform = options.platform ||= 'all'
|
@@ -21,10 +21,12 @@ def map_platform(options)
|
|
21
21
|
end
|
22
22
|
|
23
23
|
command :devices do |c|
|
24
|
-
c.syntax = 'devices [options]'
|
24
|
+
c.syntax = 'devices <path to csv> [options]'
|
25
25
|
c.summary = 'Prints out device stats'
|
26
|
-
c.description = ''
|
27
|
-
c.option '--friendly', '
|
26
|
+
c.description = 'Prints out a table with all of the devices, optionally filtered by OS'
|
27
|
+
c.option '--friendly', 'Prints out Android device models with their human readable name (this is slow)'
|
28
|
+
c.option '--limit NUMBER', Integer, 'Limits number of devices output'
|
29
|
+
c.option '--platform STRING', String, 'Show only stats for this OS. Either ios, android or all (default)'
|
28
30
|
|
29
31
|
c.action do |args, options|
|
30
32
|
stats = FirebaseStats::Reader.new
|
@@ -33,15 +35,17 @@ command :devices do |c|
|
|
33
35
|
platform = map_platform(options)
|
34
36
|
|
35
37
|
wrapper = FirebaseStats::Wrapper.new(stats, platform)
|
36
|
-
tp wrapper.devices(friendly: options.friendly)
|
38
|
+
tp wrapper.devices(friendly: options.friendly, limit: options.limit)
|
37
39
|
end
|
38
40
|
end
|
39
41
|
|
40
42
|
command :os do |c|
|
41
|
-
c.syntax = 'os [options]'
|
42
|
-
c.summary = 'Prints out
|
43
|
-
c.description = ''
|
43
|
+
c.syntax = 'os <path to csv> [options]'
|
44
|
+
c.summary = 'Prints out OS stats'
|
45
|
+
c.description = 'Prints out the number of devices per OS version, optionally filtered by OS and grouped by major version'
|
44
46
|
c.option '--grouped', 'Groups minor OS versions together'
|
47
|
+
c.option '--version-sorted', 'Sorts by OS version instead of percentage'
|
48
|
+
c.option '--platform STRING', String, 'Show only stats for this OS. Either ios, android or all (default)'
|
45
49
|
|
46
50
|
c.action do |args, options|
|
47
51
|
stats = FirebaseStats::Reader.new
|
@@ -51,6 +55,46 @@ command :os do |c|
|
|
51
55
|
|
52
56
|
wrapper = FirebaseStats::Wrapper.new(stats, platform)
|
53
57
|
|
54
|
-
options.grouped.nil? ?
|
58
|
+
data = options.grouped.nil? ? wrapper.os_version : wrapper.os_grouped
|
59
|
+
|
60
|
+
p options
|
61
|
+
unless options.version_sorted.nil?
|
62
|
+
data = data.sort_by do |row|
|
63
|
+
row['version']
|
64
|
+
end.reverse
|
65
|
+
end
|
66
|
+
tp data
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
command :gender do |c|
|
71
|
+
c.syntax = 'gender'
|
72
|
+
c.summary = 'Prints out gender stats (if available)'
|
73
|
+
c.description = 'Prints out a table with number of users of each gender'
|
74
|
+
|
75
|
+
c.action do |args, options|
|
76
|
+
stats = FirebaseStats::Reader.new
|
77
|
+
stats.parse_file(args[0])
|
78
|
+
|
79
|
+
platform = map_platform(options)
|
80
|
+
|
81
|
+
wrapper = FirebaseStats::Wrapper.new(stats, platform)
|
82
|
+
tp wrapper.gender
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
command :gender_age do |c|
|
87
|
+
c.syntax = 'gender_age'
|
88
|
+
c.summary = 'Prints out age group stats (if available)'
|
89
|
+
c.description = 'Prints out a table with percentage of users of each gender grouped by age'
|
90
|
+
|
91
|
+
c.action do |args, options|
|
92
|
+
stats = FirebaseStats::Reader.new
|
93
|
+
stats.parse_file(args[0])
|
94
|
+
|
95
|
+
platform = map_platform(options)
|
96
|
+
|
97
|
+
wrapper = FirebaseStats::Wrapper.new(stats, platform)
|
98
|
+
tp wrapper.gender_age
|
55
99
|
end
|
56
100
|
end
|
data/lib/reader.rb
CHANGED
@@ -22,7 +22,7 @@ class FirebaseStats
|
|
22
22
|
def parse(input)
|
23
23
|
curr_lines = []
|
24
24
|
input.each_with_index do |line, idx|
|
25
|
-
curr_lines.
|
25
|
+
curr_lines.push(line) unless comment?(line) || line.strip.empty?
|
26
26
|
|
27
27
|
if (idx == input.length - 1) || line.strip.empty?
|
28
28
|
process_lines curr_lines unless curr_lines.empty?
|
data/lib/version.rb
CHANGED
data/lib/wrapper.rb
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
|
3
3
|
class FirebaseStats
|
4
4
|
require 'csv'
|
5
|
-
|
5
|
+
require 'android/devices'
|
6
|
+
require 'open-uri'
|
6
7
|
|
7
8
|
# Transforms the parsed Firebase file into something more user friendly
|
8
9
|
class Wrapper
|
@@ -57,22 +58,54 @@ class FirebaseStats
|
|
57
58
|
total
|
58
59
|
end
|
59
60
|
|
60
|
-
def devices(friendly: false)
|
61
|
+
def devices(friendly: false, limit: 10)
|
61
62
|
filtered = filter_device(@stats.data[:devices], @platform)
|
63
|
+
filtered = filtered.take(limit || 10)
|
62
64
|
cleaned = []
|
63
65
|
filtered.each do |row|
|
64
66
|
device = {
|
65
|
-
'model' => row['Device model']
|
66
|
-
'count' => row['Users'].to_i
|
67
|
+
'model' => row['Device model']
|
67
68
|
}
|
68
|
-
|
69
|
-
|
70
|
-
|
69
|
+
if friendly && ((@platform == :all) || (@platform == :android))
|
70
|
+
mapped = Android::Devices.search_by_model(row['Device model'])
|
71
|
+
device['friendly'] = if mapped.nil?
|
72
|
+
row['Device model']
|
73
|
+
else
|
74
|
+
mapped.name
|
75
|
+
end
|
76
|
+
end
|
77
|
+
device['count'] = row['Users'].to_i
|
78
|
+
|
71
79
|
cleaned << device
|
72
80
|
end
|
73
81
|
cleaned
|
74
82
|
end
|
75
83
|
|
84
|
+
def gender
|
85
|
+
raw = @stats.data[:gender]
|
86
|
+
data = []
|
87
|
+
raw.each do |row|
|
88
|
+
data << {
|
89
|
+
'gender' => row['Gender'],
|
90
|
+
'count' => row['Users']
|
91
|
+
}
|
92
|
+
end
|
93
|
+
data
|
94
|
+
end
|
95
|
+
|
96
|
+
def gender_age
|
97
|
+
raw = @stats.data[:gender_age]
|
98
|
+
data = []
|
99
|
+
raw.each do |row|
|
100
|
+
data << {
|
101
|
+
'age' => row['Category'],
|
102
|
+
'male' => (row['Male'].to_f * 100).round(2),
|
103
|
+
'female' => (row['Female'].to_f * 100).round(2)
|
104
|
+
}
|
105
|
+
end
|
106
|
+
data
|
107
|
+
end
|
108
|
+
|
76
109
|
private
|
77
110
|
|
78
111
|
# @param [CSV::Table] os_data
|
@@ -103,7 +136,7 @@ class FirebaseStats
|
|
103
136
|
|
104
137
|
# @param [CSV::Row] device_name
|
105
138
|
def ios_device?(device_name)
|
106
|
-
device_name.downcase.include?('iphone') or device_name.downcase.include?('ipad')
|
139
|
+
device_name.downcase.include?('iphone') or device_name.downcase.include?('ipad') or device_name.downcase.include?('ipod')
|
107
140
|
end
|
108
141
|
|
109
142
|
def as_percentage(total, value)
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
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.2
|
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-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: android-devices
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: commander
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|