{"id":21541671,"url":"https://github.com/concretesolutions/yosef-ios","last_synced_at":"2025-04-10T04:23:36.309Z","repository":{"id":56930191,"uuid":"125526709","full_name":"concretesolutions/yosef-ios","owner":"concretesolutions","description":"yosef-ios","archived":false,"fork":false,"pushed_at":"2020-01-30T14:17:47.000Z","size":748,"stargazers_count":11,"open_issues_count":4,"forks_count":2,"subscribers_count":9,"default_branch":"master","last_synced_at":"2024-04-20T07:02:23.524Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Swift","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/concretesolutions.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-03-16T14:23:51.000Z","updated_at":"2022-02-24T21:59:58.000Z","dependencies_parsed_at":"2022-08-21T06:20:34.455Z","dependency_job_id":null,"html_url":"https://github.com/concretesolutions/yosef-ios","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/concretesolutions%2Fyosef-ios","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/concretesolutions%2Fyosef-ios/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/concretesolutions%2Fyosef-ios/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/concretesolutions%2Fyosef-ios/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/concretesolutions","download_url":"https://codeload.github.com/concretesolutions/yosef-ios/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248155738,"owners_count":21056697,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-11-24T05:07:14.541Z","updated_at":"2025-04-10T04:23:36.291Z","avatar_url":"https://github.com/concretesolutions.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Yosef\n\n[![CI Status](http://img.shields.io/travis/guibayma/Yosef.svg?style=flat)](https://travis-ci.org/guibayma/Yosef)\n[![Version](https://img.shields.io/cocoapods/v/Yosef.svg?style=flat)](http://cocoapods.org/pods/Yosef)\n[![License](https://img.shields.io/cocoapods/l/Yosef.svg?style=flat)](http://cocoapods.org/pods/Yosef)\n[![Platform](https://img.shields.io/cocoapods/p/Yosef.svg?style=flat)](http://cocoapods.org/pods/Yosef)\n\nA lib tem como função criar views a partir de jsons, de modo que seja possível (1) alterar a interface do app no servidor e (2) acrescentar novas funcionalidades sem a necessidade de atualizar o app.\n\n\u003cimg src=\"images/lib_text_example.png\"\u003e\n\n## DynamicView\n\nA lib tem uma class central `DynamicView`, cujo método `createView()`, que recebe um `DynamicComponent` e um `DynamicActionDelegate`, é um ponto central para qualquer user externo.\n\nO `DynamicComponent` é a representação do JSON com as informações necessárias para a criação da View (o `type`, as `properties` e as `children`).\n\n## DynamicComponent\n\nO `DynamicComponent` é o objeto que encapsula as informações sobre as views que serão criadas pela lib. Ele contém três principais informações: \n\n- `type`: uma `String` informando se é um \"botão\", \"texto\", etc.\n- `properties`: um `Array\u003cDynamicProperty\u003e` que contém informações como \"textColor\", \"textSize\", \"action\", etc.\n- `children`: um `Array\u003cDynamicComponent\u003e?` que contém componentes que devem ser exibidos, dentro do componente a ser criado.\n\nO `DynamicComponent` possui um factory method `parse(dictionary: [String: Any])` que deve ser usado para criar uma instância de um dicionário do json retornado pelo servidor.\n\n## Exemplo\n\nDiagamos que temos um View Controller cuja View deve ser populada com as informações retornadas pelo servidor, representadas como um dicionário `[String: Any]`. O código ficaria assim:\n\n```swift\nfunc updateUI() {\n    // 1\n    let comp = ITDynamicComponent.parse(dictionary: info)\n    // 2\n    let view = ITDynamicView.createView(dynamicsComponent: comp, actionDelegate: self)\n    // 3\n    self.view.addSubview(view)\n    view.translatesAutoresizingMaskIntoConstraints = false\n    view.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 20).isActive = true\n    view.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 20).isActive = true\n    view.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -20).isActive = true\n}\n```\nUma explicação do código:\n\n1. É criado um `DynamicComponent` usando o `parse` factory method.\n2. A partir do componente criado, é criado a view usando o método `createView`.\n3. A view criada é adicionada como subview e é utilizado autolayout para fixá-la nas âncoras do topo, esquerda e direita da View Controller.\n\n## Instalação\n\nO `Yosef` está disponível via [CocoaPods](http://cocoapods.org).\nPara instalar é necessário adicionar as linhas abaixo no seu ```Podfile``` e rodar o `pod install`:\n\n```ruby\npod \"Yosef\"\n```\n## Requisitos para desenvolvimento\n\nPara ter o ambiente de desenvolvimento adequado utilize o [Bundler](http://bundler.io/) para instalar o ```Gemfile``` do projeto\n\nO projeto pode ser acessado na pasta `Example`, abrindo o workspace `Yosef.workspace`.\n\n## Dependências\n\n - [lottie-ios](https://github.com/airbnb/lottie-ios)\n - [Kingfisher](https://github.com/onevcat/Kingfisher)\n\n## Testes\n\n### Testes unitários\n\nPara os testes unitários, usamos `XCTestCase`. No caso de testes das views retornadas pela lib, usamos também a [iOSSnapshotTestCase](https://github.com/facebookarchive/ios-snapshot-test-case).\n\n### Cobertura\n\nA cobertura de testes pode ser obtida rodando o script `test.sh`:\n\n```ruby\n$ sh test.sh\n```\nOs resultados podem ser acessados abrindo a página `index.html` na pasta `coverage_report`\n\n## Equipe iOS\n\nGuilherme Bayma, guilherme.bayma@concrete.com.br  \nEmannuel Carvalho, emannuel.carvalho@concrete.com.br\n\n## License\n\nYosef is available under the MIT license. See the LICENSE file for more info.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconcretesolutions%2Fyosef-ios","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fconcretesolutions%2Fyosef-ios","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconcretesolutions%2Fyosef-ios/lists"}