rails_ops 1.0.0.beta4 → 1.0.0.beta5

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
  SHA1:
3
- metadata.gz: 200bc5c12a821e07b6d10cfd18d1349c3005a1b3
4
- data.tar.gz: 7dbf7c447bb0a472e28583ea0dc69d4f89ca185a
3
+ metadata.gz: 46e7e8c4aec95a02b0db851c931203119eecc157
4
+ data.tar.gz: 2a6b11cb2f4059d200da3d6f3156dd02ec8529e9
5
5
  SHA512:
6
- metadata.gz: 488428cdb605dd24250003a2d917200f46c86eab3906777489efcb19bca117c7e028a76412042e5a43f261c03c47726cd9780ba83f66ff2a2c92d2908e2e9f30
7
- data.tar.gz: 417abae7e58449757d96885f22ab2ab92b70bb5ad08a27523d55c320e3f8b869ecba128f929a06bb431ca1ef5a5c963e3e8f2e16831733066359a3d949a90bd0
6
+ metadata.gz: 9cdfac5b95544a4569543bdcebb2a8cc2d939805484d1df1b46ccc199e5ea1e0b2f6f2b1b8d861fdaada0f18da8ca2206c5e71acc3e3e057b0f44726e0420fe3
7
+ data.tar.gz: c7455c525dd4dafd1b64a09b23dd1b3dc828c76c75cb890fab797fc7f9bb478cfaf7132aa09e8cb43820dddcc593c73aa5e52e47ebcfdc88f944602dfeadb079
data/.travis.yml CHANGED
@@ -1,5 +1,7 @@
1
- sudo: false
2
1
  language: ruby
3
2
  rvm:
4
- - 2.4.1
5
- before_install: gem install bundler -v 1.15.0
3
+ - 2.3.0
4
+ script:
5
+ - bundle install
6
+ - bundle exec rake test
7
+ - bundle exec rubocop
data/README.md CHANGED
@@ -1,10 +1,9 @@
1
+ [![Build Status](https://travis-ci.org/sitrox/rails_ops.svg?branch=master)](https://travis-ci.org/sitrox/rails_ops)
1
2
  [![Gem Version](https://badge.fury.io/rb/rails_ops.svg)](https://badge.fury.io/rb/rails_ops)
2
3
 
3
4
  rails_ops
4
5
  =========
5
6
 
6
- **This Gem is still under development and is not to be used in production yet.**
7
-
8
7
  This Gem introduces an additional service layer for Rails: *Operations*. An
9
8
  operation is in most cases a *business action* or *use case* and may or may not
10
9
  involve one or multiple models. Rails Ops allows creating more modular
@@ -18,6 +17,35 @@ To achieve this goal, this Gem provides the following building blocks:
18
17
 
19
18
  - A way of abstracting model classes for a specific business action.
20
19
 
20
+ Requirements & Installation
21
+ ---------------------------
22
+
23
+ ### Requirements
24
+
25
+ - RailsOps only works with Rails applications and has been tested with Rails >=
26
+ 5.0.
27
+ - Prior Rails versions may be supported but this has not been verified.
28
+ - Rails Ops' model operations require ActiveRecord but are database / adapter
29
+ agnostic
30
+
31
+ ### Installation
32
+
33
+ 1. Add the following to your Rails application's `Gemfile`:
34
+
35
+ ```ruby
36
+ gem 'rails_ops'
37
+ ```
38
+
39
+ 2. Create an initializer file `config/initializers/rails_ops.rb` with the
40
+ following contents:
41
+
42
+ ```ruby
43
+ RailsOps.configure do |config|
44
+ # Replace this with your authorization backend.
45
+ config.authorization_backend = 'RailsOps::AuthorizationBackend::CanCanCan'
46
+ end
47
+ ```
48
+
21
49
  Operation Basics
22
50
  ----------------
23
51
 
@@ -416,9 +444,6 @@ operations. Contexts can include the following data:
416
444
  automatically generated when calling a sub-op or triggering an op using an
417
445
  event (see chapter *Events* for more information on that).
418
446
 
419
- TODO: This may induce memory issues. Is keeping the operation's chain worth
420
- this trade-off?
421
-
422
447
  - URL options
423
448
 
424
449
  Rails uses a hash named `url_options` for generating URLs with correct prefix.
@@ -483,7 +508,7 @@ additional ones it's triggering:
483
508
  using `Operations::Group::Create`. *This is an example for sub-ops*.
484
509
 
485
510
  - `Operations::User::Create` creates a user. Whenever a user is created, another
486
- part of the application needs to generate a TODO for the admin to approve this
511
+ part of the application needs to generate a todo for the admin to approve this
487
512
  user. *This would be an example for hooks*.
488
513
 
489
514
  Hooks are pretty simple: Using the file `config/hookup.rb`, you can
@@ -712,8 +737,11 @@ Rails Ops offers multiple ways of disabling authorization:
712
737
  end
713
738
  ```
714
739
 
715
- TODO: Explain why this can be useful even if there are no authorize! calls
716
- in this operation.
740
+ If the operation is invoked using controller integration, this also disables
741
+ the controller-side check that makes sure an authorization method is called.
742
+
743
+ This does not disable authorization for any sub operations. See the next
744
+ section for information on how to disable sub operation authorization.
717
745
 
718
746
  - By invoking one or more operations in a `RailsOps.without_authorization`
719
747
  block:
@@ -769,7 +797,7 @@ inherit from {RailsOps::Operation::Model} (which in turn inherits from
769
797
  The key principle behind these model classes is to associate *one model class*
770
798
  and *one model instance* with a particular operation.
771
799
 
772
- ## Setting a model class
800
+ ### Setting a model class
773
801
 
774
802
  Using the static method `model`, you can assign a model class that is used in
775
803
  the scope of this operation.
@@ -789,7 +817,7 @@ class SomeOperation < RailsOps::Operation::Model
789
817
  model User do
790
818
  # This code only runs in a dynamically created subclass of `User` and does
791
819
  # not affect the original model class.
792
- attr_accessible :name
820
+ validates :name, presence: true
793
821
  end
794
822
  end
795
823
  ```
@@ -807,7 +835,7 @@ class SomeOperation < RailsOps::Operation::Model
807
835
  end
808
836
  ```
809
837
 
810
- ## Obtaining a model instance
838
+ ### Obtaining a model instance
811
839
 
812
840
  Model instances can be obtained using the *instance* method `model`, which is
813
841
  not to be confused with the *class* method of the same name. Other than the
@@ -836,7 +864,7 @@ If no cached instance is found, one is built using the instance method
836
864
  but only implemented in its subclasses. You can implement and override this
837
865
  method to your liking though.
838
866
 
839
- ## Loading models
867
+ ### Loading models
840
868
 
841
869
  Using the base operation class {RailsOps::Operation::Model::Load}, a model can
842
870
  be loaded. This is done by implementing the `build_model` mentioned above. In
@@ -866,7 +894,7 @@ op = Operations::User::Load.new(id: 5)
866
894
  op.model.id # => 5
867
895
  ```
868
896
 
869
- ### Specifying ID field
897
+ #### Specifying ID field
870
898
 
871
899
  Per default, the model instance is looked up using the field `id` and the ID
872
900
  obtained from the method params using `params[:id]`. However, you can customize
@@ -882,7 +910,7 @@ class Operations::User::Load < RailsOps::Operation::Model::Load
882
910
  end
883
911
  ```
884
912
 
885
- ### Locking
913
+ #### Locking
886
914
 
887
915
  In most cases when you load a model, you might want to lock the corresponding
888
916
  database record. RailsOps is configured to automatically perform this locking
@@ -899,7 +927,7 @@ class Operations::User::Load < RailsOps::Operation::Model::Load
899
927
  end
900
928
  ```
901
929
 
902
- ## Creating models
930
+ ### Creating models
903
931
 
904
932
  For creating models, you can use the base class
905
933
  {RailsOps::Operation::Model::Create}.
@@ -916,7 +944,7 @@ The `perform` method saves the record using `save!`.
916
944
  As this base class is very minimalistic, it is recommended to fully read and
917
945
  comprehend its source code.
918
946
 
919
- ## Updating models
947
+ ### Updating models
920
948
 
921
949
  For creating models, you can use the base class
922
950
  {RailsOps::Operation::Model::Update} which is an extension of the `Load` base
@@ -934,7 +962,7 @@ The `perform` method saves the record using `save!`.
934
962
  As this base class is very minimalistic, it is recommended to fully read and
935
963
  comprehend its source code.
936
964
 
937
- ## Destroying models
965
+ ### Destroying models
938
966
 
939
967
  For destroying models, you can use the base class
940
968
  {RailsOps::Operation::Model::Destroy} which is an extension of the `Load` base
@@ -946,7 +974,7 @@ destroys the model using its `destroy!` method.
946
974
  As this base class is very minimalistic, it is recommended to fully read and
947
975
  comprehend its source code.
948
976
 
949
- ## Parameter extraction for create and update
977
+ ### Parameter extraction for create and update
950
978
 
951
979
  As mentioned before, the `Create` and `Update` base classes provide an
952
980
  implementation of `build_model` that assigns parameters to a model.
@@ -955,12 +983,12 @@ The attributes are determined by the operation instance method
955
983
  `extract_attributes_from_params` - the name being self-explaining. See its
956
984
  source code for implementation details.
957
985
 
958
- ## Model authorization
986
+ ### Model authorization
959
987
 
960
988
  While you can use the standard `authorize!` method (see chapter *Authorization*)
961
989
  for authorizing models, RailsOps provides a more convenient integration.
962
990
 
963
- ### Basic authorization
991
+ #### Basic authorization
964
992
 
965
993
  Model authorization can be performed via the operation instance methods
966
994
  `authorize_model!` and `authorize_model_with_authorize_only!` (see chapter
@@ -976,7 +1004,7 @@ methods instead of the basic authorization methods for authorizing models.
976
1004
  If no model is given, the model authorization methods automatically obtain the
977
1005
  model from the instance method `model`.
978
1006
 
979
- ### Automatic authorization
1007
+ #### Automatic authorization
980
1008
 
981
1009
  All model operation classes provide the operation instance method
982
1010
  `model_authorization` which is automatically run at model instantiation (this is
@@ -1001,9 +1029,67 @@ end
1001
1029
  Note that using the different model base classes, this is already set to a
1002
1030
  sensible default. See the respective class' source code for details.
1003
1031
 
1004
- ## Model nesting
1032
+ ### Model nesting
1005
1033
 
1006
- TODO
1034
+ Using active record, multiple nested models can be saved at once by using
1035
+ `accepts_nested_attributes_for`. While this is generally supported by RailsOps,
1036
+ you may want to consider saving nested models using their own operation.
1037
+
1038
+ For this case, RailsOps' create and update model operations provide the method
1039
+ `nest_model_op`.
1040
+
1041
+ ```ruby
1042
+ class Operations::User::Create < RailsOps::Operation::Model::Create
1043
+ schema do
1044
+ opt :user do
1045
+ opt :name
1046
+ opt :group_attributes
1047
+ end
1048
+ end
1049
+
1050
+ model ::User
1051
+ nest_model_op :group, Operations::Group::Create
1052
+ end
1053
+
1054
+ class Operations::Group::Create < RailsOps::Operation::Model::Create
1055
+ schema :group do
1056
+ opt :name
1057
+ end
1058
+
1059
+ model ::Group
1060
+ nest_model_op :group, Operations::Group::Create
1061
+ end
1062
+ ```
1063
+
1064
+ In this example, the parent operation `Operations::User::Create` automatically
1065
+ instantiates a `Group::Create` operation and passes all the parameters to it
1066
+ that the parent operation received under `group_attributes`. The group is saved
1067
+ first. If this is successful, the user is saved.
1068
+
1069
+ Note that this feature only works with `belongs_to` associations with `autosave`
1070
+ set to `false` and is not compatible with `accepts_nested_attributes_for`:
1071
+
1072
+ ```ruby
1073
+ class User
1074
+ belongs_to :group, autosave: false
1075
+ end
1076
+ ```
1077
+
1078
+ #### Custom parameters
1079
+
1080
+ In the above examples, all `group_attributes` are automatically passed to the
1081
+ sub operation. To customize this further, provide a block to the `nest_model_op`
1082
+ method:
1083
+
1084
+ ```ruby
1085
+ nest_model_op :group, Operations::Group::Create do |params|
1086
+ params.merge(custom_override: :some_value)
1087
+ end
1088
+ ```
1089
+
1090
+ This block receives the params hash as it would be passed to the sub operation
1091
+ and allows to modify it. The block's return value is then passed to the
1092
+ sub-operation. Do not change the params inplace but instead return a new hash.
1007
1093
 
1008
1094
  Record extension and virtual records
1009
1095
  ------------------------------------
@@ -1013,7 +1099,6 @@ Transactions
1013
1099
  ------------
1014
1100
 
1015
1101
 
1016
-
1017
1102
  Controller Integration
1018
1103
  ----------------------
1019
1104
 
@@ -1021,7 +1106,7 @@ While RailsOps certainly does not have to be used from a controller, it
1021
1106
  provides a mixin which extends controller classes with functionality that lets
1022
1107
  you easily instantiate and run operations.
1023
1108
 
1024
- ## Installing
1109
+ ### Installing
1025
1110
 
1026
1111
  Controller integration is designed to be non-intrusive and therefore has to be
1027
1112
  installed manually. Add the following inclusion to the controllers in question
@@ -1033,7 +1118,7 @@ class ApplicationController
1033
1118
  end
1034
1119
  ```
1035
1120
 
1036
- ## Basic usage
1121
+ ### Basic usage
1037
1122
 
1038
1123
  The basic concept behind controller integration is to instantiate and
1039
1124
  potentially run a single operation per request. Most of this guide refers to
@@ -1051,7 +1136,7 @@ class SomeController < ApplicationController
1051
1136
  end
1052
1137
  ```
1053
1138
 
1054
- ## Separating instantiation and execution
1139
+ ### Separating instantiation and execution
1055
1140
 
1056
1141
  In the previous example, we instantiated and ran an operation in a single
1057
1142
  statement. While this might be feasible for some "fire-and-forget" controller
@@ -1099,18 +1184,18 @@ def update_username
1099
1184
  end
1100
1185
  ```
1101
1186
 
1102
- ## Checking for operations
1187
+ ### Checking for operations
1103
1188
 
1104
1189
  Using the method `op?`, you can check whether an operation has already been
1105
1190
  instantiated (using `op`).
1106
1191
 
1107
- ## Model shortcut
1192
+ ### Model shortcut
1108
1193
 
1109
1194
  RailsOps conveniently provides you with a `model` instance method, which is a
1110
1195
  shortcut for `op.model`. This is particularly useful since this is available as
1111
1196
  a view helper method as well, see next section.
1112
1197
 
1113
- ## View helper methods
1198
+ ### View helper methods
1114
1199
 
1115
1200
  The following controller methods are automatically provided as helper methods
1116
1201
  which can be used in views:
@@ -1126,7 +1211,7 @@ It is very common to use `model` for your forms:
1126
1211
  - # Form code goes here
1127
1212
  ```
1128
1213
 
1129
- ## Parameters
1214
+ ### Parameters
1130
1215
 
1131
1216
  As you've probably noticed in previous examples, we did not provide any
1132
1217
  parameters to the operation.
@@ -1154,7 +1239,7 @@ You can also combine these two approaches:
1154
1239
  op SomeOperation, some_param: op_params.slice(:some_param, :some_other_param)
1155
1240
  ```
1156
1241
 
1157
- ## Authorization ensuring
1242
+ ### Authorization ensuring
1158
1243
 
1159
1244
  For security reasons, RailsOps automatically checks after each action whether
1160
1245
  authorization has been performed. This is to avoid serving an action's response
@@ -1168,7 +1253,7 @@ Note that this check also doesn't apply if the corresponding operation uses
1168
1253
  `without_authorization` (see section *Disabling authorization* for more
1169
1254
  information on this).
1170
1255
 
1171
- ## Context
1256
+ ### Context
1172
1257
 
1173
1258
  When using the `op` method to instantiate an operation, a context is
1174
1259
  automatically created. The following fields are set automatically:
@@ -1179,7 +1264,7 @@ automatically created. The following fields are set automatically:
1179
1264
  - `session` (uses the `session` controller method)
1180
1265
  - `url_options` (uses the `url_options` controller method)
1181
1266
 
1182
- ## Multiple operations per request
1267
+ ### Multiple operations per request
1183
1268
 
1184
1269
  RailsOps does not currently support calling multiple operations in a single
1185
1270
  controller action out-of-the-box. You need to instantiate and run it manually.
@@ -1193,7 +1278,7 @@ Operation Inheritance
1193
1278
  Caveats
1194
1279
  -------
1195
1280
 
1196
- ## Eager loading in development mode
1281
+ ### Eager loading in development mode
1197
1282
 
1198
1283
  Eager loading operation classes containing models with nested models or
1199
1284
  operations can be very slow in performance. In production mode, the same process
@@ -1202,18 +1287,12 @@ exclude your operation classes (i.e. `app/operations`) in your
1202
1287
  `config.eager_load_paths` of `development.rb`. Make sure not to touch this
1203
1288
  setting in production mode though.
1204
1289
 
1205
- Open points
1206
- -----------
1207
-
1208
- ## Load model authorization
1290
+ Change log
1291
+ ----------
1209
1292
 
1210
- It is possible that we can eliminate the load model authorization functionality
1211
- entirely. Operations using the `Load` base class can authorize using `:read`,
1212
- while more specific operations can use `:update` or whatever. If we really need
1213
- to check for `:read` when updating an object, it can be implemented in the
1214
- ability class.
1293
+ ### 1.0.0.beta5
1215
1294
 
1216
- ## Change log
1295
+ * Fix #5 Measure for object_id ... not finished
1217
1296
 
1218
1297
  ### 1.0.0.beta4
1219
1298
 
@@ -1222,6 +1301,13 @@ ability class.
1222
1301
 
1223
1302
  * Start of change log.
1224
1303
 
1304
+ ## Contributors
1305
+
1306
+ This Gem is heavily inspired by the [trailblazer](http://trailblazer.to/) Gem
1307
+ which provides a wonderful, high-level architecture for Rails – beyond just
1308
+ operations. Be sure to check this out when trying to decide on an alternative
1309
+ Rails architecture.
1310
+
1225
1311
  ## Copyright
1226
1312
 
1227
1313
  Copyright (c) 2017 Sitrox. See `LICENSE` for further details.
data/Rakefile CHANGED
@@ -24,6 +24,7 @@ task :gemspec do
24
24
  spec.add_dependency 'minitest'
25
25
  spec.add_dependency 'activesupport'
26
26
  spec.add_dependency 'activerecord'
27
+ spec.add_dependency 'activejob'
27
28
  spec.add_dependency 'schemacop', '~> 2.0'
28
29
  end
29
30
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0.beta4
1
+ 1.0.0.beta5
data/lib/rails_ops.rb CHANGED
@@ -58,7 +58,7 @@ require 'rails_ops/configuration.rb'
58
58
  require 'rails_ops/context.rb'
59
59
  require 'rails_ops/controller_mixin.rb'
60
60
  require 'rails_ops/exceptions.rb'
61
- require 'rails_ops/hooked_job.rb'
61
+ require 'rails_ops/hooked_job.rb' if defined?(ActiveJob)
62
62
  require 'rails_ops/hookup.rb'
63
63
  require 'rails_ops/hookup/dsl.rb'
64
64
  require 'rails_ops/hookup/dsl_validator.rb'
@@ -91,6 +91,6 @@ require 'rails_ops/operation/model/destroy.rb'
91
91
  require 'rails_ops/operation/model/update.rb'
92
92
  require 'rails_ops/profiler.rb'
93
93
  require 'rails_ops/profiler/node.rb'
94
- require 'rails_ops/railtie.rb'
94
+ require 'rails_ops/railtie.rb' if defined?(Rails)
95
95
  require 'rails_ops/scoped_env.rb'
96
96
  require 'rails_ops/virtual_model.rb'
@@ -15,8 +15,14 @@ module RailsOps
15
15
  message += " (#{profile.t_self_ms.round(1)}ms / #{profile.t_kids_ms.round(1)}ms)"
16
16
  profile.free
17
17
 
18
- message = color(message, YELLOW, true)
19
- message += color(" #{op.class.name}", YELLOW, false)
18
+ if profile.erroneous?
19
+ message += ' (failed)'
20
+ end
21
+
22
+ color = profile.erroneous? ? RED : YELLOW
23
+
24
+ message = color(message, color, true)
25
+ message += color(" #{op.class.name}", color, false)
20
26
 
21
27
  debug " #{message}"
22
28
  end
@@ -3,10 +3,15 @@ module RailsOps
3
3
  def self.profile(object_id, description = nil, &_block)
4
4
  node = tstore_nodes[object_id] = ::RailsOps::Profiler::Node.new(object_id, description, tstore_current_parent)
5
5
  self.tstore_current_parent = node
6
- res = yield
7
- self.tstore_current_parent = node.parent
8
- node.finish_measure
9
- res
6
+ begin
7
+ res = yield
8
+ rescue
9
+ node.erroneous!
10
+ ensure
11
+ self.tstore_current_parent = node.parent
12
+ node.finish_measure
13
+ end
14
+ return res
10
15
  end
11
16
 
12
17
  def self.time(descr = nil, &_block)
@@ -6,6 +6,7 @@ module RailsOps
6
6
  @parent = parent
7
7
  parent&.add_child(self)
8
8
  @children = []
9
+ @erroneous = false
9
10
  @t_start = Time.now
10
11
  end
11
12
 
@@ -16,6 +17,14 @@ module RailsOps
16
17
  @t_stop = Time.now
17
18
  end
18
19
 
20
+ def erroneous!
21
+ @erroneous = true
22
+ end
23
+
24
+ def erroneous?
25
+ @erroneous
26
+ end
27
+
19
28
  def t_self
20
29
  t_total - t_kids
21
30
  end
@@ -25,7 +34,7 @@ module RailsOps
25
34
  end
26
35
 
27
36
  def t_total
28
- fail "Measure for object_id #{@object_id} (#{@description}) is not finished." unless @t_stop
37
+ return nil unless @t_stop
29
38
  (@t_stop - @t_start).to_f
30
39
  end
31
40
 
data/rails_ops.gemspec CHANGED
@@ -1,18 +1,18 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: rails_ops 1.0.0.beta4 ruby lib
2
+ # stub: rails_ops 1.0.0.beta5 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "rails_ops".freeze
6
- s.version = "1.0.0.beta4"
6
+ s.version = "1.0.0.beta5"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Sitrox".freeze]
11
- s.date = "2017-11-16"
12
- s.files = [".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, ".travis.yml".freeze, "Gemfile".freeze, "LICENSE.txt".freeze, "README.md".freeze, "RUBY_VERSION".freeze, "Rakefile".freeze, "VERSION".freeze, "lib/rails_ops.rb".freeze, "lib/rails_ops/authorization_backend/abstract.rb".freeze, "lib/rails_ops/authorization_backend/can_can_can.rb".freeze, "lib/rails_ops/configuration.rb".freeze, "lib/rails_ops/context.rb".freeze, "lib/rails_ops/controller_mixin.rb".freeze, "lib/rails_ops/exceptions.rb".freeze, "lib/rails_ops/hooked_job.rb".freeze, "lib/rails_ops/hookup.rb".freeze, "lib/rails_ops/hookup/dsl.rb".freeze, "lib/rails_ops/hookup/dsl_validator.rb".freeze, "lib/rails_ops/hookup/hook.rb".freeze, "lib/rails_ops/log_subscriber.rb".freeze, "lib/rails_ops/mixins.rb".freeze, "lib/rails_ops/mixins/authorization.rb".freeze, "lib/rails_ops/mixins/log_settings.rb".freeze, "lib/rails_ops/mixins/model.rb".freeze, "lib/rails_ops/mixins/model/authorization.rb".freeze, "lib/rails_ops/mixins/model/nesting.rb".freeze, "lib/rails_ops/mixins/policies.rb".freeze, "lib/rails_ops/mixins/require_context.rb".freeze, "lib/rails_ops/mixins/routes.rb".freeze, "lib/rails_ops/mixins/schema_validation.rb".freeze, "lib/rails_ops/mixins/sub_ops.rb".freeze, "lib/rails_ops/model_casting.rb".freeze, "lib/rails_ops/model_mixins.rb".freeze, "lib/rails_ops/model_mixins/ar_extension.rb".freeze, "lib/rails_ops/model_mixins/parent_op.rb".freeze, "lib/rails_ops/model_mixins/protected_attributes.rb".freeze, "lib/rails_ops/model_mixins/virtual_attributes.rb".freeze, "lib/rails_ops/model_mixins/virtual_attributes/virtual_column_wrapper.rb".freeze, "lib/rails_ops/model_mixins/virtual_has_one.rb".freeze, "lib/rails_ops/operation.rb".freeze, "lib/rails_ops/operation/model.rb".freeze, "lib/rails_ops/operation/model/create.rb".freeze, "lib/rails_ops/operation/model/destroy.rb".freeze, "lib/rails_ops/operation/model/load.rb".freeze, "lib/rails_ops/operation/model/update.rb".freeze, "lib/rails_ops/patches/active_type_patch.rb".freeze, "lib/rails_ops/profiler.rb".freeze, "lib/rails_ops/profiler/node.rb".freeze, "lib/rails_ops/railtie.rb".freeze, "lib/rails_ops/scoped_env.rb".freeze, "lib/rails_ops/virtual_model.rb".freeze, "rails_ops.gemspec".freeze, "test/test_helper.rb".freeze]
11
+ s.date = "2017-11-27"
12
+ s.files = [".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, ".travis.yml".freeze, "Gemfile".freeze, "LICENSE.txt".freeze, "README.md".freeze, "RUBY_VERSION".freeze, "Rakefile".freeze, "VERSION".freeze, "lib/rails_ops.rb".freeze, "lib/rails_ops/authorization_backend/abstract.rb".freeze, "lib/rails_ops/authorization_backend/can_can_can.rb".freeze, "lib/rails_ops/configuration.rb".freeze, "lib/rails_ops/context.rb".freeze, "lib/rails_ops/controller_mixin.rb".freeze, "lib/rails_ops/exceptions.rb".freeze, "lib/rails_ops/hooked_job.rb".freeze, "lib/rails_ops/hookup.rb".freeze, "lib/rails_ops/hookup/dsl.rb".freeze, "lib/rails_ops/hookup/dsl_validator.rb".freeze, "lib/rails_ops/hookup/hook.rb".freeze, "lib/rails_ops/log_subscriber.rb".freeze, "lib/rails_ops/mixins.rb".freeze, "lib/rails_ops/mixins/authorization.rb".freeze, "lib/rails_ops/mixins/log_settings.rb".freeze, "lib/rails_ops/mixins/model.rb".freeze, "lib/rails_ops/mixins/model/authorization.rb".freeze, "lib/rails_ops/mixins/model/nesting.rb".freeze, "lib/rails_ops/mixins/policies.rb".freeze, "lib/rails_ops/mixins/require_context.rb".freeze, "lib/rails_ops/mixins/routes.rb".freeze, "lib/rails_ops/mixins/schema_validation.rb".freeze, "lib/rails_ops/mixins/sub_ops.rb".freeze, "lib/rails_ops/model_casting.rb".freeze, "lib/rails_ops/model_mixins.rb".freeze, "lib/rails_ops/model_mixins/ar_extension.rb".freeze, "lib/rails_ops/model_mixins/parent_op.rb".freeze, "lib/rails_ops/model_mixins/protected_attributes.rb".freeze, "lib/rails_ops/model_mixins/virtual_attributes.rb".freeze, "lib/rails_ops/model_mixins/virtual_attributes/virtual_column_wrapper.rb".freeze, "lib/rails_ops/model_mixins/virtual_has_one.rb".freeze, "lib/rails_ops/operation.rb".freeze, "lib/rails_ops/operation/model.rb".freeze, "lib/rails_ops/operation/model/create.rb".freeze, "lib/rails_ops/operation/model/destroy.rb".freeze, "lib/rails_ops/operation/model/load.rb".freeze, "lib/rails_ops/operation/model/update.rb".freeze, "lib/rails_ops/patches/active_type_patch.rb".freeze, "lib/rails_ops/profiler.rb".freeze, "lib/rails_ops/profiler/node.rb".freeze, "lib/rails_ops/railtie.rb".freeze, "lib/rails_ops/scoped_env.rb".freeze, "lib/rails_ops/virtual_model.rb".freeze, "rails_ops.gemspec".freeze, "test/db/models.rb".freeze, "test/db/schema.rb".freeze, "test/rails_ops/operation/example_test.rb".freeze, "test/test_helper.rb".freeze]
13
13
  s.rubygems_version = "2.6.6".freeze
14
14
  s.summary = "An operations service layer for rails projects.".freeze
15
- s.test_files = ["test/test_helper.rb".freeze]
15
+ s.test_files = ["test/db/models.rb".freeze, "test/db/schema.rb".freeze, "test/rails_ops/operation/example_test.rb".freeze, "test/test_helper.rb".freeze]
16
16
 
17
17
  if s.respond_to? :specification_version then
18
18
  s.specification_version = 4
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
28
28
  s.add_runtime_dependency(%q<minitest>.freeze, [">= 0"])
29
29
  s.add_runtime_dependency(%q<activesupport>.freeze, [">= 0"])
30
30
  s.add_runtime_dependency(%q<activerecord>.freeze, [">= 0"])
31
+ s.add_runtime_dependency(%q<activejob>.freeze, [">= 0"])
31
32
  s.add_runtime_dependency(%q<schemacop>.freeze, ["~> 2.0"])
32
33
  else
33
34
  s.add_dependency(%q<bundler>.freeze, ["~> 1.3"])
@@ -40,6 +41,7 @@ Gem::Specification.new do |s|
40
41
  s.add_dependency(%q<minitest>.freeze, [">= 0"])
41
42
  s.add_dependency(%q<activesupport>.freeze, [">= 0"])
42
43
  s.add_dependency(%q<activerecord>.freeze, [">= 0"])
44
+ s.add_dependency(%q<activejob>.freeze, [">= 0"])
43
45
  s.add_dependency(%q<schemacop>.freeze, ["~> 2.0"])
44
46
  end
45
47
  else
@@ -53,6 +55,7 @@ Gem::Specification.new do |s|
53
55
  s.add_dependency(%q<minitest>.freeze, [">= 0"])
54
56
  s.add_dependency(%q<activesupport>.freeze, [">= 0"])
55
57
  s.add_dependency(%q<activerecord>.freeze, [">= 0"])
58
+ s.add_dependency(%q<activejob>.freeze, [">= 0"])
56
59
  s.add_dependency(%q<schemacop>.freeze, ["~> 2.0"])
57
60
  end
58
61
  end
data/test/db/models.rb ADDED
@@ -0,0 +1,2 @@
1
+ class Group < ActiveRecord::Base
2
+ end
data/test/db/schema.rb ADDED
@@ -0,0 +1,9 @@
1
+ ActiveRecord::Schema.define do
2
+ self.verbose = false
3
+
4
+ create_table :groups, force: true do |t|
5
+ t.string :name
6
+ t.string :color
7
+ t.timestamps
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ require 'test_helper'
2
+
3
+ class RailsOps::Operation::ExampleTest < Minitest::Test
4
+ include TestHelper
5
+
6
+ def setup
7
+ self.class.setup_db
8
+ self.class.setup_base_data
9
+ end
10
+
11
+ def test_group_create
12
+ Group.create name: 'Test', color: 'blue'
13
+ end
14
+ end
data/test/test_helper.rb CHANGED
@@ -1,3 +1,19 @@
1
1
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
- require 'rails_ops'
2
+ require 'active_record'
3
3
  require 'minitest/autorun'
4
+ require 'rails_ops'
5
+ require 'db/models'
6
+
7
+ ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'
8
+
9
+ module TestHelper
10
+ extend ActiveSupport::Concern
11
+
12
+ module ClassMethods
13
+ def setup_db
14
+ load File.dirname(__FILE__) + '/db/schema.rb'
15
+ end
16
+
17
+ def setup_base_data; end
18
+ end
19
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_ops
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta4
4
+ version: 1.0.0.beta5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sitrox
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-16 00:00:00.000000000 Z
11
+ date: 2017-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: activejob
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: schemacop
155
169
  requirement: !ruby/object:Gem::Requirement
@@ -225,6 +239,9 @@ files:
225
239
  - lib/rails_ops/scoped_env.rb
226
240
  - lib/rails_ops/virtual_model.rb
227
241
  - rails_ops.gemspec
242
+ - test/db/models.rb
243
+ - test/db/schema.rb
244
+ - test/rails_ops/operation/example_test.rb
228
245
  - test/test_helper.rb
229
246
  homepage:
230
247
  licenses: []
@@ -250,4 +267,7 @@ signing_key:
250
267
  specification_version: 4
251
268
  summary: An operations service layer for rails projects.
252
269
  test_files:
270
+ - test/db/models.rb
271
+ - test/db/schema.rb
272
+ - test/rails_ops/operation/example_test.rb
253
273
  - test/test_helper.rb