{"id":13905145,"url":"https://github.com/strongself/fabricio","last_synced_at":"2026-02-18T09:02:42.191Z","repository":{"id":87604985,"uuid":"74888123","full_name":"strongself/fabricio","owner":"strongself","description":"Fetch Fabric.io statistics like never before","archived":false,"fork":false,"pushed_at":"2018-10-17T10:31:43.000Z","size":233,"stargazers_count":156,"open_issues_count":14,"forks_count":25,"subscribers_count":31,"default_branch":"develop","last_synced_at":"2025-06-18T08:50:04.251Z","etag":null,"topics":["crash-reporting","fabric"],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/strongself.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2016-11-27T13:05:11.000Z","updated_at":"2024-09-10T12:24:44.000Z","dependencies_parsed_at":"2023-03-13T18:43:07.224Z","dependency_job_id":null,"html_url":"https://github.com/strongself/fabricio","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/strongself/fabricio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strongself%2Ffabricio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strongself%2Ffabricio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strongself%2Ffabricio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strongself%2Ffabricio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/strongself","download_url":"https://codeload.github.com/strongself/fabricio/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strongself%2Ffabricio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29574065,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-18T08:38:15.585Z","status":"ssl_error","status_checked_at":"2026-02-18T08:38:14.917Z","response_time":162,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["crash-reporting","fabric"],"created_at":"2024-08-06T23:01:10.791Z","updated_at":"2026-02-18T09:02:42.175Z","avatar_url":"https://github.com/strongself.png","language":"Ruby","funding_links":[],"categories":["HarmonyOS","Ruby"],"sub_categories":["Windows Manager"],"readme":"# Fabricio\n\n[![Gem Version](https://badge.fury.io/rb/fabricio.svg)](https://badge.fury.io/rb/fabricio)\n[![](https://travis-ci.org/strongself/fabricio.svg?branch=develop)](https://travis-ci.org/strongself/fabricio)\n[![Code Climate](https://codeclimate.com/github/strongself/fabricio/badges/gpa.svg)](https://codeclimate.com/github/strongself/fabricio)\n[![Test Coverage](https://codeclimate.com/github/strongself/fabricio/badges/coverage.svg)](https://codeclimate.com/github/strongself/fabricio/coverage)\n\n\u003e pronounce as [f-ah-bree-see-oh]\n\nA simple gem that fetches mobile application statistics from [Fabric.io](http://fabric.io) using its ~~private~~ not publicly opened [API](https://github.com/strongself/fabricio/blob/develop/docs/api_reference.md).\n\nThere is a possibility that in some point of time it may break. Feel free to [post an issue](https://github.com/strongself/fabricio/issues) and we'll fix it ASAP.\n\n## The Story Behind\n\n[Fabric.io](http://fabric.io) is a great tool made for mobile application developers. It provides data about standard and out-of-memory crashes, active users, audience growth and a lot more. Unfortunately the only official way to work with this data is using Fabric.io website. That means - no automation and no integrations with other services.\n\nWe decided to fix this issue.\n\n|         | Key Features|\n|---------|---------------|\n|🍫 | Hides the complexity of different Fabric.io APIs behind a simple wrapper.|\n|📚 | Provides data about organization, applications and builds.|\n|💥 | Shows crash- and out-of-memory- free metrics.|\n|⏰  | Automatically refreshes session in case of its expiration.|\n|🛠 | Provides a simple way of adding your adapter for storing session data in a database of your choice.|\n\n## Installation\n\nAdd this line to your application's Gemfile:\n\n```ruby\ngem 'fabricio'\n```\n\nAnd then execute:\n\n    $ bundle\n\nOr install it yourself as:\n\n    $ gem install fabricio\n\n## Quick Start\n\n### CLI\n#### Commands\n##### App\n```\n  # Obtain all app\n  fabricio app all\n\n  # Obtain single app\n  fabricio app get --app_id 'app_id'\n\n  # Obtain active now count\n  fabricio app active_now --organization_id 'org_id' --app_id 'app_id'\n\n  # Obtain single issue\n  fabricio app single_issue --app_id 'app_id' --issue_id 'issue_id'\n\n  # Obtain single issue session\n  fabricio app issue_session  --app_id 'app_id' --issue_id 'issue_id' --session_id 'session_id'\n\n  # Obtain latest issue session\n  fabricio app latest_session --app_id 'app_id'\n```\n##### Build\n```\n  # Obtain all builds\n  fabricio build all --organization_id 'org_id' --app_id 'app_id'\n\n  # Obtain single build\n  fabricio build get --organization_id 'org_id' --app_id 'app_id' --version 'version' --build_number 'build_number'\n```\n##### Version\n```\n  # Obtain all versions\n  fabricio version all --app_id 'app_id'\n\n  # Obtain top versions               \n  fabricio version top --organization_id 'org_id' --app_id 'app_id' --start_time 'timestamp' --end_time 'timestamp'\n```\n##### Organization\n```\n  # Obtain organization                  \n  fabricio organization all\n```\n##### Other\n```\n  # Setup credential                                                      \n  fabricio credential\n\n  # Describe available commands or one specific command                                                       \n  fabricio help [COMMAND]                                                          \n```\n#### Example\n```bash\n\u003e fabricio credential\nSetup credential\nWe have to know you\\'re email from fabric account\nemail:  test@test.com\nNow we want your password. Do not be afraid, it is stored locally\npassword:\nSuccessful login to TestOrganization\n\u003e fabricio organization all\n[{\"id\"=\u003e\"424423ac76fa54934e00a09b\", \"alias\"=\u003e\"test\", \"name\"=\u003e\"Test\", \"api_key\"=\u003e\"19ac3e6195b1900ada120c1e0c1230a818626d55\", \"enrollments\"=\u003e{\"answers_enhanced_feature_set_enabled_for_new_apps\"=\u003e\"false\", \"answers_ip_address_tracking_enabled_for_new_apps\"=\u003e\"true\", \"beta_distribution\"=\u003e\"true\"}, \"accounts_count\"=\u003e100, \"mopub_id\"=\u003e\"11142\", \"sdk_organization\"=\u003etrue, \"apps_counts\"=\u003e{\"ios\"=\u003e9}, \"build_secret\"=\u003e\"fdda1e597843e25731848bb46eec2cc893ea86847e22d5f44567ecd48ff4e32\"}]\n\u003e fabricio app all\n...\n```\n#### Default values\nIf your account have only one organization/app then it will be used by default and it is not necessary to set.\n```\nfabricio build all\n```\n#### Parsing\nYou can use [`jq`](https://stedolan.github.io/jq/) for parsing json\n\u003e fabricio version all --app_id 'app_id' | jq 'sort_by(.major)[-1].synthesized_version'\n\"14.0 (131)\"\n### Code\n1. Create a `Fabricio::Client` object and configure it on initialization.\n\n  ```ruby\n  require 'Fabricio'\n\n  client = Fabricio::Client.new do |config|\n      config.username = 'your_email'\n      config.password = 'your_password'\n  end\n  ```\n\n2. Use this client to query any data you want.\n\n  ```ruby\n  client.app.all # Returns all applications on your account\n  client.app.get(app_id: 'app_id') # Returns information about specific application\n  client.app.crashfree(app_id: 'app_id', start_time: '1478736000', end_time: '1481328000', build: 'all') # Returns application crashfree for a given period of time\n  client.organization.all # Returns information about your organizations\n  ```\n\n3. If you want to check the exact server output for a model, you can call `json` method on it:\n\n  `client.app.get(app_id: 'app_id').json`\n\n  You can call a method similar to any key in this hash:\n\n  `client.app.get(app_id: 'app_id').importance_level`\n\n## Commands\n\n### Organization\n\n#### `client.organization.all`\n\nObtains information about your organizations.\n\n### App\n\n#### `client.app.all`\n\nObtains the list of all apps.\n\n#### `client.app.get(app_id: 'app_id')`\n\nObtains a specific app.\n\n#### `client.app.active_now(organization_id: 'organization_id', app_id: 'app_id')`\n\nObtains the count of active users at the current moment.\n\n#### `client.app.daily_new(organization_id: 'organization_id', app_id: 'app_id', start_time: 'start_timestamp', end_time: 'end_timestamp')`\n\nObtains the count of daily new users.\n\n#### `client.app.daily_active(app_id: 'app_id', start_time: 'start_timestamp', end_time: 'end_timestamp', build: 'build')`\n\nObtains the count of daily active users.\n\n#### `client.app.total_sessions(organization_id: 'organization_id', app_id: 'app_id', start_time: 'start_timestamp', end_time: 'end_timestamp', build: 'build')`\n\nObtains the count of sessions.\n\n#### `client.app.crashes(app_id: 'app_id', start_time: 'start_timestamp', end_time: 'end_timestamp', builds: 'builds')`\n\nObtains the count of crashes for a number of builds.\n\n#### `client.app.crashfree(app_id: 'app_id', start_time: 'start_timestamp', end_time: 'end_timestamp', build: 'build')`\n\nObtains application crashfree.\n\n\u003e Fabric.io website uses the same calculations. However, mobile app behaves differently and shows another value.\n\n#### `client.app.top_issues(app_id: 'app_id', start_time: 'start_timestamp', end_time: 'end_timestamp', build: 'build', count: count)`\n\nObtain top issues.\n\n#### `client.app.single_issue(app_id: 'app_id', issue_id: 'issue_id', start_time: 'start_timestamp', end_time: 'end_timestamp')`\n\nObtain single issue.\n\n#### `client.app.issue_session(app_id: 'app_id', issue_id: 'issue_id', session_id: 'session_id')`\n\nObtain issue session.\n\n#### `client.app.add_comment(app_id: 'app_id', issue_id: 'issue_id', message: 'message')`\n\nAdd comment.\n\n#### `client.app.oomfree(app_id: 'app_id', start_time: 'start_timestamp', end_time: 'end_timestamp', builds:'builds')`\n\nObtains application out-of-memory free for a number of builds.\n\n### Build\n\n#### `client.build.all(organization_id: 'organization_id', app_id: 'app_id')`\n\nObtains the list of all application builds.\n\n#### `client.build.get(organization_id: 'organization_id', app_id: 'app_id', version: 'version', build_number: 'build_number')`\n\nObtains a specific build for a specific application.\n\n### Version\n\n#### `client.version.all(app_id: 'app_id', start_time: 'start_timestamp', end_time: 'end_timestamp')`\n\nObtains an array of all versions for a given application.\n\n#### `client.version.top(organization_id: 'organization_id', app_id: 'app_id', start_time: 'start_timestamp', end_time: 'end_timestamp')`\n\nObtains an array of top versions for a given application.\n\n### Events\n\n#### `client.app.all_custom_events(organization_id: 'organization_id', app_id: 'app_id', start_time: 'start_timestamp', end_time: 'end_timestamp', build: 'build')`\n\nObtains list of all custom event types.\n\n#### `client.app.custom_event_total(organization_id: 'organization_id', app_id: 'app_id', start_time: 'start_timestamp', end_time: 'end_timestamp', build: 'build', event_type: 'event_type')`\n\nObtains the total count for the specified custom event type.\n\n#### `client.app.custom_event_unique_devices(organization_id: 'organization_id', app_id: 'app_id', start_time: 'start_timestamp', end_time: 'end_timestamp', build: 'build', event_type: 'event_type')`\n\nObtains the unique device count for the specified custom event type.\n\n#### `client.app.all_custom_event_attribute(organization_id: 'organization_id', app_id: 'app_id', start_time: 'start_timestamp', end_time: 'end_timestamp', event_type: 'event_type')`\n\nObtains list of all attributes for the specified custom event type.\n\n#### `client.app.custom_event_attribute(organization_id: 'organization_id', app_id: 'app_id', start_time: 'start_timestamp', end_time: 'end_timestamp', build: 'build', event_type: 'event_type', event_attribute: 'event_attribute', selected_time: 'selected_timestamp')`\n\nObtains the attribute count for the specified custom event type.\n\n## Additional Info\n\nFabric.io API:\n\n- [cURL requests](https://github.com/strongself/fabricio/blob/develop/docs/api_reference.md)\n- [Swagger](https://github.com/strongself/fabricio/blob/develop/docs/swagger-api.json)\n\n## Authors\n\n- Egor Tolstoy\n- Vadim Smal\n\nThanks for help in dealing with API to Irina Dyagileva and Andrey Smirnov.\n\n## License\n\nThe gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstrongself%2Ffabricio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstrongself%2Ffabricio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstrongself%2Ffabricio/lists"}