Skip to content

Commit d44d90c

Browse files
committed
Docs, multi-TFM, and codegen: .NET 9/10, docs PT-BR, samples
Documentation, multi-targeting, and codegen improvements - Documentation and Language Consistency -- Updated README.md and docs.md to correct Portuguese, removing mojibake/encoding issues. -- Improved formatting, expanded quickstart, and added more minimal and advanced attribute usage examples. -- Clarified and expanded documentation for features, usage, and limitations. -- Added XML docs for attributes (AutoDetailsAttribute, AutoPropertiesAttribute, etc.) in RoyalCode.SmartSelector.xml. -- Added copilot-instructions.md with project and code style guidelines. - Multi-Targeting and Dependency Management -- Added .NET 9 and .NET 10 support to the runtime library. -- Set test projects to use .NET 10. -- Updated package versions (Mapster, AutoMapper, BenchmarkDotNet, EF Core). -- Centralized and clarified dependency versioning (AspVer, ExtSrcGenVer, etc.) in build files. - Code Generation and Formatting -- Fixed code formatting in SelectLambdaGenerator.cs (replaced .Ident with .Indent for clarity). -- Improved generated code readability and consistency. - Solution and Packaging -- Ensured README is included and referenced in solution and packaging files. - General Usability -- Improved clarity and usability for new users and maintainers, especially regarding supported frameworks, attribute usage, and generated code expectations.
1 parent 5c61f0b commit d44d90c

13 files changed

Lines changed: 516 additions & 121 deletions

File tree

README.md

Lines changed: 141 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,73 @@
11
# SmartSelector
22

3-
Gerador/Source Generator para criar automaticamente projeções (`Expression<Func<TFrom, TDto>>`), métodos auxiliares e propriedades em DTOs, reduzindo drasticamente boilerplate em consultas LINQ / EF Core.
3+
Gerador/Source Generator para criar automaticamente projeções (`Expression<Func<TFrom, TDto>>`), métodos auxiliares e propriedades em DTOs, reduzindo drasticamente boilerplate em consultas LINQ / EF Core.
44

55
## Principais Recursos
6-
- `[AutoSelect<TFrom>]`: gera expressão de seleção, método `From`, extensões `Select{Dto}` / `To{Dto}`.
7-
- `[AutoProperties]` ou `[AutoProperties<TFrom>]`: gera propriedades simples automaticamente (primitivos, string, bool, DateTime, enum, struct, coleções simples `IEnumerable<T>` desses tipos).
8-
- Flattening por convenção: nomes concatenados em PascalCase resolvem cadeias aninhadas (ex.: `CustomerAddressCountryRegionName` ? `a.Customer.Address.Country.Region.Name`).
9-
- Exclusão de propriedades: `Exclude = [ nameof(Entity.Prop) ]`.
10-
- Diagnósticos de compilação para uso incorreto, tipos incompatíveis e conflitos.
6+
- `[AutoSelect<TFrom>]`: gera expressão de seleção, método `From`, extensões `Select{Dto}` / `To{Dto}`.
7+
- `[AutoProperties]` ou `[AutoProperties<TFrom>]`: gera propriedades simples automaticamente (primitivos, string, bool, DateTime, enum, struct, coleções simples `IEnumerable<T>` desses tipos).
8+
- Flattening por convenção: nomes concatenados em PascalCase resolvem cadeias aninhadas (ex.: `CustomerAddressCountryRegionName` ? `a.Customer.Address.Country.Region.Name`).
9+
- Exclusão de propriedades: `Exclude = [ nameof(Entity.Prop) ]`.
10+
- Diagnósticos de compilação para uso incorreto, tipos incompatíveis e conflitos.
1111

12-
## Instalação
12+
## Quickstart
13+
14+
1) Instalação
1315
```xml
1416
<ItemGroup>
1517
<PackageReference Include="RoyalCode.SmartSelector" Version="x.y.z" />
1618
<PackageReference Include="RoyalCode.SmartSelector.Generators" Version="x.y.z" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
1719
</ItemGroup>
1820
```
1921

20-
## Exemplo 1 – Projeção Simples
22+
2) Anote seu DTO
23+
```csharp
24+
[AutoSelect<User>, AutoProperties]
25+
public partial class UserDetails { }
26+
```
27+
28+
3) Consulte com EF Core
29+
```csharp
30+
var list = db.Users.SelectUserDetails().ToList();
31+
var dto = UserDetails.From(user);
32+
var expr = UserDetails.SelectUserExpression; // reutilizável / componível
33+
```
34+
35+
Escopo e foco
36+
- Sem custom resolvers, conditional mapping ou naming policies.
37+
- Foco: projeções traduzíveis por EF Core e mapeamento 1x1 (estilo Adapt do Mapster).
38+
39+
Links úteis
40+
- Documentação completa: `src/docs.md`
41+
- Projeto Demo: `RoyalCode.SmartSelector.Demo`
42+
- Benchmarks: `RoyalCode.SmartSelector.Benchmarks`
43+
44+
Frameworks e pacotes suportados
45+
- Runtime lib: `RoyalCode.SmartSelector` (TFMs: .NET 8, .NET 9, .NET 10)
46+
- Generator: `RoyalCode.SmartSelector.Generators` (TFM: .NET Standard 2.0, instalado como Analyzer)
47+
48+
## Exemplo 1 – Projeção Simples
49+
2150
```csharp
2251
[AutoSelect<User>, AutoProperties]
2352
public partial class UserDetails { }
2453

2554
// Uso
2655
var list = db.Users.SelectUserDetails().ToList();
2756
var dto = UserDetails.From(user);
28-
var expr = UserDetails.SelectUserExpression; // reutilizável / componível
57+
var expr = UserDetails.SelectUserExpression; // reutilizável / componível
2958
```
30-
Código gerado (essencial):
59+
Código gerado (essencial):
3160
```csharp
32-
public static Expression<Func<User, UserDetails>> SelectUserExpression => u => new UserDetails { Id = u.Id, Name = u.Name };
61+
public static Expression<Func<User, UserDetails>> SelectUserExpression => u => new UserDetails
62+
{
63+
Id = u.Id,
64+
Name = u.Name
65+
};
66+
3367
public static UserDetails From(User u) => (selectUserFunc ??= SelectUserExpression.Compile())(u);
3468
```
3569

36-
## Exemplo 2 – Objeto Aninhado + Exclusão
70+
## Exemplo 2 – Objeto Aninhado + Exclusão
3771
```csharp
3872
[AutoSelect<Book>, AutoProperties(Exclude = [ nameof(Book.Sku) ])]
3973
public partial class BookDetails
@@ -46,66 +80,132 @@ public partial class ShelfDetails { }
4680
```
4781
Trecho gerado:
4882
```csharp
49-
Shelf = new ShelfDetails { Id = a.Shelf.Id, Location = a.Shelf.Location },
50-
Price = a.Price,
51-
// Sku excluído
83+
new BookDetails
84+
{
85+
Shelf = new ShelfDetails
86+
{
87+
Id = a.Shelf.Id,
88+
Location = a.Shelf.Location
89+
},
90+
Price = a.Price,
91+
};
92+
// Sku excluído
5293
```
5394

54-
## Exemplo 3 – Flattening Profundo
95+
## Exemplo 3 – Flattening Profundo
5596
```csharp
56-
public class Order { public Customer Customer { get; set; } }
97+
public class Order
98+
{
99+
public Customer Customer { get; set; }
100+
}
101+
57102
// Customer -> Address -> Country -> Region
58103
[AutoSelect<Order>]
59104
public partial class OrderDetails
60105
{
61106
public string CustomerAddressCountryRegionName { get; set; }
62107
}
108+
63109
```
64-
Trecho da expressão:
110+
Trecho da expressão:
65111
```csharp
66112
CustomerAddressCountryRegionName = a.Customer.Address.Country.Region.Name
67113
```
68114

115+
## Exemplos mínimos por atributo
116+
117+
- `AutoSelect<T>`:
118+
119+
```csharp
120+
[AutoSelect<Product>]
121+
public partial class ProductDetails { }
122+
123+
// Uso:
124+
db.Products.SelectProductDetails().ToList();
125+
```
126+
127+
- `AutoProperties`:
128+
129+
```csharp
130+
[AutoSelect<Simple>, AutoProperties]
131+
public partial class SimpleDto { /* propriedades simples geradas automaticamente */ }
132+
```
133+
134+
Para usar `AutoProperties`, o tipo de origem é inferido do `AutoSelect<TFrom>`.
135+
136+
- `AutoProperties<TFrom>`:
137+
138+
```csharp
139+
[AutoProperties<User>]
140+
public partial class UserSnapshot { }
141+
```
142+
143+
- DTO aninhado + `Exclude`:
144+
145+
```csharp
146+
[AutoSelect<Order>, AutoProperties<Order>(Exclude = [ nameof(Order.InternalCode) ])]
147+
public partial class OrderDetails
148+
{
149+
public CustomerDetails Customer { get; set; }
150+
}
151+
152+
[AutoProperties<Customer>]
153+
public partial class CustomerDetails { }
154+
```
155+
156+
- Flattening por nome:
157+
```csharp
158+
[AutoSelect<Order>]
159+
public partial class OrderFlat
160+
{
161+
public string CustomerAddressCity { get; set; }
162+
}
163+
164+
// Gera: CustomerAddressCity = a.Customer.Address.City
165+
```
166+
69167
## Regras de Flattening
70-
- Nome da propriedade = concatenação PascalCase dos segmentos do caminho.
168+
- Nome da propriedade = concatenação PascalCase dos segmentos do caminho.
71169
- Sem necessidade de atributos extras.
72170

73171
## Tipos Suportados em AutoProperties
74-
- Primitivos numéricos, `bool`, `string`, `char`, `DateTime` / nullable simples
172+
- Primitivos numéricos, `bool`, `string`, `char`, `DateTime` / nullable simples
75173
- `enum`, `struct`
76-
- `IEnumerable<T>` onde `T` é suportado acima / enum / struct
174+
- `IEnumerable<T>` onde `T` é suportado acima / enum / struct
77175

78-
## Exclusões
176+
## Exclusões
79177
```csharp
80178
[AutoProperties<Product>(Exclude = [ nameof(Product.InternalCode), nameof(Product.Secret) ])]
81179
```
82180

83-
## Diagnósticos Principais
84-
- Tipos inválidos ou classe não `partial` (`RCSS000`).
85-
- Propriedade não encontrada (`RCSS001`).
86-
- Tipos incompatíveis (`RCSS002`).
87-
- Uso incorreto de atributos (`RCSS003`–`RCSS005`).
181+
## Diagnósticos Principais
182+
- Tipos inválidos ou classe não `partial` (`RCSS000`).
183+
- Propriedade não encontrada (`RCSS001`).
184+
- Tipos incompatíveis (`RCSS002`).
185+
- Uso incorreto de atributos (`RCSS003``RCSS005`).
88186

89-
## Limitações Resumidas
90-
- Sem renome/alias explícito ainda (`MapFrom`).
91-
- Sem transformações de tipo (formatters / custom converters).
92-
- Desambiguação de flattening limitada em colisões de prefixo.
187+
## Limitações Resumidas
188+
- Sem renome/alias explícito ainda (`MapFrom`).
189+
- Sem transformações de tipo (formatters / custom converters).
190+
- Desambiguação de flattening limitada em colisões de prefixo.
93191

94-
## Boas Práticas
192+
## Boas Práticas
95193
- Use `nameof` em `Exclude`.
96-
- Prefira consumir a expressão gerada para reutilização e composição LINQ.
194+
- Prefira consumir a expressão gerada para reutilização e composição LINQ.
97195
- Para caminhos muito longos, avalie DTOs aninhados por clareza.
98196

99-
## FAQ Rápido
197+
## FAQ Rápido
100198
| Pergunta | Resposta |
101199
|----------|----------|
102-
| Preciso configurar algo no runtime? | Não, pura geração de código. |
103-
| Funciona com EF Core? | Sim, a expressão é traduzível. |
104-
| Posso só gerar propriedades? | Sim: `[AutoProperties<TFrom>]`. |
105-
| Flattening precisa de atributo? | Não, é por nome. |
106-
107-
## Mais Informações
108-
Documentação detalhada: ver `docs.md` no repositório.
200+
| Preciso configurar algo no runtime? | Não, pura geração de código. |
201+
| Funciona com EF Core? | Sim, a expressão é traduzível. |
202+
| Posso só gerar propriedades? | Sim: `[AutoProperties<TFrom>]`. |
203+
| Flattening precisa de atributo? | Não, é por nome. |
204+
205+
## Mais Informações
206+
- Documentação detalhada: ver `docs.md` no repositório.
207+
- Projeto Demo: ver `RoyalCode.SmartSelector.Demo`.
208+
- Benchmarks: ver `RoyalCode.SmartSelector.Benchmarks`.
109209

110210
---
111211
Happy coding!
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Copilot Instructions
2+
3+
## General Guidelines
4+
- First general instruction
5+
- Second general instruction
6+
7+
## Code Style
8+
- Use specific formatting rules
9+
- Follow naming conventions
10+
11+
## Project-Specific Rules
12+
- Projeto SmartSelector: foco em gerar modelos de leitura e expressões EF Core (Select) via atributos; sem planos para custom resolvers, conditional mapping ou naming policies.
13+
- Customizações são raras; mapeamento 1x1 estilo Mapster Adapt.
14+
- Versões centralizadas em Directory.Build.props/libs.targets/tests.targets.
15+
- Documentação principal no README.md.

src/Directory.Build.props

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
<Project>
22
<PropertyGroup>
3-
<LibFrwkVer>net8.0</LibFrwkVer>
4-
<TestFrwkVer>net8.0</TestFrwkVer>
3+
<LibFrwkVer>net8.0;net9.0;net10.0</LibFrwkVer>
4+
<TestFrwkVer>net10.0</TestFrwkVer>
55
<GenFrwkVer>netstandard2.0</GenFrwkVer>
66
</PropertyGroup>
77
<PropertyGroup>
8-
<DotNetCoreVersion>8.0.20</DotNetCoreVersion>
9-
<ExtSrcGenVer>0.1.10</ExtSrcGenVer>
8+
<ExtSrcGenVer>0.1.12</ExtSrcGenVer>
109
</PropertyGroup>
1110
<PropertyGroup>
12-
<Ver>0.3.0</Ver>
11+
<Ver>0.4.0</Ver>
1312
<Prev></Prev>
1413
</PropertyGroup>
1514
</Project>

0 commit comments

Comments
 (0)