firebase-stats 1.0.3 → 1.0.4

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: 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