rails_architect_analyzer 0.1.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.
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,534 @@
1
+ <!-- markdownlint-disable MD033 -->
2
+ <a href="https://github.com/danielmatos-pro/rails_architect">
3
+ <img alt="Rails Architect" src="https://img.shields.io/badge/Rails-Architect-blue?style=for-the-badge&logo=rails" />
4
+ </a>
5
+ <a href="https://github.com/danielmatos-pro/rails_architect/blob/main/LICENSE.md">
6
+ <img alt="License" src="https://img.shields.io/badge/license-MIT-green?style=for-the-badge" />
7
+ </a>
8
+ <a href="https://rubygems.org/gems/rails_architect">
9
+ <img alt="Gem Version" src="https://img.shields.io/gem/v/rails_architect?style=for-the-badge" />
10
+ </a>
11
+
12
+ ---
13
+
14
+ # Rails Architect
15
+
16
+ 🏗️ Uma gem Ruby para análise completa de projetos Rails com foco em **arquitetura**, **TDD**, **BDD** e **princípios SOLID**.
17
+
18
+ A Rails Architect analisa automaticamente a estrutura do seu projeto Rails e fornece sugestões detalhadas para melhorias em qualidade de código, cobertura de testes e aderência aos princípios SOLID.
19
+
20
+ ## 📋 Tabela de Conteúdos
21
+
22
+ - [Características](#características)
23
+ - [Instalação](#instalação)
24
+ - [Uso](#uso)
25
+ - [O que é Analisado](#o-que-é-analisado)
26
+ - [Exemplos](#exemplos)
27
+ - [Padrões Recomendados](#padrões-recomendados)
28
+ - [Contribuindo](#contribuindo)
29
+ - [Licença](#licença)
30
+
31
+ ## ✨ Características
32
+
33
+ - **📐 Análise de Arquitetura**: Verifica a estrutura padrão do Rails e recomenda padrões opcionais
34
+ - **🧪 Análise TDD**: Avalia cobertura de testes e sugere melhorias
35
+ - **🎯 Análise BDD**: Identifica funcionalidades BDD com Cucumber e RSpec
36
+ - **⚡ Análise SOLID**: Avalia cada princípio SOLID do seu código
37
+ - **💡 Sugestões Inteligentes**: Recomendações específicas e acionáveis para seu projeto
38
+ - **📊 Relatórios Detalhados**: Saída colorida em terminal e exportação em JSON
39
+ - **🔍 Detecção de Problemas**: Identifica "fat models", "fat controllers" e violações de SOLID
40
+ - **⚙️ CLI Completa**: Ferramenta de linha de comando intuitiva e poderosa
41
+
42
+ ## 🚀 Instalação
43
+
44
+ ### 1. Via Gemfile
45
+
46
+ Adicione à seu `Gemfile`:
47
+
48
+ ```ruby
49
+ gem 'rails_architect'
50
+ ```
51
+
52
+ Execute:
53
+
54
+ ```bash
55
+ bundle install
56
+ ```
57
+
58
+ ### 2. Via Gem Manual
59
+
60
+ ```bash
61
+ gem install rails_architect
62
+ ```
63
+
64
+ ## 📖 Uso
65
+
66
+ ### Linha de Comando
67
+
68
+ #### Analisar projeto atual
69
+
70
+ ```bash
71
+ rails_architect analyze
72
+ ```
73
+
74
+ #### Analisar um projeto específico
75
+
76
+ ```bash
77
+ rails_architect analyze /caminho/para/seu/projeto
78
+ ```
79
+
80
+ #### Obter sugestões de arquitetura
81
+
82
+ ```bash
83
+ rails_architect suggest
84
+ ```
85
+
86
+ #### Salvar relatório em JSON
87
+
88
+ ```bash
89
+ rails_architect analyze --json --output report.json
90
+ ```
91
+
92
+ #### Salvar relatório em arquivo de texto
93
+
94
+ ```bash
95
+ rails_architect analyze --output report.txt
96
+ ```
97
+
98
+ ### Dentro do Código Rails
99
+
100
+ ```ruby
101
+ # Analisar projeto atual
102
+ results = RailsArchitect.analyze
103
+
104
+ # Analisar projeto específico
105
+ results = RailsArchitect.analyze('/caminho/para/seu/projeto')
106
+
107
+ # Acessar resultados específicos
108
+ puts results[:architecture][:score] # Score de arquitetura (0-100)
109
+ puts results[:tdd][:score][:score] # Score de cobertura TDD
110
+ puts results[:bdd][:score][:rating] # Rating de BDD
111
+ puts results[:solid][:score][:score] # Score SOLID (0-100)
112
+ ```
113
+
114
+ ## 📊 O que é Analisado?
115
+
116
+ ### 📐 Análise de Arquitetura Rails
117
+
118
+ Verifica e recomenda:
119
+
120
+ - ✅ Estrutura padrão de diretórios (models, controllers, views, etc.)
121
+ - ✅ Padrões opcionais:
122
+ - Services (app/services)
123
+ - Decorators (app/decorators)
124
+ - Policies (app/policies)
125
+ - Presenters (app/presenters)
126
+ - Interactors (app/interactors)
127
+ - Concerns (app/concerns)
128
+ - Validators (app/validators)
129
+ - ⚠️ Detecção de "fat models" (modelos muito grandes)
130
+ - ⚠️ Detecção de "fat controllers" (controladores muito grandes)
131
+ - ⚠️ Qualidade de organização de helpers
132
+
133
+ ### 🧪 Análise de TDD (Test-Driven Development)
134
+
135
+ Avalia:
136
+
137
+ - Cobertura de testes (modelo de estimativa)
138
+ - Número de testes por tipo:
139
+ - Testes de modelos
140
+ - Testes de controladores
141
+ - Testes de serviços
142
+ - Testes de helpers
143
+ - Testes de requisição
144
+ - Uso de RSpec vs Minitest
145
+ - Sugestões para melhorar cobertura
146
+ - Score de cobertura: 0-100%
147
+
148
+ ### 🎯 Análise de BDD (Behavior-Driven Development)
149
+
150
+ Verifica:
151
+
152
+ - Presença de Cucumber
153
+ - Número de feature files e step definitions
154
+ - Análise de cenários legíveis (Given/When/Then)
155
+ - User stories estruturadas
156
+ - Testes de integração (request specs)
157
+ - Reusabilidade de steps
158
+
159
+ ### ⚡ Análise de Princípios SOLID
160
+
161
+ Avalia cada um dos 5 princípios:
162
+
163
+ 1. **S**ingle Responsibility Principle (SRP)
164
+ - Detecta classes com múltiplas responsabilidades
165
+ - Sugere extração de lógica em services
166
+
167
+ 2. **O**pen/Closed Principle (OCP)
168
+ - Verifica uso de concerns e herança
169
+ - Incentiva extensibilidade sem modificação
170
+
171
+ 3. **L**iskov Substitution Principle (LSP)
172
+ - Analisa cadeias de herança
173
+ - Detecta profundidade de herança excessiva
174
+
175
+ 4. **I**nterface Segregation Principle (ISP)
176
+ - Detecta módulos e classes muito grandes
177
+ - Sugera segregação de interfaces
178
+
179
+ 5. **D**ependency Inversion Principle (DIP)
180
+ - Avalia uso de service layer
181
+ - Recomenda injeção de dependência
182
+
183
+ **Score SOLID**: 0-100 pontos (20 pontos por princípio)
184
+
185
+ ## 📈 Exemplo de Saída
186
+
187
+ ```
188
+ ================================================================================
189
+ 🏗️ RAILS ARCHITECT - PROJECT ANALYSIS REPORT
190
+ ================================================================================
191
+
192
+ 📐 ARCHITECTURE ANALYSIS
193
+ ────────────────────────────────────────────────────────────────────────────────
194
+ Overall Score: 65%
195
+
196
+ ✓ Existing Directories (9/10):
197
+ ✅ app/models (8 files)
198
+ ✅ app/controllers (12 files)
199
+ ✅ app/views (45 files)
200
+ ✅ app/helpers (5 files)
201
+ ✅ app/services (3 files)
202
+ ✅ config (25 files)
203
+ ✅ lib (8 files)
204
+ ✅ spec (45 files)
205
+ ❌ app/decorators
206
+
207
+ ⚠️ Missing Important Directories:
208
+ • app/decorators
209
+ • app/policies
210
+
211
+ 📦 Optional Patterns Available:
212
+ ✅ Implemented - Service Objects (app/services)
213
+ ❌ Not used - Decorator Pattern (app/decorators)
214
+ ❌ Not used - Authorization Policies (app/policies)
215
+
216
+ 💡 Suggestions:
217
+ • Consider creating 'app/decorators' directory for separating presentation logic
218
+ • Implement 'app/policies' directory for authorization logic
219
+
220
+ 🧪 TEST-DRIVEN DEVELOPMENT (TDD) ANALYSIS
221
+ ────────────────────────────────────────────────────────────────────────────────
222
+ Coverage Score: 65.5% ✅ Good
223
+
224
+ Test Files:
225
+ • Spec files: 48
226
+ • Test files: 0
227
+ • Total: 48
228
+
229
+ 🎯 BEHAVIOR-DRIVEN DEVELOPMENT (BDD) ANALYSIS
230
+ ────────────────────────────────────────────────────────────────────────────────
231
+ BDD Score: ✅ Some BDD coverage
232
+
233
+ Frameworks:
234
+ • Cucumber: ❌ Not installed
235
+ • RSpec: ✅ Installed
236
+
237
+ ⚡ SOLID PRINCIPLES ANALYSIS
238
+ ────────────────────────────────────────────────────────────────────────────────
239
+ SOLID Score: 72/100 ✅ Good
240
+
241
+ Principle Analysis:
242
+
243
+ 1. Single Responsibility Principle (SRP)
244
+ Status: ✅ Good
245
+
246
+ 2. Open/Closed Principle (OCP)
247
+ Status: ✅ Some patterns found
248
+
249
+ 3. Liskov Substitution Principle (LSP)
250
+ Status: ✅ Good
251
+
252
+ ...
253
+
254
+ 📊 OVERALL SUMMARY
255
+ ================================================================================
256
+ Architecture: 65%
257
+ TDD Coverage: 65.50% ✅ Good
258
+ BDD Practices: ✅ Some BDD coverage
259
+ SOLID Score: 72/100 ✅ Good
260
+
261
+ 🚀 RECOMMENDATIONS FOR IMPROVEMENT
262
+ ================================================================================
263
+
264
+ 1. Consider creating 'app/decorators' directory
265
+ 2. ⚠️ Detected fat models. Consider extracting logic to services
266
+ 3. Add model specs/tests to ensure data validation logic
267
+ 4. Consider using Cucumber for BDD with human-readable scenarios
268
+ ...
269
+ ```
270
+
271
+ ## 💡 Padrões Recomendados
272
+
273
+ ### 1. Services (app/services)
274
+
275
+ Encapsule lógica de negócio complexa:
276
+
277
+ ```ruby
278
+ # app/services/user_creator.rb
279
+ class UserCreator
280
+ def initialize(user_params)
281
+ @user_params = user_params
282
+ end
283
+
284
+ def call
285
+ User.create!(@user_params)
286
+ end
287
+ end
288
+
289
+ # Uso
290
+ UserCreator.new(params).call
291
+ ```
292
+
293
+ ### 2. Decorators (app/decorators)
294
+
295
+ Separe lógica de apresentação dos modelos:
296
+
297
+ ```ruby
298
+ # app/decorators/user_decorator.rb
299
+ class UserDecorator
300
+ def initialize(user)
301
+ @user = user
302
+ end
303
+
304
+ def full_name_with_email
305
+ "#{@user.full_name} <#{@user.email}>"
306
+ end
307
+
308
+ def formatted_created_at
309
+ @user.created_at.strftime('%d/%m/%Y')
310
+ end
311
+ end
312
+
313
+ # Uso em views
314
+ <%= UserDecorator.new(@user).full_name_with_email %>
315
+ ```
316
+
317
+ ### 3. Concerns (app/concerns)
318
+
319
+ Compartilhe comportamentos entre modelos:
320
+
321
+ ```ruby
322
+ # app/concerns/timestampable.rb
323
+ module Timestampable
324
+ extend ActiveSupport::Concern
325
+
326
+ included do
327
+ before_save :update_timestamps
328
+ end
329
+
330
+ def update_timestamps
331
+ self.updated_at = Time.current
332
+ end
333
+ end
334
+
335
+ # Uso
336
+ class Post < ApplicationRecord
337
+ include Timestampable
338
+ end
339
+ ```
340
+
341
+ ### 4. Policies (app/policies)
342
+
343
+ Use Pundit para autorização:
344
+
345
+ ```ruby
346
+ # app/policies/post_policy.rb
347
+ class PostPolicy
348
+ attr_reader :user, :post
349
+
350
+ def initialize(user, post)
351
+ @user = user
352
+ @post = post
353
+ end
354
+
355
+ def update?
356
+ @user == @post.author
357
+ end
358
+
359
+ def destroy?
360
+ @user == @post.author || @user.admin?
361
+ end
362
+ end
363
+
364
+ # Uso no controller
365
+ authorize @post, :update?
366
+ ```
367
+
368
+ ### 5. Presenters (app/presenters)
369
+
370
+ Prepare dados para a camada de apresentação:
371
+
372
+ ```ruby
373
+ # app/presenters/dashboard_presenter.rb
374
+ class DashboardPresenter
375
+ def initialize(user)
376
+ @user = user
377
+ end
378
+
379
+ def total_posts
380
+ @user.posts.count
381
+ end
382
+
383
+ def recent_posts
384
+ @user.posts.recent.limit(5)
385
+ end
386
+
387
+ def stats
388
+ {
389
+ posts: total_posts,
390
+ comments: @user.comments.count
391
+ }
392
+ end
393
+ end
394
+
395
+ # Uso no controller
396
+ @dashboard = DashboardPresenter.new(current_user)
397
+ ```
398
+
399
+ ## 🧪 Testes
400
+
401
+ Execute os testes da gem:
402
+
403
+ ```bash
404
+ cd rails_architect
405
+ bundle install
406
+ rake spec
407
+ ```
408
+
409
+ ## 🔄 Desenvolvimento
410
+
411
+ ### Setup
412
+
413
+ ```bash
414
+ git clone https://github.com/daniel8486/rails_architect.git
415
+ cd rails_architect
416
+ bundle install
417
+ ```
418
+
419
+ ### Testes
420
+
421
+ ```bash
422
+ rake spec
423
+ ```
424
+
425
+ ### Console IRB
426
+
427
+ ```bash
428
+ rake console
429
+ ```
430
+
431
+ ## 🤝 Contribuindo
432
+
433
+ Contribuições são muito bem-vindas! Para manter a qualidade:
434
+
435
+ 1. Faça um fork do projeto
436
+ 2. Crie uma branch para sua feature (`git checkout -b feature/AmazingFeature`)
437
+ 3. Commit suas mudanças (`git commit -m 'Add some AmazingFeature'`)
438
+ 4. Push para a branch (`git push origin feature/AmazingFeature`)
439
+ 5. Abra um Pull Request
440
+ 6. Certifique-se de que os testes passam
441
+
442
+ ### Diretrizes
443
+
444
+ - Mantenha o código limpo e bem documentado
445
+ - Escreva testes para novas funcionalidades
446
+ - Siga o estilo de código do projeto
447
+ - Atualize a documentação conforme necessário
448
+
449
+ ## 📋 Roadmap
450
+
451
+ - [ ] Análise de performance
452
+ - [ ] Detecção de code smells
453
+ - [ ] Sugestões de gems para padrões
454
+ - [ ] Integração com CI/CD (GitHub Actions, GitLab CI)
455
+ - [ ] Dashboard web interativo
456
+ - [ ] Comparação entre versões do projeto
457
+ - [ ] Análise histórica de métricas
458
+ - [ ] Exportação em múltiplos formatos (PDF, HTML)
459
+ - [ ] Suporte a gems de qualidade (Rubocop, Brakeman)
460
+
461
+ ## 📝 Changelog
462
+
463
+ ### v0.1.0 (2025-12-08)
464
+
465
+ **Features:**
466
+ - ✨ Análise inicial de arquitetura Rails
467
+ - ✨ Análise de TDD com estimativa de cobertura
468
+ - ✨ Análise de BDD com Cucumber e RSpec
469
+ - ✨ Análise de princípios SOLID
470
+ - ✨ CLI completa com múltiplas opções de saída
471
+ - ✨ Relatórios detalhados e coloridos em terminal
472
+ - ✨ Exportação em JSON
473
+
474
+ **Bugfixes:**
475
+ - 🐛 Correções iniciais
476
+
477
+ ## 📄 Licença
478
+
479
+ MIT License - veja [LICENSE.md](LICENSE.md) para detalhes completos
480
+
481
+ ```
482
+ Copyright (c) 2025 Daniel Matos
483
+
484
+ Permission is hereby granted, free of charge, to any person obtaining a copy
485
+ of this software and associated documentation files (the "Software"), to deal
486
+ in the Software without restriction, including without limitation the rights
487
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
488
+ copies of the Software.
489
+ ```
490
+
491
+ ## 🙋 Suporte
492
+
493
+ ### Issues
494
+
495
+ Para reportar bugs ou sugerir features, abra uma issue no [GitHub Issues](https://github.com/daniel8486/rails_architect/issues).
496
+
497
+ ### Discussões
498
+
499
+ Tenha dúvidas? Inicie uma discussão no [GitHub Discussions](https://github.com/daniel8486/rails_architect/discussions).
500
+
501
+ ## 👨‍💻 Autor
502
+
503
+ **Daniel Matos**
504
+ - GitHub: [@daniel8486](https://github.com/daniel8486)
505
+ - Email: eu@danieldjam.dev.br | danielmatos404@gmail.com
506
+
507
+ ## 🙏 Agradecimentos
508
+
509
+ - Comunidade Rails por melhores práticas
510
+ - Inspiração em ferramentas de análise como RuboCop, Brakeman e Flay
511
+ - Todos os contribuidores que ajudam a melhorar a gem
512
+
513
+ ## 📚 Referências e Leitura Recomendada
514
+
515
+ - [Rails Guides - Active Record](https://guides.rubyonrails.org/active_record_basics.html)
516
+ - [SOLID Principles](https://en.wikipedia.org/wiki/SOLID)
517
+ - [RSpec Best Practices](https://rspec.info/)
518
+ - [Cucumber.io Documentation](https://cucumber.io/docs/gherkin/)
519
+ - [Clean Code by Robert C. Martin](https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882)
520
+ - [Refactoring: Improving the Design of Existing Code](https://refactoring.com/)
521
+
522
+ ---
523
+
524
+ <p align="center">
525
+ <strong>Feito com ❤️ para a comunidade Rails</strong>
526
+ </p>
527
+
528
+ <p align="center">
529
+ <a href="https://github.com/daniel8486/rails_architect">⭐ Star no GitHub</a>
530
+
531
+ <a href="https://github.com/daniel8486/rails_architect/issues">🐛 Reportar Bug</a>
532
+
533
+ <a href="https://github.com/daniel8486/rails_architect/issues">💡 Sugerir Feature</a>
534
+ </p>
data/EXAMPLE_GEMFILE ADDED
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # This is an example Gemfile for a Rails project that uses rails_architect
4
+ # Install rails_architect to analyze your project
5
+
6
+ gem 'rails', '~> 7.0'
7
+ gem 'rails_architect', path: '../rails_architect' # or gem 'rails_architect' from rubygems
8
+
9
+ group :development do
10
+ gem 'rails_architect'
11
+ end
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
6
+
7
+ gemspec
8
+
9
+ gem "pry", "~> 0.14.0"
10
+ gem "rake", "~> 13.0"
11
+ gem "rspec", "~> 3.0"
12
+ gem "rubocop", "~> 1.0"