fabricio 1.0.0

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.
Files changed (37) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +12 -0
  3. data/.idea/runConfigurations/IRB_console__fabricio.xml +23 -0
  4. data/.rspec +2 -0
  5. data/.rubocop.yml +1156 -0
  6. data/.travis.yml +10 -0
  7. data/CODE_OF_CONDUCT.md +74 -0
  8. data/Gemfile +4 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +149 -0
  11. data/Rakefile +6 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/docs/api_reference.md +611 -0
  15. data/docs/swagger-api.json +553 -0
  16. data/fabricio.gemspec +29 -0
  17. data/lib/fabricio.rb +2 -0
  18. data/lib/fabricio/authorization/abstract_session_storage.rb +26 -0
  19. data/lib/fabricio/authorization/authorization_client.rb +122 -0
  20. data/lib/fabricio/authorization/memory_session_storage.rb +35 -0
  21. data/lib/fabricio/authorization/session.rb +21 -0
  22. data/lib/fabricio/client/client.rb +92 -0
  23. data/lib/fabricio/models/abstract_model.rb +17 -0
  24. data/lib/fabricio/models/app.rb +24 -0
  25. data/lib/fabricio/models/build.rb +23 -0
  26. data/lib/fabricio/models/organization.rb +22 -0
  27. data/lib/fabricio/models/point.rb +17 -0
  28. data/lib/fabricio/networking/app_request_model_factory.rb +229 -0
  29. data/lib/fabricio/networking/build_request_model_factory.rb +103 -0
  30. data/lib/fabricio/networking/network_client.rb +101 -0
  31. data/lib/fabricio/networking/organization_request_model_factory.rb +27 -0
  32. data/lib/fabricio/networking/request_model.rb +39 -0
  33. data/lib/fabricio/services/app_service.rb +146 -0
  34. data/lib/fabricio/services/build_service.rb +59 -0
  35. data/lib/fabricio/services/organization_service.rb +33 -0
  36. data/lib/fabricio/version.rb +3 -0
  37. metadata +163 -0
@@ -0,0 +1,39 @@
1
+ module Fabricio
2
+ module Networking
3
+ # A data structure that provides all values necessary for making an API request
4
+ class RequestModel
5
+
6
+ attr_accessor :type, :base_url, :api_path, :headers, :body, :params
7
+
8
+ # Initializes a new RequestModel object. You can use a block to fill all the options:
9
+ # model = Fabricio::Networking::RequestModel.new do |config|
10
+ # config.type = :GET
11
+ # config.base_url = FABRIC_API_URL
12
+ # config.api_path = '/apps'
13
+ # end
14
+ #
15
+ # @param options [Hash] Hash containing customizable options
16
+ # @option options [String] :type Request type - :GET or :POST
17
+ # @option options [String] :base_url The base_url. E.g. 'https://fabric.io'
18
+ # @option options [String] :api_path An API endpoint path. E.g. '/apps'
19
+ # @option options [Hash] :headers All request headers
20
+ # @option options [Hash] :body Request body
21
+ # @option options [Hash] :params Request url parameters
22
+ # @return [Fabricio::Networking::RequestModel]
23
+ def initialize(options =
24
+ {
25
+ :type => :GET,
26
+ :base_url => '',
27
+ :api_path => '',
28
+ :headers => {},
29
+ :body => nil,
30
+ :params => {}
31
+ })
32
+ options.each do |key, value|
33
+ instance_variable_set("@#{key}", value)
34
+ end
35
+ yield(self) if block_given?
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,146 @@
1
+ require 'fabricio/networking/app_request_model_factory'
2
+ require 'fabricio/networking/network_client'
3
+ require 'fabricio/models/app'
4
+ require 'fabricio/models/point'
5
+
6
+ module Fabricio
7
+ module Service
8
+ # Service responsible for fetching different App information
9
+ class AppService
10
+
11
+ # Initializes a new AppService object.
12
+ #
13
+ # @param session [Fabricio::Authorization::Session]
14
+ # @param network_client [Fabricio::Networking::NetworkClient]
15
+ # @return [Fabricio::Service::AppService]
16
+ def initialize(session, network_client)
17
+ @session = session
18
+
19
+ @request_model_factory = Fabricio::Networking::AppRequestModelFactory.new
20
+ @network_client = network_client
21
+ end
22
+
23
+ # Obtains the list of all apps
24
+ #
25
+ # @return [Array<Fabricio::Model::App>]
26
+ def all
27
+ request_model = @request_model_factory.all_apps_request_model
28
+ response = @network_client.perform_request(request_model)
29
+ JSON.parse(response.body).map do |app_hash|
30
+ Fabricio::Model::App.new(app_hash)
31
+ end
32
+ end
33
+
34
+ # Obtains a specific app
35
+ #
36
+ # @param id [String] Application identifier
37
+ # @return [Fabricio::Model::App]
38
+ def get(id)
39
+ request_model = @request_model_factory.get_app_request_model(id)
40
+ response = @network_client.perform_request(request_model)
41
+ Fabricio::Model::App.new(JSON.parse(response.body))
42
+ end
43
+
44
+ # Obtains the count of active users at the current moment
45
+ #
46
+ # @param id [String] Application identifier
47
+ # @return [Integer]
48
+ def active_now(id)
49
+ request_model = @request_model_factory.active_now_request_model(@session, id)
50
+ response = @network_client.perform_request(request_model)
51
+ JSON.parse(response.body)['cardinality']
52
+ end
53
+
54
+ # Obtains the count of daily new users
55
+ #
56
+ # @param id [String] Application identifier
57
+ # @param start_time [String] Timestamp of the start date
58
+ # @param end_time [String] Timestamp of the end date
59
+ # @return [Array<Fabricio::Model::Point>]
60
+ def daily_new(id, start_time, end_time)
61
+ request_model = @request_model_factory.daily_new_request_model(@session, id, start_time, end_time)
62
+ response = @network_client.perform_request(request_model)
63
+ JSON.parse(response.body)['series'].map do |array|
64
+ Fabricio::Model::Point.new(array)
65
+ end
66
+ end
67
+
68
+ # Obtains the count of daily active users
69
+ #
70
+ # @param id [String] Application identifier
71
+ # @param start_time [String] Timestamp of the start date
72
+ # @param end_time [String] Timestamp of the end date
73
+ # @param build [String] The version of the build. E.g. '4.0.1 (38)'
74
+ # @return [Array<Fabricio::Model::Point>]
75
+ def daily_active(id, start_time, end_time, build)
76
+ request_model = @request_model_factory.daily_active_request_model(@session, id, start_time, end_time, build)
77
+ response = @network_client.perform_request(request_model)
78
+ JSON.parse(response.body)['series'].map do |array|
79
+ Fabricio::Model::Point.new(array)
80
+ end
81
+ end
82
+
83
+ # Obtains the count of sessions
84
+ #
85
+ # @param id [String] Application identifier
86
+ # @param start_time [String] Timestamp of the start date
87
+ # @param end_time [String] Timestamp of the end date
88
+ # @param build [String] The version of the build. E.g. '4.0.1 (38)'
89
+ # @return [Integer]
90
+ def total_sessions(id, start_time, end_time, build)
91
+ request_model = @request_model_factory.total_sessions_request_model(@session, id, start_time, end_time, build)
92
+ response = @network_client.perform_request(request_model)
93
+ JSON.parse(response.body)['sessions']
94
+ end
95
+
96
+ # Obtains the number of crashes
97
+ #
98
+ # @param id [String] Application identifier
99
+ # @param start_time [String] Timestamp of the start date
100
+ # @param end_time [String] Timestamp of the end date
101
+ # @param builds [Array<String>] The versions of the app. E.g. ['4.0.1 (38)', '4.0.2 (45)']
102
+ # @return [Integer]
103
+ def crashes(id, start_time, end_time, builds)
104
+ request_model = @request_model_factory.crash_count_request_model(id, start_time, end_time, builds)
105
+ response = @network_client.perform_request(request_model)
106
+ JSON.parse(response.body)['data']['project']['crashlytics']['scalars']['crashes']
107
+ end
108
+
109
+ # Obtains application crashfree. It's calculated using a simple formula:
110
+ # crashfree = 1 - total_crashes / total_sessions.
111
+ # AFAIK Fabric.io website uses the same calculations. However, mobile app behaves differently and shows another value.
112
+ #
113
+ # @param id [String] Application identifier
114
+ # @param start_time [String] Timestamp of the start date
115
+ # @param end_time [String] Timestamp of the end date
116
+ # @param build [String] The version of the build. E.g. '4.0.1 (38)'
117
+ # @return [Float]
118
+ def crashfree(id, start_time, end_time, build)
119
+ sessions = total_sessions(id, start_time, end_time, build)
120
+ crashes = crashes(id, start_time, end_time, [build])
121
+ 1 - crashes.to_f / sessions
122
+ end
123
+
124
+ # Obtains application OOM-free (Out of Memory).
125
+ #
126
+ # @param id [String] Application identifier
127
+ # @param start_time [String] Timestamp of the start date
128
+ # @param end_time [String] Timestamp of the end date
129
+ # @param builds [Array<String>] The versions of the app. E.g. ['4.0.1 (38)', '4.0.2 (45)']
130
+ # @return [Float]
131
+ def oomfree(id, start_time, end_time, builds)
132
+ start_date = Time.at(start_time.to_i).to_datetime
133
+ end_date = Time.at(end_time.to_i).to_datetime
134
+ days = (end_date - start_date).to_i + 1
135
+
136
+ request_model = @request_model_factory.oom_count_request_model(id, days, builds)
137
+ response = @network_client.perform_request(request_model)
138
+
139
+ result = JSON.parse(response.body)
140
+ sessions = result['data']['project']['crashlytics']['oomSessionCounts']['timeSeries'][0]['allTimeCount']
141
+ ooms = result['data']['project']['crashlytics']['oomCounts']['timeSeries'][0]['allTimeCount']
142
+ 1 - ooms.to_f / sessions
143
+ end
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,59 @@
1
+ require 'fabricio/networking/build_request_model_factory'
2
+ require 'fabricio/networking/network_client'
3
+ require 'fabricio/models/build'
4
+
5
+ module Fabricio
6
+ module Service
7
+ # Service responsible for fetching different Build information
8
+ class BuildService
9
+
10
+ # Initializes a new BuildService object.
11
+ #
12
+ # @param session [Fabricio::Authorization::Session]
13
+ # @param network_client [Fabricio::Networking::NetworkClient]
14
+ # @return [Fabricio::Service::BuildService]
15
+ def initialize(session, network_client)
16
+ @session = session
17
+
18
+ @request_model_factory = Fabricio::Networking::BuildRequestModelFactory.new
19
+ @network_client = network_client
20
+ end
21
+
22
+ # Obtains the list of all application builds
23
+ #
24
+ # @param app_id [String] Application identifier
25
+ # @return [Array<Fabricio::Model::Build>]
26
+ def all(app_id)
27
+ request_model = @request_model_factory.all_builds_request_model(@session, app_id)
28
+ response = @network_client.perform_request(request_model)
29
+ JSON.parse(response.body)['instances'].map do |hash|
30
+ Fabricio::Model::Build.new(hash)
31
+ end
32
+ end
33
+
34
+ # Obtains a specific build for a specific application
35
+ #
36
+ # @param app_id [String] Application identifier
37
+ # @param version [String] Build version. E.g. '4.0.1'.
38
+ # @param build_number [String] Build number. E.g. '39'.
39
+ # @return [Fabricio::Model::Build]
40
+ def get(app_id, version, build_number)
41
+ request_model = @request_model_factory.get_build_request_model(@session, app_id, version, build_number)
42
+ response = @network_client.perform_request(request_model)
43
+ Fabricio::Model::Build.new(JSON.parse(response.body)['instances'].first)
44
+ end
45
+
46
+ # Obtains an array of top versions for a given app
47
+ #
48
+ # @param app_id [String] Application identifier
49
+ # @param start_time [String] Timestamp of the start date
50
+ # @param end_time [String] Timestamp of the end date
51
+ # @return [Array<String>]
52
+ def top_versions(app_id, start_time, end_time)
53
+ request_model = @request_model_factory.top_versions_request_model(@session, app_id, start_time, end_time)
54
+ response = @network_client.perform_request(request_model)
55
+ JSON.parse(response.body)['builds']
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,33 @@
1
+ require 'fabricio/networking/organization_request_model_factory'
2
+ require 'fabricio/networking/network_client'
3
+ require 'fabricio/models/organization'
4
+
5
+ module Fabricio
6
+ module Service
7
+ # Service responsible for fetching different Organization information
8
+ class OrganizationService
9
+
10
+ # Initializes a new OrganizationService object.
11
+ #
12
+ # @param session [Fabricio::Authorization::Session]
13
+ # @param network_client [Fabricio::Networking::NetworkClient]
14
+ # @return [Fabricio::Service::OrganizationService]
15
+ def initialize(session, network_client)
16
+ @session = session
17
+
18
+ @request_model_factory = Fabricio::Networking::OrganizationRequestModelFactory.new
19
+ @network_client = network_client
20
+ end
21
+
22
+ # Obtains current organization information
23
+ #
24
+ # @return [Fabricio::Model::Organization]
25
+ def get
26
+ request_model = @request_model_factory.get_organization_request_model
27
+ response = @network_client.perform_request(request_model)
28
+ puts(response)
29
+ Fabricio::Model::Organization.new(JSON.parse(response.body)[0])
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,3 @@
1
+ module Fabricio
2
+ VERSION = "1.0.0"
3
+ end
metadata ADDED
@@ -0,0 +1,163 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fabricio
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Egor Tolstoy
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-12-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: webmock
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: codeclimate-test-reporter
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.0.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.0.0
97
+ description:
98
+ email:
99
+ - e.tolstoy@rambler-co.ru
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".codeclimate.yml"
105
+ - ".idea/runConfigurations/IRB_console__fabricio.xml"
106
+ - ".rspec"
107
+ - ".rubocop.yml"
108
+ - ".travis.yml"
109
+ - CODE_OF_CONDUCT.md
110
+ - Gemfile
111
+ - LICENSE.txt
112
+ - README.md
113
+ - Rakefile
114
+ - bin/console
115
+ - bin/setup
116
+ - docs/api_reference.md
117
+ - docs/swagger-api.json
118
+ - fabricio.gemspec
119
+ - lib/fabricio.rb
120
+ - lib/fabricio/authorization/abstract_session_storage.rb
121
+ - lib/fabricio/authorization/authorization_client.rb
122
+ - lib/fabricio/authorization/memory_session_storage.rb
123
+ - lib/fabricio/authorization/session.rb
124
+ - lib/fabricio/client/client.rb
125
+ - lib/fabricio/models/abstract_model.rb
126
+ - lib/fabricio/models/app.rb
127
+ - lib/fabricio/models/build.rb
128
+ - lib/fabricio/models/organization.rb
129
+ - lib/fabricio/models/point.rb
130
+ - lib/fabricio/networking/app_request_model_factory.rb
131
+ - lib/fabricio/networking/build_request_model_factory.rb
132
+ - lib/fabricio/networking/network_client.rb
133
+ - lib/fabricio/networking/organization_request_model_factory.rb
134
+ - lib/fabricio/networking/request_model.rb
135
+ - lib/fabricio/services/app_service.rb
136
+ - lib/fabricio/services/build_service.rb
137
+ - lib/fabricio/services/organization_service.rb
138
+ - lib/fabricio/version.rb
139
+ homepage:
140
+ licenses:
141
+ - MIT
142
+ metadata: {}
143
+ post_install_message:
144
+ rdoc_options: []
145
+ require_paths:
146
+ - lib
147
+ required_ruby_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ required_rubygems_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ requirements: []
158
+ rubyforge_project:
159
+ rubygems_version: 2.4.6
160
+ signing_key:
161
+ specification_version: 4
162
+ summary: A simple gem that fetches mobile application statistics from Fabric.io API.
163
+ test_files: []