firebase-stats 1.0.2 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 02e80c2483750c226661b360380901045e4c62b56241649462a97601f0ad3c39
4
- data.tar.gz: 6ef53c34c50fe8b5a769fd8786a4a5a3f475e74c87283938997b41a19cbed5a0
3
+ metadata.gz: fbcdeca6db0a52d5363c394beaaa7eafa626cf9cc33efd6bb50e41c1ad364d89
4
+ data.tar.gz: 20249bc78d26a568cf21288b144aae3999e597519a9bcc41e41f3f61890a027a
5
5
  SHA512:
6
- metadata.gz: 05e6a9d46726b08cbf16a2b594a295984cbb84e64a6943e40933a14b5d9ad521a1dacb998b0bd82b604d06aa9b3abe946fa8c1cdda577431963280558ac93b22
7
- data.tar.gz: f5eba9bbb41bbb4501d493233df567326269d02a1da7fdef476ec7d0d11e0749e5ff1d7bb324f78356574db1a45fcc635988fa5c4065edcf65004876fedbcf2c
6
+ metadata.gz: 20c75f62fdd228779f51ba1a64b5f783c07b859a280efb65be07e47b5c8aabe6b94859650bb99d85f71056d5a4b1b2336bd9af148b724c67fb208fa4e52390a6
7
+ data.tar.gz: 8b8baf3a8985fc72ff61a5b75d69cc6660bc53bd42e0d5271a62e98d5eef262ba86631d99ee3e10226211ecd991327626ccc15e991a0acac77ae0895432a2678
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,16 +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
- p options
61
- unless options.version_sorted.nil?
62
- data = data.sort_by do |row|
63
- row['version']
64
- end.reverse
65
- end
66
63
  tp data
67
64
  end
68
65
  end
@@ -76,9 +73,7 @@ command :gender do |c|
76
73
  stats = FirebaseStats::Reader.new
77
74
  stats.parse_file(args[0])
78
75
 
79
- platform = map_platform(options)
80
-
81
- wrapper = FirebaseStats::Wrapper.new(stats, platform)
76
+ wrapper = FirebaseStats::Wrapper.new(stats)
82
77
  tp wrapper.gender
83
78
  end
84
79
  end
@@ -92,9 +87,7 @@ command :gender_age do |c|
92
87
  stats = FirebaseStats::Reader.new
93
88
  stats.parse_file(args[0])
94
89
 
95
- platform = map_platform(options)
96
-
97
- wrapper = FirebaseStats::Wrapper.new(stats, platform)
90
+ wrapper = FirebaseStats::Wrapper.new(stats)
98
91
  tp wrapper.gender_age
99
92
  end
100
93
  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
@@ -59,12 +59,14 @@ class FirebaseStats
59
59
  'Device model,Users' => :devices,
60
60
  'OS with version,Users' => :os_version,
61
61
  'Gender,Users' => :gender,
62
- 'Category,Female,Male' => :gender_age,
63
62
  'Platform,Users' => :platform,
64
63
  'Platform,Users,% Total,User engagement,Total revenue' => :platform_engagement
65
64
  }
65
+ cleaned_header = header.strip
66
+ section = mappings[cleaned_header]
66
67
 
67
- mappings[header.strip]
68
+ section = :gender_age if section.nil? and cleaned_header.include? 'Category,'
69
+ section
68
70
  end
69
71
  # rubocop:enable Metrics/MethodLength
70
72
 
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class FirebaseStats
4
- VERSION = '1.0.2'
3
+ module FirebaseStats
4
+ VERSION = '1.0.6'
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,65 +8,41 @@ 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|
66
42
  device = {
67
43
  'model' => row['Device model']
68
44
  }
69
- if friendly && ((@platform == :all) || (@platform == :android))
45
+ if friendly && ((platform == :all) || (platform == :android))
70
46
  mapped = Android::Devices.search_by_model(row['Device model'])
71
47
  device['friendly'] = if mapped.nil?
72
48
  row['Device model']
@@ -87,7 +63,7 @@ class FirebaseStats
87
63
  raw.each do |row|
88
64
  data << {
89
65
  'gender' => row['Gender'],
90
- 'count' => row['Users']
66
+ 'count' => row['Users'].to_i
91
67
  }
92
68
  end
93
69
  data
@@ -100,7 +76,8 @@ class FirebaseStats
100
76
  data << {
101
77
  'age' => row['Category'],
102
78
  'male' => (row['Male'].to_f * 100).round(2),
103
- 'female' => (row['Female'].to_f * 100).round(2)
79
+ 'female' => (row['Female'].to_f * 100).round(2),
80
+ 'other' => (row['Other'].to_f * 100).round(2)
104
81
  }
105
82
  end
106
83
  data
@@ -113,32 +90,14 @@ class FirebaseStats
113
90
  def filter_os(os_data, platform)
114
91
  case platform
115
92
  when :android
116
- os_data.select { |row| row['OS with version'].downcase.include?('android') }
93
+ os_data.select { |row| row['version'].downcase.include?('android') }
117
94
  when :ios
118
- os_data.select { |row| row['OS with version'].downcase.include?('ios') }
95
+ os_data.select { |row| row['version'].downcase.include?('ios') }
119
96
  else
120
97
  os_data
121
98
  end
122
99
  end
123
100
 
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
101
  def as_percentage(total, value)
143
102
  percentage = (value / total) * 100
144
103
  if percentage < 0.01
@@ -149,11 +108,59 @@ class FirebaseStats
149
108
  end
150
109
 
151
110
  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] }
111
+ filter_os(os_details, :ios).group_by { |row| row['version'].match('(iOS [0-9]{1,2})').captures[0] }
153
112
  end
154
113
 
155
114
  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] }
115
+ filter_os(os_details, :android).group_by { |row| row['version'].match('(Android [0-9]{1,2})').captures[0] }
116
+ end
117
+
118
+ # Get all OS versions
119
+ def all_os
120
+ data = @stats.data[:os_version]
121
+
122
+ data.map do |row|
123
+ {
124
+ 'version' => row['OS with version'],
125
+ 'count' => row['Users'].to_i
126
+ }
127
+ end
128
+ end
129
+
130
+ def make_group_stats(os_data, platform)
131
+ data = make_os_groups(os_data, platform)
132
+
133
+ total_devices = os_total(os_data)
134
+ data.map do |k, v|
135
+ version_name = k
136
+ group_total = v.map { |version| version['count'].to_i }.reduce(0, :+)
137
+ { 'version' => version_name,
138
+ 'total' => group_total,
139
+ 'percentage' => as_percentage(total_devices.to_f, group_total) }
140
+ end
141
+ end
142
+
143
+ def make_os_groups(os_data, platform)
144
+ case platform
145
+ when :ios
146
+ ios_os_group(os_data)
147
+ when :android
148
+ android_os_group(os_data)
149
+ else
150
+ android_os_group(os_data).merge ios_os_group(os_data)
151
+ end
152
+ end
153
+
154
+ def os_total(os_data)
155
+ os_data.map { |row| row['count'] }.reduce(0, :+)
156
+ end
157
+
158
+ def major_version_sort(data)
159
+ data.sort_by do |row|
160
+ version = row['version']
161
+ number = version.match('([0-9.]+)').captures[0]
162
+ Gem::Version.new(number)
163
+ end.reverse
157
164
  end
158
165
  end
159
166
  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.2
4
+ version: 1.0.6
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-18 00:00:00.000000000 Z
11
+ date: 2021-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: android-devices
@@ -103,7 +103,7 @@ extensions: []
103
103
  extra_rdoc_files: []
104
104
  files:
105
105
  - bin/firebase-stats
106
- - lib/.DS_Store
106
+ - lib/device_utils.rb
107
107
  - lib/firebase-stats.rb
108
108
  - lib/reader.rb
109
109
  - lib/version.rb
@@ -127,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
127
  - !ruby/object:Gem::Version
128
128
  version: '0'
129
129
  requirements: []
130
- rubygems_version: 3.2.14
130
+ rubygems_version: 3.0.9
131
131
  signing_key:
132
132
  specification_version: 4
133
133
  summary: Firebase CSV Stats CLI
data/lib/.DS_Store DELETED
Binary file