generic_job 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 47fd8f208d252ee6488a5eb70f08754bb724d34dffa4985c54091e83c0b3b0fb
4
- data.tar.gz: e2903438690596f195d96340f662e338d30dfdc0b9a449489c10ca9aeab568de
3
+ metadata.gz: 92d3bc04b8a275912c8db7c199066a1fd2b9a490c95c8885bb6dd81fa85afab3
4
+ data.tar.gz: 9952a976e9a4b2fbe71ed1201643ce04355f75c238c366bb8bd1a5d234b989a3
5
5
  SHA512:
6
- metadata.gz: cda3b8537772be5734c2d1b555a1ed56d986b3bb078700cb1591f5648b529d0da78eb4bf6642eda0d926e6f969ec6789a5971405a47ea05e7c55ef879ea61eb7
7
- data.tar.gz: d1d9426119cdc58a42f2fef240202a9107589d24f8f30de6b564ddec09fa22b7271def3dff2cc45a81bae73e6fe1eea80e17eb73a7ddb3f3bf08cc548f9cdc8e
6
+ metadata.gz: d64823b2bfbd3ee24f754f8232a3e6d56014d039ae918dd9021466e2cfa5b6efe73c8d987f02b048f1853a87cff67fc3e4a4d59c625986b25a6b48960a0836f1
7
+ data.tar.gz: bd04831cdf0bbc45fa395a0b48b29b178d8b81868c883fc06c0943d5e533ae96239eb7c30b71aabb3be1e6662f8f86082070a767e710f30b8aae9d31eef57b9a
data/README.md CHANGED
@@ -1,10 +1,123 @@
1
1
  # GenericJob
2
- Short description and motivation.
3
2
 
4
- ## Usage
5
- How to use my plugin.
3
+ ## 🤔 Why you may need it?
4
+
5
+ GenericJob is a Rails plugin.
6
+
7
+ Active Job does a great work when it comes to declaring jobs and making them run on a variety of queuing backends.
8
+ To do so, you have to create a job in `app/jobs`, implement `perform` method and enqueue a job by calling `perform_later`.
9
+
10
+ But most often you just want to call a given model's or service object's method in the background.
11
+
12
+ There is an effort involved with that:
13
+
14
+ 1. You have to define another _job_ for every class or even a method that you want to run in the background.
15
+ 2. If the purpose of this `ApplicationJob` class is to only run a specific method in the background, it feels redundant.
16
+ 3. On the other hand, if you decide to have an additional logic in the _Job_ class, you basically lock it down to work in the background process only.
17
+
18
+ There should be an easier way. And there is. But before looking at the details, let's form our manifesto.
19
+
20
+
21
+ ### 📜 Manifesto
22
+
23
+ **Every method should be possible to run in the background with the minimal effort. Wherever it makes sense.**
24
+
25
+ _Controller's method running in the background does not make sense for example_ 😉
26
+
27
+
28
+ This is what GenericJob does. It creates a default _Job_ called `GenericJob` and delivers a module named `GenericJob::Async`.
29
+ Include it in a given class to be able to run its methods in the background.
30
+
31
+ ## 🎮 Usage
32
+
33
+ Let's assume that we have following model and "service" classes in the app.
34
+
35
+ ```ruby
36
+ class User < ApplicationRecord
37
+ include GenericJob::Async
38
+
39
+ validates :full_name, presence: true
40
+
41
+ def self.fetch_twitter_for_all! opts = {}
42
+ find_each { |user| user.fetch_twitter! opts }
43
+ end
44
+
45
+ # This method stays in the model for the sake of convenience.
46
+ # Remember that the optimal way when dealing with external services like Twitter API
47
+ # is to call methods like this *** in the background ***
48
+ # to avoid hanging up other application requests
49
+ def fetch_twitter! opts = {}
50
+ TwitterFetcher.new(resource: self).fetch(
51
+ skip_email: opts[:only_name]
52
+ )
53
+ end
54
+ end
55
+
56
+ class TwitterFetcher
57
+ include GenericJob::Async
58
+
59
+ def self.fetch_for_all class_name = 'User', ids = [], opts = {}
60
+ klass = class_name.constantize
61
+ records = ids.empty? ? klass.all : klass.find(ids)
62
+ records.each { |record| new(resource: record).fetch opts }
63
+ end
64
+
65
+ def initialize resource: nil, resource_id: nil, resource_class: 'User'
66
+ @resource = resource
67
+ @resource ||= resource_class.constantize.find resource_id
68
+ end
69
+
70
+ def fetch opts = {}
71
+ fetch_name
72
+ fetch_email unless opts[:skip_email]
73
+ @resource.save!
74
+ end
75
+
76
+ private
77
+
78
+ def fetch_name
79
+ # implement!
80
+ end
81
+
82
+ def fetch_email
83
+ # implement!
84
+ end
85
+ end
86
+ ```
87
+
88
+ All you need to do to be able to run methods in the background is to include `GenericJob::Async` in both classes.
89
+
90
+ Now you can do things like these:
91
+
92
+ ```ruby
93
+ # this code calls the "fetch_twitter!" method in the background for the 1st User
94
+ # in the DB with the all args passed. Before that the job is enqueued on the "low" queue
95
+ User.first.async(queue: 'low')
96
+ .fetch_twitter! only_name: true
97
+
98
+ # this line calls "fetch_twitter_for_all!" class method on a queuing backend
99
+ # with the passed args. The job is enqueued on the 'default' queue
100
+ User.async.fetch_twitter_for_all! only_name: true
101
+
102
+ # this code initializes an object in the background and then calls
103
+ # the "fetch" method. Given arguments are passed to the constructor
104
+ # and the "fetch" method accordingly
105
+ TwitterFetcher.async(queue: :default)
106
+ .new(resource_id: 101)
107
+ .fetch skip_email: true
108
+
109
+ # this line calls "fetch_for_all" class method on a queuing backend
110
+ # with the passed args through the "default" queue
111
+ TwitterFetcher.async.fetch_for_all 'User', [12, 13], skip_email: true
112
+ ```
113
+
114
+ As you can see on the preceding examples - the usage of the `async` method is essential. This method calls `ActiveJob::Core`'s [**set** class method](http://api.rubyonrails.org/v5.0/classes/ActiveJob/Core/ClassMethods.html#method-i-set) under the hood, so you can pass to `async` method all the options that `set` supports. And remember - this is still an `ActiveJob`, so passed method attributes must have serialized type.
115
+
116
+ For more examples look inside the `test` directory.
117
+ Both exemplary classes above are taken from the dummy test app inside.
118
+
119
+ ## 📥 Installation
6
120
 
7
- ## Installation
8
121
  Add this line to your application's Gemfile:
9
122
 
10
123
  ```ruby
@@ -21,8 +134,14 @@ Or install it yourself as:
21
134
  $ gem install generic_job
22
135
  ```
23
136
 
24
- ## Contributing
25
- Contribution directions go here.
137
+ ## 📄 License
26
138
 
27
- ## License
28
139
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
140
+
141
+ ## 👨‍🏭 Author
142
+
143
+ Zbigniew Humeniuk from [Art of Code](http://artofcode.co)
144
+
145
+ ## 👀 See also
146
+
147
+ If you want to make your life easier in the other areas of the web app development as well, I strongly recommend you to take a look at my other project called [Loco framework](https://github.com/locoframework) 🙂. It is even more powerful and makes a front-end <-> back-end communication a breeze (among other things).
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: generic_job
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zbigniew Humeniuk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-05 00:00:00.000000000 Z
11
+ date: 2019-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '5.0'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '6.0'
22
+ version: '7.0'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,21 +29,83 @@ dependencies:
29
29
  version: '5.0'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '6.0'
32
+ version: '7.0'
33
33
  - !ruby/object:Gem::Dependency
34
- name: sqlite3
34
+ name: listen
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: '0'
39
+ version: 3.1.5
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '3.2'
40
43
  type: :development
41
44
  prerelease: false
42
45
  version_requirements: !ruby/object:Gem::Requirement
43
46
  requirements:
44
47
  - - ">="
45
48
  - !ruby/object:Gem::Version
46
- version: '0'
49
+ version: 3.1.5
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '3.2'
53
+ - !ruby/object:Gem::Dependency
54
+ name: overcommit
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - '='
58
+ - !ruby/object:Gem::Version
59
+ version: 0.49.1
60
+ type: :development
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - '='
65
+ - !ruby/object:Gem::Version
66
+ version: 0.49.1
67
+ - !ruby/object:Gem::Dependency
68
+ name: rubocop
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: 0.74.0
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: 0.74.0
81
+ - !ruby/object:Gem::Dependency
82
+ name: rubocop-rails
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: 2.3.1
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: 2.3.1
95
+ - !ruby/object:Gem::Dependency
96
+ name: sqlite3
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: 1.4.1
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: 1.4.1
47
109
  description: Run instance and class methods in the background jobs with ease.
48
110
  email:
49
111
  - hello@artofcode.co
@@ -58,7 +120,6 @@ files:
58
120
  - lib/generic_job/async.rb
59
121
  - lib/generic_job/perform.rb
60
122
  - lib/generic_job/stub.rb
61
- - lib/tasks/generic_job_tasks.rake
62
123
  homepage: https://artofcode.co
63
124
  licenses:
64
125
  - MIT
@@ -78,8 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
139
  - !ruby/object:Gem::Version
79
140
  version: '0'
80
141
  requirements: []
81
- rubyforge_project:
82
- rubygems_version: 2.7.6
142
+ rubygems_version: 3.0.3
83
143
  signing_key:
84
144
  specification_version: 4
85
145
  summary: Higher level abstraction on the top of ActiveJob.
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # desc "Explaining what the task does"
4
- # task :generic_job do
5
- # # Task goes here
6
- # end