arqo 0.1.0 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 1887e4c98d7848ac3d743b338ea8aeaf26f3d643
4
- data.tar.gz: 22d1f86473d4adc3437aedc2401fc64eb040fd70
2
+ SHA256:
3
+ metadata.gz: fe852ef6a59c623ab71a8ca9ecd5320d3252dece6df5a7421df998f1f096e87c
4
+ data.tar.gz: 9652f930a2ef38f274c590727cce67284478ddc3db0849b0892c4602bc11d8ea
5
5
  SHA512:
6
- metadata.gz: 2c0b3222b5b3023d9eb4d16a6bf9d244414523e19dc2e4295e0f1ff963fc08bde610fd55656a8e1881ca63a7e891f48578580f192945cd99b27b92cf5f36af10
7
- data.tar.gz: 9214d81840071fd81d134b89006fa4ff99bc50702b0ae9a81137cf089afa3db208553d2f8a88f4ecb451819a60c4677218bc00316d25f87c55897142476c89a3
6
+ metadata.gz: 321f73a94a640bdf532818263ad32530e69b79d33f86a941b1e1bb7ed0df06c0e5dd14dd25d6ec1477f8f70121773fecb1e3eb8814e9ad322040007b63bdeb0b
7
+ data.tar.gz: 32ca904418850549f24bf975e0fe8ac59d122ffebc7e3fca4b420cede4d3dd0e31f13602742e3509798d1d5049d90c66ca892a66d72d248813f79c73d6d499de
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2020 Santiago Bartesaghi
3
+ Copyright (c) 2020 Rootstrap
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -15,6 +15,7 @@ ARQO (Active Record Query Objects) is a minimal gem that let you use Query Objec
15
15
  - [Setting up a query object](#setting-up-a-query-object)
16
16
  - [Deriving the model](#deriving-the-model)
17
17
  - [Chaining scopes](#chaining-scopes)
18
+ - [Generators](#generators)
18
19
  - [Development](#development)
19
20
  - [Contributing](#contributing)
20
21
  - [License](#license)
@@ -96,6 +97,22 @@ you can use it like this:
96
97
  CustomNamedQuery.new(User.all).active_last_week
97
98
  ```
98
99
 
100
+ you can also set the model class or relation to query from by overriding a simple method, like:
101
+
102
+ ```ruby
103
+ class CustomNamedQuery < ARQO::Query
104
+ module Scope
105
+ # ...
106
+ end
107
+
108
+ private
109
+
110
+ def associated_relation
111
+ User # you can also do something like User.some_scope
112
+ end
113
+ end
114
+ ```
115
+
99
116
  ## Chaining scopes
100
117
  Of course you can chain everything together, methods defined in the query object and scopes defined in the model or by Rails.
101
118
  ```ruby
@@ -119,6 +136,49 @@ And then you chain everything together and it will just work :)
119
136
  UserQuery.new.where.not(name: nil).active_last_week.not_deleted.order(:id)
120
137
  ```
121
138
 
139
+ ## Generators
140
+
141
+ To create the query object we can use the rails generator tool. For that, we just run:
142
+
143
+ $ rails generate query User
144
+
145
+ And it will create your UserQuery object at `app/queries` folder. If you have set Rspec as your test framework, the corresponding spec file will be also created at `spec/queries`.
146
+
147
+ :warning: Rspec is the only test framework supported for now.
148
+
149
+ If your query object is based on another class, you can set the `associated_relation` attribute to automatically override the `associated_relation` method.
150
+
151
+ $ rails generate query CustomUser --associated_relation=User
152
+
153
+ ### Model Generator
154
+
155
+ To generate the query object when you create your rails models, enable the query generators at your application config file adding the following line:
156
+
157
+ ```ruby
158
+ # config/application.rb
159
+
160
+ module App
161
+ class Application < Rails::Application
162
+ ...
163
+
164
+ config.generators do |g|
165
+ ...
166
+ g.query true # Added line
167
+ end
168
+ end
169
+ end
170
+ ```
171
+
172
+ Now, if you run the model generator:
173
+
174
+ $ rails generate model User
175
+
176
+ The query object and spec will be created as well as the model, migrations, test files, etc.
177
+
178
+ Another alternative, it is to add the `--query` option at the end of the command:
179
+
180
+ $ rails generate model User --query
181
+
122
182
  ## Development
123
183
 
124
184
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -127,7 +187,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
127
187
 
128
188
  ## Contributing
129
189
 
130
- Bug reports and pull requests are welcome on GitHub at https://github.com/santib/arqo. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/santib/arqo/blob/master/CODE_OF_CONDUCT.md).
190
+ Bug reports and pull requests are welcome on GitHub at https://github.com/rootstrap/arqo. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/rootstrap/arqo/blob/master/CODE_OF_CONDUCT.md).
131
191
 
132
192
 
133
193
  ## License
@@ -136,7 +196,7 @@ The gem is available as open source under the terms of the [MIT License](https:/
136
196
 
137
197
  ## Code of Conduct
138
198
 
139
- Everyone interacting in the ARQO project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/santib/arqo/blob/master/CODE_OF_CONDUCT.md).
199
+ Everyone interacting in the ARQO project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/rootstrap/arqo/blob/master/CODE_OF_CONDUCT.md).
140
200
 
141
201
  ## Logo attribution
142
202
  Logo made by [iconixar](https://www.flaticon.com/free-icon/archery_3080892) from [www.flaticon.com](https://www.flaticon.com/)
data/lib/arqo/query.rb CHANGED
@@ -4,20 +4,48 @@ module ARQO
4
4
  # Parent class for query objects
5
5
  class Query
6
6
  attr_reader :relation
7
+
7
8
  delegate_missing_to :relation
8
9
 
9
- def initialize(relation = derived_relation)
10
+ def initialize(relation = associated_relation)
10
11
  @relation = relation.extending(scope_module)
11
12
  end
12
13
 
13
14
  private
14
15
 
15
- def derived_relation_name
16
- self.class.name.sub(/Query$/, '')
17
- end
16
+ # Returns the model to which the query object is associated.
17
+ # By default it will infer the name from the query object's class
18
+ # assuming the name is the name of the model with "Query" as the suffix.
19
+ #
20
+ # As an example, UserQuery would be associated with the User model and
21
+ # Blog::PostQuery would be associated with the Blog::Post namespaced model.
22
+ #
23
+ # This method can be overridden to bypass this convention and associate
24
+ # the query object to another relation by returning it.
25
+ #
26
+ # ==== Example
27
+ # class PostQuery < ARQO::Query
28
+ # # ...
29
+ #
30
+ # private
31
+ #
32
+ # def associated_relation
33
+ # Blog::Post
34
+ # end
35
+ # end
36
+ #
37
+ # @return [Class, ActiveRecord::Relation]
38
+ def associated_relation
39
+ class_name = self.class.name
40
+ derived_relation_name = class_name.sub(/Query$/, '')
41
+
42
+ unless Object.const_defined?(derived_relation_name)
43
+ raise NameError, "Could not find model #{derived_relation_name} associated " \
44
+ "to query #{class_name}.\n Make sure the name is correct or override " \
45
+ '#associated_relation to provide a custom model'
46
+ end
18
47
 
19
- def derived_relation
20
- derived_relation_name.constantize.all if Object.const_defined?(derived_relation_name)
48
+ derived_relation_name.constantize.all
21
49
  end
22
50
 
23
51
  def scope_module
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/railtie'
4
+
5
+ module ARQO
6
+ class Railtie < Rails::Railtie
7
+ generators do |app|
8
+ Rails::Generators.configure! app.config.generators
9
+ require_relative '../generators/model_generator'
10
+ end
11
+ end
12
+ end
data/lib/arqo/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ARQO
4
- VERSION = '0.1.0'
4
+ VERSION = '0.3.0'
5
5
  end
data/lib/arqo.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'arqo/query'
4
4
  require 'arqo/version'
5
+ require 'arqo/railtie'
5
6
 
6
7
  module ARQO
7
8
  class Error < StandardError; end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators/named_base'
4
+
5
+ module ARQO
6
+ module Generators
7
+ class NamedBase < Rails::Generators::NamedBase
8
+ class_option :associated_relation, type: :string, default: nil
9
+
10
+ private
11
+
12
+ def associated_relation
13
+ @associated_relation ||= options['associated_relation']
14
+ end
15
+
16
+ def associated_relation_class
17
+ associated_relation&.to_s&.classify
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+ require 'rails/generators/rails/model/model_generator'
5
+ require_relative 'rails/query_generator'
6
+
7
+ module Rails
8
+ module Generators
9
+ class ModelGenerator
10
+ hook_for :query, type: :boolean, default: false
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,38 @@
1
+ Usage:
2
+ rails generate query NAME [--associated_relation=model]
3
+
4
+ Description:
5
+ Generates a new ARQO query object at app/queries. Pass the generator name
6
+ as an argument, either CamelCased or snake_cased, and an optional
7
+ attribute 'associated_relation' as an argument.
8
+
9
+ The 'associated_relation' attribute expects an ActiveRecord class as value. This
10
+ is useful for cases where you want to override the associated relation in
11
+ the query object.
12
+
13
+ This generator invokes your configured ORM and test framework, which Active
14
+ Record and Rspec are the only ones supported at the moment.
15
+
16
+ Example:
17
+ `rails generate query Account`
18
+
19
+ Creates a standard account query object and the spec file.
20
+
21
+ Query Object: app/queries/account_query.rb
22
+ Rspec: spec/queries/account_query.rb
23
+
24
+ `rails generate query Admin::Account`
25
+
26
+ Creates an account query object and the spec file following the namespace
27
+ location.
28
+
29
+ Query Object: app/queries/admin/account_query.rb
30
+ Rspec: spec/queries/admin/account_query.rb
31
+
32
+ `rails generate query Account associated_relation:User`
33
+
34
+ Creates an account query object and the spec file including the
35
+ specification of the `associated_relation` method.
36
+
37
+ app/queries/account_query.rb
38
+ spec/queries/account_query.rb
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../arqo/named_base'
4
+
5
+ module Rails
6
+ module Generators
7
+ class QueryGenerator < ARQO::Generators::NamedBase
8
+ source_root File.expand_path('templates', __dir__)
9
+
10
+ check_class_collision suffix: 'Query'
11
+
12
+ hook_for :test_framework
13
+
14
+ def create_model_query
15
+ return if class_name.blank?
16
+
17
+ template_file = File.join('app/queries', class_path, "#{file_name}_query.rb")
18
+ template 'query.rb.erb', template_file
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,15 @@
1
+ <% module_namespacing do -%>
2
+ class <%= class_name %>Query < ARQO::Query
3
+ module Scope
4
+ # Add <%= class_name %> scopes here
5
+ end
6
+ <% if associated_relation -%>
7
+
8
+ private
9
+
10
+ def associated_relation
11
+ <%= associated_relation_class %> # you can also do something like <%= associated_relation_class %>.some_scope
12
+ end
13
+ <% end -%>
14
+ end
15
+ <% end -%>
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../arqo/named_base'
4
+
5
+ module Rspec
6
+ module Generators
7
+ class QueryGenerator < ARQO::Generators::NamedBase
8
+ source_root File.expand_path('templates', __dir__)
9
+
10
+ def create_model_query_spec
11
+ template_file = File.join('spec/queries', class_path, "#{file_name}_query_spec.rb")
12
+ template 'query_spec.rb.erb', template_file
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ require 'rails_helper'
2
+
3
+ <% module_namespacing do -%>
4
+ RSpec.describe <%= class_name %>Query do
5
+ subject(:query) { described_class.new }
6
+
7
+ pending 'add some query object tests here'
8
+ end
9
+ <% end -%>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arqo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Santiago Bartesaghi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-24 00:00:00.000000000 Z
11
+ date: 2023-01-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,20 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '4'
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: '7'
19
+ version: '5.2'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
24
  - - ">="
28
25
  - !ruby/object:Gem::Version
29
- version: '4'
30
- - - "<"
26
+ version: '5.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ammeter
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
31
39
  - !ruby/object:Gem::Version
32
- version: '7'
40
+ version: '1.1'
33
41
  - !ruby/object:Gem::Dependency
34
42
  name: database_cleaner-active_record
35
43
  requirement: !ruby/object:Gem::Requirement
@@ -64,14 +72,14 @@ dependencies:
64
72
  requirements:
65
73
  - - "~>"
66
74
  - !ruby/object:Gem::Version
67
- version: 5.6.0
75
+ version: 6.0.6
68
76
  type: :development
69
77
  prerelease: false
70
78
  version_requirements: !ruby/object:Gem::Requirement
71
79
  requirements:
72
80
  - - "~>"
73
81
  - !ruby/object:Gem::Version
74
- version: 5.6.0
82
+ version: 6.0.6
75
83
  - !ruby/object:Gem::Dependency
76
84
  name: rspec
77
85
  requirement: !ruby/object:Gem::Requirement
@@ -92,14 +100,14 @@ dependencies:
92
100
  requirements:
93
101
  - - "~>"
94
102
  - !ruby/object:Gem::Version
95
- version: 0.80.0
103
+ version: 1.24.1
96
104
  type: :development
97
105
  prerelease: false
98
106
  version_requirements: !ruby/object:Gem::Requirement
99
107
  requirements:
100
108
  - - "~>"
101
109
  - !ruby/object:Gem::Version
102
- version: 0.80.0
110
+ version: 1.24.1
103
111
  - !ruby/object:Gem::Dependency
104
112
  name: simplecov
105
113
  requirement: !ruby/object:Gem::Requirement
@@ -130,7 +138,7 @@ dependencies:
130
138
  version: 1.4.2
131
139
  description:
132
140
  email:
133
- - sbartesaghi@hotmail.com
141
+ - santib@hey.com
134
142
  executables: []
135
143
  extensions: []
136
144
  extra_rdoc_files: []
@@ -139,13 +147,22 @@ files:
139
147
  - README.md
140
148
  - lib/arqo.rb
141
149
  - lib/arqo/query.rb
150
+ - lib/arqo/railtie.rb
142
151
  - lib/arqo/version.rb
143
- homepage: https://github.com/santib/arqo
152
+ - lib/generators/arqo/named_base.rb
153
+ - lib/generators/model_generator.rb
154
+ - lib/generators/rails/USAGE
155
+ - lib/generators/rails/query_generator.rb
156
+ - lib/generators/rails/templates/query.rb.erb
157
+ - lib/generators/rspec/query_generator.rb
158
+ - lib/generators/rspec/templates/query_spec.rb.erb
159
+ homepage: https://github.com/rootstrap/arqo
144
160
  licenses:
145
161
  - MIT
146
162
  metadata:
147
- homepage_uri: https://github.com/santib/arqo
148
- source_code_uri: https://github.com/santib/arqo
163
+ homepage_uri: https://github.com/rootstrap/arqo
164
+ source_code_uri: https://github.com/rootstrap/arqo
165
+ rubygems_mfa_required: 'true'
149
166
  post_install_message:
150
167
  rdoc_options: []
151
168
  require_paths:
@@ -154,15 +171,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
154
171
  requirements:
155
172
  - - ">="
156
173
  - !ruby/object:Gem::Version
157
- version: 2.3.0
174
+ version: 2.5.0
158
175
  required_rubygems_version: !ruby/object:Gem::Requirement
159
176
  requirements:
160
177
  - - ">="
161
178
  - !ruby/object:Gem::Version
162
179
  version: '0'
163
180
  requirements: []
164
- rubyforge_project:
165
- rubygems_version: 2.5.2.3
181
+ rubygems_version: 3.0.3.1
166
182
  signing_key:
167
183
  specification_version: 4
168
184
  summary: Easing the query object pattern in Rails applications.