rao-active_collection 0.0.50.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +72 -0
- data/Rakefile +21 -0
- data/lib/rao/active_collection/attribute_names_concern.rb +40 -0
- data/lib/rao/active_collection/base.rb +137 -0
- data/lib/rao/active_collection/engine.rb +7 -0
- data/lib/rao/active_collection/order_condition.rb +34 -0
- data/lib/rao/active_collection/relation.rb +136 -0
- data/lib/rao/active_collection/version.rb +7 -0
- data/lib/rao/active_collection/where_condition.rb +52 -0
- data/lib/rao-active_collection.rb +11 -0
- metadata +236 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cf3bddfa27fe383bbcb3dff1869a85737793decbbbb118b24f50d7ff9cafaf5e
|
4
|
+
data.tar.gz: a7c4945d5d575615902b88cc8b45d004c3c74c447dc23504ca23ddc68abe1ca1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f4e1b0099e8bea9a97eeb4f72b340f35921788028aadcaece78aaeb966307bd62efea641052a1f36ac8c7a680d8a00f3b83ffa4b91fafd2a50ddecb4f89cde60
|
7
|
+
data.tar.gz: 5024a236c995b59c7c0bbf3c8ded892fa05f111c952c0f272cef9421cbc223e15da10aaa39aba7ac6f9842766ce0d69b6cd2e51d1cca3ff949b0444cc7f93123
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2023 BeeGood IT
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
# Rails Add-Ons Service
|
2
|
+
|
3
|
+
Rails is missing a service layer. For simple applications the default MVC impementation may be enought, but once you begin adding serious business lovgic you either end up with fat controllers, models, callback hell or all of them.
|
4
|
+
|
5
|
+
Rao::Service solves this problem by providing you a service object that is easy to use. It can be simultaneously used for UIs and APIs by using Rao::ServiceController and Rao::Api::Service Controller as its frontend.
|
6
|
+
|
7
|
+
|
8
|
+
## Usage
|
9
|
+
|
10
|
+
Here is a basic example that queries the nasa api:
|
11
|
+
```
|
12
|
+
# nethttp.rb
|
13
|
+
require 'uri'
|
14
|
+
require 'net/http'
|
15
|
+
|
16
|
+
class NasaService < Rao::Service::Base
|
17
|
+
class Result < Rao::Service::Result::Base
|
18
|
+
attr_accessor :response
|
19
|
+
|
20
|
+
def parsed_response
|
21
|
+
@parsed_response ||= JSON.parse(response)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def _perform
|
28
|
+
response = Net::HTTP.get_response(uri)
|
29
|
+
|
30
|
+
if response.is_a?(Net::HTTPSuccess)
|
31
|
+
@result.response = response.body
|
32
|
+
else
|
33
|
+
add_error_and_say(:base, "API request failed.")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def uri
|
38
|
+
@uri ||= URI('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
result = PlanetService.call
|
43
|
+
|
44
|
+
if result.ok?
|
45
|
+
result.parsed_response
|
46
|
+
else
|
47
|
+
result.errors.full_messages.to_sentence
|
48
|
+
end
|
49
|
+
```
|
50
|
+
|
51
|
+
## Installation
|
52
|
+
Add this line to your application's Gemfile:
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
gem 'rao-service'
|
56
|
+
```
|
57
|
+
|
58
|
+
And then execute:
|
59
|
+
```bash
|
60
|
+
$ bundle
|
61
|
+
```
|
62
|
+
|
63
|
+
Or install it yourself as:
|
64
|
+
```bash
|
65
|
+
$ gem install rao-service
|
66
|
+
```
|
67
|
+
|
68
|
+
## Contributing
|
69
|
+
Contribution directions go here.
|
70
|
+
|
71
|
+
## License
|
72
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'Rails Add-Ons Active Collection'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.md')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
load 'rails/tasks/statistics.rake'
|
18
|
+
|
19
|
+
require 'bundler/gem_tasks'
|
20
|
+
|
21
|
+
require 'rails/dummy/tasks'
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Rao
|
2
|
+
module ActiveCollection
|
3
|
+
module AttributeNamesConcern
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
end
|
8
|
+
|
9
|
+
class_methods do
|
10
|
+
def attr_accessor(*args)
|
11
|
+
super
|
12
|
+
add_attribute_names(*args)
|
13
|
+
define_attribute_methods(*args)
|
14
|
+
end
|
15
|
+
|
16
|
+
def attr_reader(*args)
|
17
|
+
super
|
18
|
+
add_attribute_names(*args)
|
19
|
+
define_attribute_methods(*args)
|
20
|
+
end
|
21
|
+
|
22
|
+
def add_attribute_names(*args)
|
23
|
+
args.each do |attr_name|
|
24
|
+
attribute_names << attr_name.to_sym
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def attribute_names
|
29
|
+
(@attr_names ||= [])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def attributes
|
34
|
+
self.class.attribute_names.each_with_object({}.with_indifferent_access) do |attribute, hash|
|
35
|
+
hash[attribute] = send(attribute)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
require "rao/active_collection/attribute_names_concern"
|
2
|
+
|
3
|
+
module Rao
|
4
|
+
module ActiveCollection
|
5
|
+
class Base
|
6
|
+
include ActiveModel::Conversion
|
7
|
+
include ActiveModel::Validations
|
8
|
+
include ActiveModel::Dirty
|
9
|
+
include AttributeNamesConcern
|
10
|
+
|
11
|
+
def self.primary_key
|
12
|
+
:id
|
13
|
+
end
|
14
|
+
|
15
|
+
class << self
|
16
|
+
include Enumerable
|
17
|
+
delegate :count, :delete_all, :find, :first, :first!, :order, :last, :last!, :page, :reorder, :where, to: :all
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.inherited(base)
|
21
|
+
klass = Class.new(Rao::ActiveCollection::Relation)
|
22
|
+
base.const_set(:Relation, klass)
|
23
|
+
end
|
24
|
+
|
25
|
+
def ==(other)
|
26
|
+
self.class == other.class && send(self.class.primary_key) == other.send(self.class.primary_key)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.each
|
30
|
+
# rubocop:disable Style/For
|
31
|
+
for item in all.to_a do
|
32
|
+
yield item
|
33
|
+
end
|
34
|
+
# rubocop:enable Style/For
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.all
|
38
|
+
self::Relation.new(self)
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.collection
|
42
|
+
@collection ||= {}.with_indifferent_access
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.columns_hash
|
46
|
+
@columns_hash ||= attribute_names.each_with_object({}.with_indifferent_access) do |attribute, hash|
|
47
|
+
hash[attribute] = OpenStruct.new(name: attribute, type: String)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.column_names
|
52
|
+
columns_hash.keys.map(&:to_sym)
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.create(attributes = {})
|
56
|
+
new(attributes).save
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.create!(attributes = {})
|
60
|
+
new(attributes).save!
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.generate_primary_key(record = nil)
|
64
|
+
(collection.keys.map(&:to_i).max || 0) + 1
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.table_name
|
68
|
+
name.underscore.tr("/", "_").pluralize
|
69
|
+
end
|
70
|
+
|
71
|
+
def destroy
|
72
|
+
@destroyed = true
|
73
|
+
collection = self.class.instance_variable_get(:@collection)
|
74
|
+
collection.delete(send(self.class.primary_key))
|
75
|
+
self.class.instance_variable_set(:@collection, collection)
|
76
|
+
self
|
77
|
+
end
|
78
|
+
|
79
|
+
def destroyed?
|
80
|
+
!!@destroyed
|
81
|
+
end
|
82
|
+
|
83
|
+
def initialize(attributes = {})
|
84
|
+
attributes.each do |key, value|
|
85
|
+
send("#{key}=", value)
|
86
|
+
end
|
87
|
+
@new_record = true
|
88
|
+
@destroyed = false
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.limit(limit)
|
92
|
+
self::Relation.new(self).limit(limit)
|
93
|
+
end
|
94
|
+
|
95
|
+
def new_record?
|
96
|
+
!!@new_record
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.offset(offset)
|
100
|
+
self::Relation.new(self).offset(offset)
|
101
|
+
end
|
102
|
+
|
103
|
+
def persisted?
|
104
|
+
!(new_record? || destroyed?)
|
105
|
+
end
|
106
|
+
|
107
|
+
def reload
|
108
|
+
restore_attributes
|
109
|
+
clear_changes_information
|
110
|
+
self
|
111
|
+
end
|
112
|
+
|
113
|
+
def save
|
114
|
+
send("#{self.class.primary_key}=", self.class.generate_primary_key(self))
|
115
|
+
return unless valid?
|
116
|
+
@new_record = false
|
117
|
+
changes_applied
|
118
|
+
self.class.collection[send(self.class.primary_key)] = self
|
119
|
+
end
|
120
|
+
|
121
|
+
def save!
|
122
|
+
save || raise(ActiveRecord::RecordInvalid.new(self))
|
123
|
+
end
|
124
|
+
|
125
|
+
def update(attributes)
|
126
|
+
attributes.each do |key, value|
|
127
|
+
send("#{key}=", value)
|
128
|
+
end
|
129
|
+
save
|
130
|
+
end
|
131
|
+
|
132
|
+
private
|
133
|
+
|
134
|
+
attr_writer :new_record
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Rao
|
2
|
+
module ActiveCollection
|
3
|
+
class OrderCondition
|
4
|
+
attr_accessor :relation, :conditions
|
5
|
+
|
6
|
+
def initialize(relation, conditions)
|
7
|
+
@relation = relation
|
8
|
+
@conditions = conditions
|
9
|
+
end
|
10
|
+
|
11
|
+
def result
|
12
|
+
case @conditions
|
13
|
+
when Hash
|
14
|
+
@conditions.each do |key, value|
|
15
|
+
apply_condition(key, value)
|
16
|
+
end
|
17
|
+
else
|
18
|
+
raise "Unsupported condition type: #{conditions.class.name}"
|
19
|
+
end
|
20
|
+
@relation
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def apply_condition(key, value)
|
26
|
+
@relation.collection = if value.to_sym == :asc
|
27
|
+
@relation.collection.sort_by { |a| a.last.send(key).to_s }.to_h
|
28
|
+
else
|
29
|
+
@relation.collection.sort_by { |a| a.last.send(key).to_s }.reverse.to_h
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
module Rao
|
2
|
+
module ActiveCollection
|
3
|
+
class Relation
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
attr_accessor :collection
|
7
|
+
|
8
|
+
delegate :columns_hash, :table_name, to: :@klass
|
9
|
+
|
10
|
+
def initialize(klass)
|
11
|
+
@klass = klass
|
12
|
+
@collection = klass.collection
|
13
|
+
@conditions = []
|
14
|
+
@order = []
|
15
|
+
@page = nil
|
16
|
+
@per = nil
|
17
|
+
@limit = nil
|
18
|
+
@offset = nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_a
|
22
|
+
transform_page_and_per_to_limit_and_offset! if @page
|
23
|
+
apply_limit(apply_offset(@collection.values))
|
24
|
+
end
|
25
|
+
|
26
|
+
def count
|
27
|
+
all.to_a.size
|
28
|
+
end
|
29
|
+
|
30
|
+
def delete_all
|
31
|
+
@deleted = all
|
32
|
+
@klass.instance_variable_set(
|
33
|
+
:@collection,
|
34
|
+
@klass.collection.excluding(@deleted.map { |item| item.send(@klass.primary_key) })
|
35
|
+
)
|
36
|
+
@deleted
|
37
|
+
end
|
38
|
+
|
39
|
+
def each
|
40
|
+
# rubocop:disable Style/For
|
41
|
+
for item in all.to_a do
|
42
|
+
yield item
|
43
|
+
end
|
44
|
+
# rubocop:enable Style/For
|
45
|
+
end
|
46
|
+
|
47
|
+
def where(conditions)
|
48
|
+
@conditions << WhereCondition.new(self, conditions)
|
49
|
+
self
|
50
|
+
end
|
51
|
+
|
52
|
+
def all
|
53
|
+
@conditions.each do |condition|
|
54
|
+
apply_condition(condition)
|
55
|
+
end
|
56
|
+
@order.each do |condition|
|
57
|
+
apply_condition(condition)
|
58
|
+
end
|
59
|
+
self
|
60
|
+
end
|
61
|
+
|
62
|
+
def find(id)
|
63
|
+
where(id: id).first || raise(ActiveRecord::RecordNotFound)
|
64
|
+
end
|
65
|
+
|
66
|
+
def first
|
67
|
+
all.collection.values.first
|
68
|
+
end
|
69
|
+
|
70
|
+
def first!
|
71
|
+
first || raise(ActiveRecord::RecordNotFound)
|
72
|
+
end
|
73
|
+
|
74
|
+
def last
|
75
|
+
all.collection.values.last
|
76
|
+
end
|
77
|
+
|
78
|
+
def last!
|
79
|
+
last || raise(ActiveRecord::RecordNotFound)
|
80
|
+
end
|
81
|
+
|
82
|
+
def limit(limit)
|
83
|
+
@limit = limit
|
84
|
+
self
|
85
|
+
end
|
86
|
+
|
87
|
+
def offset(offset)
|
88
|
+
@offset = offset
|
89
|
+
self
|
90
|
+
end
|
91
|
+
|
92
|
+
def order(condition)
|
93
|
+
@order << OrderCondition.new(self, condition)
|
94
|
+
self
|
95
|
+
end
|
96
|
+
|
97
|
+
def page(page)
|
98
|
+
@page = page
|
99
|
+
self
|
100
|
+
end
|
101
|
+
|
102
|
+
def per(per)
|
103
|
+
@per = per
|
104
|
+
self
|
105
|
+
end
|
106
|
+
|
107
|
+
def reorder(condition)
|
108
|
+
@order = []
|
109
|
+
order(condition)
|
110
|
+
self
|
111
|
+
end
|
112
|
+
|
113
|
+
private
|
114
|
+
|
115
|
+
def apply_condition(condition)
|
116
|
+
relation = condition.result
|
117
|
+
@collection = relation.collection
|
118
|
+
end
|
119
|
+
|
120
|
+
def apply_offset(collection)
|
121
|
+
return collection unless @offset
|
122
|
+
collection.drop(@offset)
|
123
|
+
end
|
124
|
+
|
125
|
+
def apply_limit(collection)
|
126
|
+
return collection unless @limit
|
127
|
+
collection.first(@limit)
|
128
|
+
end
|
129
|
+
|
130
|
+
def transform_page_and_per_to_limit_and_offset!
|
131
|
+
@limit = @per
|
132
|
+
@offset = (@page - 1) * @per
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Rao
|
2
|
+
module ActiveCollection
|
3
|
+
class WhereCondition
|
4
|
+
attr_accessor :relation, :conditions
|
5
|
+
|
6
|
+
def initialize(relation, conditions)
|
7
|
+
@relation = relation
|
8
|
+
@conditions = conditions
|
9
|
+
end
|
10
|
+
|
11
|
+
def result
|
12
|
+
case @conditions
|
13
|
+
when Array
|
14
|
+
if @conditions.first.include?("LIKE")
|
15
|
+
key = @conditions.first.split(" ").first.split(".").last
|
16
|
+
value = @conditions.last
|
17
|
+
apply_like_condition(key, value)
|
18
|
+
else
|
19
|
+
raise "Unsupported condition type: #{conditions.class.name}"
|
20
|
+
end
|
21
|
+
when Hash
|
22
|
+
@conditions.each do |key, value|
|
23
|
+
apply_condition(key, value)
|
24
|
+
end
|
25
|
+
else
|
26
|
+
raise "Unsupported condition type: #{conditions.class.name}"
|
27
|
+
end
|
28
|
+
@relation
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def apply_condition(key, value)
|
34
|
+
@relation.collection = @relation.collection.select do |id, item|
|
35
|
+
item.send(key) == value
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def apply_like_condition(key, value)
|
40
|
+
@relation.collection = @relation.collection.select do |id, item|
|
41
|
+
if value.start_with?("%") && value.end_with?("%")
|
42
|
+
item.send(key).to_s.include?(value.delete("%"))
|
43
|
+
elsif value.start_with?("%")
|
44
|
+
item.send(key).to_s.end_with?(value.delete("%"))
|
45
|
+
elsif value.end_with?("%")
|
46
|
+
item.send(key).to_s.start_with?(value.delete("%"))
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require "rao/active_collection/version"
|
2
|
+
require "rao/active_collection/engine"
|
3
|
+
require "rao/active_collection/base"
|
4
|
+
require "rao/active_collection/relation"
|
5
|
+
require "rao/active_collection/where_condition"
|
6
|
+
require "rao/active_collection/order_condition"
|
7
|
+
|
8
|
+
module Rao
|
9
|
+
module ActiveCollection
|
10
|
+
end
|
11
|
+
end
|
metadata
ADDED
@@ -0,0 +1,236 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rao-active_collection
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.50.pre
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- BeeGood IT
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-10-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '6.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '6.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rao
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rails-dummy
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bootsnap
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: factory_bot_rails
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: guard-bundler
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: guard-rspec
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: guard-standardrb
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: pry
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rb-readline
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: rspec-rails
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: standardrb
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: sqlite3
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '1.4'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '1.4'
|
195
|
+
description:
|
196
|
+
email:
|
197
|
+
- info@beegoodit.de
|
198
|
+
executables: []
|
199
|
+
extensions: []
|
200
|
+
extra_rdoc_files: []
|
201
|
+
files:
|
202
|
+
- MIT-LICENSE
|
203
|
+
- README.md
|
204
|
+
- Rakefile
|
205
|
+
- lib/rao-active_collection.rb
|
206
|
+
- lib/rao/active_collection/attribute_names_concern.rb
|
207
|
+
- lib/rao/active_collection/base.rb
|
208
|
+
- lib/rao/active_collection/engine.rb
|
209
|
+
- lib/rao/active_collection/order_condition.rb
|
210
|
+
- lib/rao/active_collection/relation.rb
|
211
|
+
- lib/rao/active_collection/version.rb
|
212
|
+
- lib/rao/active_collection/where_condition.rb
|
213
|
+
homepage: https://github.com/rao
|
214
|
+
licenses:
|
215
|
+
- MIT
|
216
|
+
metadata: {}
|
217
|
+
post_install_message:
|
218
|
+
rdoc_options: []
|
219
|
+
require_paths:
|
220
|
+
- lib
|
221
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
222
|
+
requirements:
|
223
|
+
- - ">="
|
224
|
+
- !ruby/object:Gem::Version
|
225
|
+
version: 2.6.0
|
226
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
227
|
+
requirements:
|
228
|
+
- - ">"
|
229
|
+
- !ruby/object:Gem::Version
|
230
|
+
version: 1.3.1
|
231
|
+
requirements: []
|
232
|
+
rubygems_version: 3.4.20
|
233
|
+
signing_key:
|
234
|
+
specification_version: 4
|
235
|
+
summary: Services for Ruby on Rails.
|
236
|
+
test_files: []
|