dropkiq 0.1.8 → 0.1.11

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
2
  SHA1:
3
- metadata.gz: ca530f5f1cb0665300e76bd129eb0bb1e71038bd
4
- data.tar.gz: d4c5bf9dc8f5f5f15ee8962ba9cfae2d0f499b79
3
+ metadata.gz: 79323cdebbbd66a06c273745adeec22144d81d84
4
+ data.tar.gz: 38fe7ff01b60bddac23b649811d22232fc18d902
5
5
  SHA512:
6
- metadata.gz: 9e4d82928aacd87fbd0734ffb3bdff7506e369c101019ce2a02435545f28d53d4c7b132b4db53fe3ba36419b7fa632e1f16731c49e266411709c2c44da2783b6
7
- data.tar.gz: 6884dfd454274a2ca16ade992c7351aa24da39193a805270ae4f9dbd5c594983fa658ce254da43bcc8e4cfbdd6ad7d693450907324a98d33ec3c42342c0fcb25
6
+ metadata.gz: 7a3ea5a984d07fb2ea97ecb330f7f21a07f303c7a03ff015ea862fea5f378a544d3b75fb03a9a42a25c7beacb2a189210214ef813901ba92dcefd8718424ba41
7
+ data.tar.gz: 5e804c999f7f5505eda283bbe3b83a4f4af4f58e12644383bab045ea29e210e95a7b174f2297a3ead7ae2c9ef656a3d6a316a2fb0387feaf955bc60f41319793
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dropkiq (0.1.8)
4
+ dropkiq (0.1.11)
5
5
  activerecord (>= 4.2)
6
6
  liquid (~> 4.0)
7
7
 
data/README.md CHANGED
@@ -30,7 +30,7 @@ Or install it yourself as:
30
30
 
31
31
  This Gem makes several assumptions about your Ruby on Rails application:
32
32
 
33
- * Drop classes are expected to have the same name as the corresponding Rails model. For example, if you have an ActiveRecord model with name of `Person`, the drop class is expected to be called `PersonDrop`
33
+ * Drop classes are expected to have the same name as the corresponding Rails model. For example, if you have an ActiveRecord model with name of `Person`, the drop class is expected to be called `PersonDrop` (Ruby on Rails applications using the legacy `liquid_methods` method with [PR #568](https://github.com/Shopify/liquid/pull/568) are also supported.)
34
34
  * Drop class methods are expected to return the same data type as the corresponding Rails-model getter methods for relationships and columns.
35
35
  * This Gem has not been tested with Rails models that have non-default primary key (other than `id`).
36
36
 
@@ -44,7 +44,7 @@ bundle exec rake dropkiq:schema
44
44
 
45
45
  You should now have a `db/dropkiq_schema.yaml` file. This file describes all tables associated to Drop classes in your application, along with all methods avaialble to the Drop class. It is important that you **DO** allow this file to be checked in to version control so that you can maintain your Dropkiq schema over time as you add/remove/modify your Drop classes.
46
46
 
47
- Notice that `type` has NOT been set on all methods. The Dropkiq Gem is only able to infer the method type for methods that correspond to a column or relationship on the ActiveRecord model. Please take a moment to manually add `type` values for all methods that were not able to be inferred. Notice that if you run `bundle exec rake dropkiq:schema` again, your changes are saved!
47
+ Notice that `type` has NOT been set on all methods. The Dropkiq Gem is only able to infer the method type for methods that correspond to a column or relationship on the ActiveRecord model. Please take a moment to manually add `type` values for all methods that were not able to be inferred. (Hint: Search the dropkiq_schema.yaml file for the word "CHANGEME" to see what needs manual attention.) Notice that if you run `bundle exec rake dropkiq:schema` again, your changes are saved!
48
48
 
49
49
 
50
50
  #### Ruby on Rails Column to Dropkiq Data Type Mappings
@@ -122,6 +122,45 @@ class ProductDrop < Liquid::Drop
122
122
  end
123
123
  ```
124
124
 
125
+ #### Dropkiq Method Classification
126
+
127
+ In the event that a liquid method is not an exact match to a column or association, the Dropkiq Ruby Gem will attempt to make a best guess about the data type of the method based on the name. The rules for matching are as follows:
128
+
129
+ | Method Name Ends With | Dropkiq Data Type |
130
+ | --- | --- |
131
+ | `_id` | `ColumnTypes::Numeric` |
132
+ | `_count` | `ColumnTypes::Numeric` |
133
+ | `?` | `ColumnTypes::Boolean` |
134
+ | `_present` | `ColumnTypes::Boolean` |
135
+ | `_changed` | `ColumnTypes::Boolean` |
136
+ | `description` | `ColumnTypes::Text` |
137
+ | `name` | `ColumnTypes::String` |
138
+ | `password` | `ColumnTypes::String` |
139
+ | `type` | `ColumnTypes::String` |
140
+ | `title` | `ColumnTypes::String` |
141
+ | `to_s` | `ColumnTypes::String` |
142
+ | `to_string` | `ColumnTypes::String` |
143
+ | `_url` | `ColumnTypes::String` |
144
+ | `_email` | `ColumnTypes::String` |
145
+ | `_partial` | `ColumnTypes::String` |
146
+ | `_email_address` | `ColumnTypes::String` |
147
+ | `_uuid` | `ColumnTypes::String` |
148
+
149
+ The Dropkiq Ruby Gem will also attempt to classify liquid methods by creating a sample instance of the Liquid Drop class to test. The liquid method will be called, and the value will attempt to be classified using the foollowing:
150
+
151
+ | Value Result | Dropkiq Data Type |
152
+ | --- | --- |
153
+ | `TrueClass` | `ColumnTypes::Boolean` |
154
+ | `FalseClass` | `ColumnTypes::Boolean` |
155
+ | `String` | `ColumnTypes::String` |
156
+ | `Symbol` | `ColumnTypes::String` |
157
+ | `Numeric` | `ColumnTypes::Numeric` |
158
+ | `Date` | `ColumnTypes::DateTime` |
159
+ | `Time` | `ColumnTypes::DateTime` |
160
+ | `DateTime` | `ColumnTypes::DateTime` |
161
+
162
+ Dropkiq will attempt to classify relationships in the event the method returns a single ActiveRecord object (`ColumnTypes::HasOne`), or a collection or ActiveRecord objects (`ColumnTypes::HasMany`).
163
+
125
164
  ## Development
126
165
 
127
166
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -7,6 +7,8 @@ require "dropkiq/constants"
7
7
 
8
8
  require "dropkiq/drop_class_analyzer"
9
9
  require "dropkiq/drop_method_analyzer"
10
+ require "dropkiq/drop_method_name_classifier"
11
+ require "dropkiq/drop_method_instance_simulator"
10
12
  require 'dropkiq/railtie' if defined?(Rails)
11
13
 
12
14
  module Dropkiq
@@ -52,8 +52,14 @@ module Dropkiq
52
52
  default_methods = (Liquid::Drop.instance_methods + Object.instance_methods)
53
53
  instance_methods = (liquid_drop_class.instance_methods - default_methods)
54
54
 
55
+ sample_instance = active_record_class.first
56
+ sample_drop = begin
57
+ liquid_drop_class.new(sample_instance)
58
+ rescue
59
+ end
60
+
55
61
  instance_methods.inject({}) do |hash, method|
56
- analyzer = Dropkiq::DropMethodAnalyzer.new(self, method)
62
+ analyzer = Dropkiq::DropMethodAnalyzer.new(self, method, sample_drop)
57
63
  analyzer.analyze
58
64
  hash.merge!(analyzer.to_param)
59
65
  end.sort_by { |key| key }.to_h
@@ -1,13 +1,16 @@
1
1
  module Dropkiq
2
2
  class DropMethodAnalyzer
3
+ CHANGEME = "CHANGEME"
4
+
3
5
  attr_accessor :drop_class_analyzer, :drop_method,
4
- :dropkiq_type, :foreign_table_name
6
+ :dropkiq_type, :foreign_table_name, :sample_drop
5
7
 
6
8
  delegate :active_record_class, to: :drop_class_analyzer
7
9
 
8
- def initialize(drop_class_analyzer, drop_method)
10
+ def initialize(drop_class_analyzer, drop_method, sample_drop=nil)
9
11
  self.drop_class_analyzer = drop_class_analyzer
10
12
  self.drop_method = drop_method
13
+ self.sample_drop = sample_drop
11
14
  end
12
15
 
13
16
  def analyze
@@ -15,15 +18,21 @@ module Dropkiq
15
18
  relationship_to_dropkiq_type_classifier
16
19
  elsif is_column?
17
20
  column_to_dropkiq_type_classifier
21
+ else
22
+ Dropkiq::DropMethodNameClassifier.new(drop_method).classify
23
+ end
24
+
25
+ if dropkiq_type.blank?
26
+ result = Dropkiq::DropMethodInstanceSimulator.new(drop_method, sample_drop).classify
27
+ self.dropkiq_type = result.dropkiq_type
28
+ self.foreign_table_name = result.foreign_table_name
18
29
  end
19
30
  end
20
31
 
21
32
  def to_param
22
- return {} if dropkiq_type.blank?
23
-
24
33
  {
25
34
  "#{drop_method}" => {
26
- "type" => dropkiq_type,
35
+ "type" => (dropkiq_type.presence || CHANGEME),
27
36
  "foreign_table_name" => foreign_table_name
28
37
  }
29
38
  }
@@ -45,7 +54,7 @@ module Dropkiq
45
54
  begin
46
55
  self.foreign_table_name = reflection.class_name.constantize.table_name
47
56
  rescue
48
- puts "WARNING: Could not find #{drop_method} on #{active_record_class.name} (skipping)"
57
+ puts "WARNING: Could not find #{drop_method} on #{active_record_class.name}"
49
58
  return
50
59
  end
51
60
 
@@ -0,0 +1,58 @@
1
+ module Dropkiq
2
+ class DropMethodInstanceSimulator
3
+ attr_accessor :drop_method, :sample_drop
4
+ attr_accessor :dropkiq_type, :foreign_table_name
5
+
6
+ def initialize(drop_method, sample_drop=nil)
7
+ self.drop_method = drop_method.to_s
8
+ self.sample_drop = sample_drop
9
+ end
10
+
11
+ def classify
12
+ value = begin
13
+ sample_drop.try(drop_method)
14
+ rescue
15
+ end
16
+
17
+ self.dropkiq_type = ruby_data_type_to_dropkiq_type(value)
18
+ self.dropkiq_type ||= test_for_relationship(value)
19
+
20
+ self
21
+ end
22
+
23
+ private
24
+
25
+ def test_for_relationship(value)
26
+ if value.is_a?(ActiveRecord::Base)
27
+ self.foreign_table_name = value.class.table_name
28
+ return Dropkiq::HAS_ONE_TYPE
29
+ elsif value.respond_to?(:first) && value.first.is_a?(ActiveRecord::Base)
30
+ self.foreign_table_name = value.first.class.table_name
31
+ return Dropkiq::HAS_MANY_TYPE
32
+ end
33
+ end
34
+
35
+ def ruby_data_type_to_dropkiq_type(value)
36
+ case value
37
+ when NilClass
38
+ when TrueClass
39
+ Dropkiq::BOOLEAN_TYPE
40
+ when FalseClass
41
+ Dropkiq::BOOLEAN_TYPE
42
+ when String
43
+ Dropkiq::STRING_TYPE
44
+ when Symbol
45
+ Dropkiq::STRING_TYPE
46
+ when Numeric
47
+ Dropkiq::NUMERIC_TYPE
48
+ when Date
49
+ Dropkiq::DATE_TIME_TYPE
50
+ when Time
51
+ Dropkiq::DATE_TIME_TYPE
52
+ when DateTime
53
+ Dropkiq::DATE_TIME_TYPE
54
+ else
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,52 @@
1
+ module Dropkiq
2
+ class DropMethodNameClassifier
3
+ attr_accessor :drop_method
4
+
5
+ def initialize(drop_method)
6
+ self.drop_method = drop_method.to_s
7
+ end
8
+
9
+ def classify
10
+ if numeric_type_match?
11
+ Dropkiq::NUMERIC_TYPE
12
+ elsif boolean_type_match?
13
+ Dropkiq::BOOLEAN_TYPE
14
+ elsif text_type_match?
15
+ Dropkiq::TEXT_TYPE
16
+ elsif string_type_match?
17
+ Dropkiq::STRING_TYPE
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def numeric_type_match?
24
+ drop_method.ends_with?("_id") ||
25
+ drop_method.ends_with?("_count")
26
+ end
27
+
28
+ def boolean_type_match?
29
+ drop_method.ends_with?("?") ||
30
+ drop_method.ends_with?("_present") ||
31
+ drop_method.ends_with?("_changed")
32
+ end
33
+
34
+ def text_type_match?
35
+ drop_method.ends_with?("description")
36
+ end
37
+
38
+ def string_type_match?
39
+ drop_method.ends_with?("name") ||
40
+ drop_method.ends_with?("password") ||
41
+ drop_method.ends_with?("type") ||
42
+ drop_method.ends_with?("title") ||
43
+ drop_method.ends_with?("to_s") ||
44
+ drop_method.ends_with?("to_string") ||
45
+ drop_method.ends_with?("_url") ||
46
+ drop_method.ends_with?("_email") ||
47
+ drop_method.ends_with?("_partial") ||
48
+ drop_method.ends_with?("_email_address") ||
49
+ drop_method.ends_with?("_uuid")
50
+ end
51
+ end
52
+ end
@@ -11,8 +11,10 @@ namespace :dropkiq do
11
11
  stdout, stderr = StringIO.new, StringIO.new
12
12
  $stdout, $stderr = stdout, stderr
13
13
  Dir.glob("#{Rails.root}#{Dropkiq::DEFAULT_MODEL_PATH}/**/*.rb").each do |f|
14
- load f
15
- rescue
14
+ begin
15
+ load f
16
+ rescue
17
+ end
16
18
  end
17
19
  $stdout, $stderr = STDOUT, STDERR
18
20
 
@@ -1,3 +1,3 @@
1
1
  module Dropkiq
2
- VERSION = "0.1.8"
2
+ VERSION = "0.1.11"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dropkiq
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.1.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Darrah
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-20 00:00:00.000000000 Z
11
+ date: 2020-01-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -160,6 +160,8 @@ files:
160
160
  - lib/dropkiq/constants.rb
161
161
  - lib/dropkiq/drop_class_analyzer.rb
162
162
  - lib/dropkiq/drop_method_analyzer.rb
163
+ - lib/dropkiq/drop_method_instance_simulator.rb
164
+ - lib/dropkiq/drop_method_name_classifier.rb
163
165
  - lib/dropkiq/railtie.rb
164
166
  - lib/dropkiq/tasks/dropkiq/schema.rake
165
167
  - lib/dropkiq/version.rb