parascope 1.2.0 → 1.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 +4 -4
- data/README.md +31 -3
- data/bin/console +3 -1
- data/lib/parascope.rb +2 -0
- data/lib/parascope/query.rb +21 -6
- data/lib/parascope/query/api_methods.rb +2 -2
- data/lib/parascope/version.rb +1 -1
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 3066d6e82e5f23716dd07cea4c449017e70bbd9d
         | 
| 4 | 
            +
              data.tar.gz: 56028229436dde9aeb953c6d2a8c3422481a92a4
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 3067309bd1f430f5aa295a76302b4cd16e23cfdc2a35ec0fccaa14f1a71df6d07663e6adbc38a90222de450c5d35df67b54f48391deb9e90580f2a0728029b93
         | 
| 7 | 
            +
              data.tar.gz: 6ac678b8533decc7fabc77179d534f06e1e1c63060025572875bdfb23ca268ca90d1f36060f74f2061999044328d38f470eba184cedbae2c26a0cfc3d67682ff
         | 
    
        data/README.md
    CHANGED
    
    | @@ -163,9 +163,10 @@ sifter :paginated do | |
| 163 163 | 
             
            end
         | 
| 164 164 | 
             
            ```
         | 
| 165 165 |  | 
| 166 | 
            -
            - `guard(&block)` defines a guard instance method block (see instance methods
         | 
| 166 | 
            +
            - `guard(message = nil, &block)` defines a guard instance method block (see instance methods
         | 
| 167 167 | 
             
              bellow). All such blocks are executed before query object resolves scope via
         | 
| 168 | 
            -
              `resolve_scope` method.
         | 
| 168 | 
            +
              `resolve_scope` method. Optional `message` may be supplied to provide more informative
         | 
| 169 | 
            +
              error message.
         | 
| 169 170 |  | 
| 170 171 | 
             
            *Examples:*
         | 
| 171 172 |  | 
| @@ -173,12 +174,39 @@ end | |
| 173 174 | 
             
            sift_by(:sort_col, :sort_dir) do |scol, sdir|
         | 
| 174 175 | 
             
              # will raise Parascope::GuardViolationError on scope resolution if
         | 
| 175 176 | 
             
              # params[:sort_dir] is not 'asc' or 'desc'
         | 
| 176 | 
            -
              guard  | 
| 177 | 
            +
              guard(':sort_dir should be "asc" or "desc"') do
         | 
| 178 | 
            +
                sdir.downcase.in?(%w(asc desc))
         | 
| 179 | 
            +
              end
         | 
| 177 180 |  | 
| 178 181 | 
             
              base_scope { |scope| scope.order(scol => sdir) }
         | 
| 179 182 | 
             
            end
         | 
| 180 183 | 
             
            ```
         | 
| 181 184 |  | 
| 185 | 
            +
            - `raise_on_guard_violation(value)` allows to specify whether or not exception should be raised
         | 
| 186 | 
            +
              whenever any guard block is violated during scope resolution. When set to `false`, in case
         | 
| 187 | 
            +
              of any violation, `resolved_scope` will return `nil`, and query will have `violation` property
         | 
| 188 | 
            +
              set with value corresponding to the message of violated block. Default option value is `true`.
         | 
| 189 | 
            +
             | 
| 190 | 
            +
            *Examples:*
         | 
| 191 | 
            +
             | 
| 192 | 
            +
            ```ruby
         | 
| 193 | 
            +
            raise_on_guard_violation false
         | 
| 194 | 
            +
             | 
| 195 | 
            +
            sift_by(:sort_col, :sort_dir) do |scol, sdir|
         | 
| 196 | 
            +
              guard(':sort_dir should be "asc" or "desc"') do
         | 
| 197 | 
            +
                sdir.downcase.in?(%w(asc desc))
         | 
| 198 | 
            +
              end
         | 
| 199 | 
            +
             | 
| 200 | 
            +
              base_scope { |scope| scope.order(scol => sdir) }
         | 
| 201 | 
            +
            end
         | 
| 202 | 
            +
            ```
         | 
| 203 | 
            +
             | 
| 204 | 
            +
            ```ruby
         | 
| 205 | 
            +
            query = UsersQuery.new(sort_col: 'id', sort_dir: 'there')
         | 
| 206 | 
            +
            query.resolved_scope # => nil
         | 
| 207 | 
            +
            query.violation # => ":sort_dir should be \"asc\" or \"desc\""
         | 
| 208 | 
            +
            ```
         | 
| 209 | 
            +
             | 
| 182 210 | 
             
            - `build(scope: nil, **attributes)` initializes a query with empty params. Handy when
         | 
| 183 211 | 
             
              query depends only passed attributes and internal logic. Also useful in specs.
         | 
| 184 212 |  | 
    
        data/bin/console
    CHANGED
    
    | @@ -6,12 +6,14 @@ require "parascope" | |
| 6 6 | 
             
            require 'ostruct'
         | 
| 7 7 |  | 
| 8 8 | 
             
            class Query < Parascope::Query
         | 
| 9 | 
            +
              raise_on_guard_violation false
         | 
| 10 | 
            +
             | 
| 9 11 | 
             
              defaults barbak: 'barbak'
         | 
| 10 12 |  | 
| 11 13 | 
             
              base_scope { OpenStruct.new }
         | 
| 12 14 |  | 
| 13 15 | 
             
              query_by :foo do |foo|
         | 
| 14 | 
            -
                guard { foo == 'foo' }
         | 
| 16 | 
            +
                guard('wrong value for :foo param. try "foo"') { foo == 'foo' }
         | 
| 15 17 |  | 
| 16 18 | 
             
                scope.tap{ scope.foo = foo }
         | 
| 17 19 | 
             
              end
         | 
    
        data/lib/parascope.rb
    CHANGED
    
    
    
        data/lib/parascope/query.rb
    CHANGED
    
    | @@ -7,9 +7,10 @@ module Parascope | |
| 7 7 |  | 
| 8 8 | 
             
                extend ApiMethods
         | 
| 9 9 |  | 
| 10 | 
            -
                attr_reader :params
         | 
| 10 | 
            +
                attr_reader :params, :violation
         | 
| 11 11 |  | 
| 12 12 | 
             
                def self.inherited(subclass)
         | 
| 13 | 
            +
                  subclass.raise_on_guard_violation raise_on_guard_violation?
         | 
| 13 14 | 
             
                  subclass.query_blocks.replace query_blocks.dup
         | 
| 14 15 | 
             
                  subclass.sift_blocks.replace sift_blocks.dup
         | 
| 15 16 | 
             
                  subclass.guard_blocks.replace guard_blocks.dup
         | 
| @@ -21,6 +22,14 @@ module Parascope | |
| 21 22 | 
             
                  new({}, **attrs)
         | 
| 22 23 | 
             
                end
         | 
| 23 24 |  | 
| 25 | 
            +
                def self.raise_on_guard_violation(value)
         | 
| 26 | 
            +
                  @raise_on_guard_violation = !!value
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                def self.raise_on_guard_violation?
         | 
| 30 | 
            +
                  @raise_on_guard_violation
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 24 33 | 
             
                def initialize(params, scope: nil, dataset: nil, **attrs)
         | 
| 25 34 | 
             
                  @params = Hashie::Mash.new(klass.defaults).merge(params || {})
         | 
| 26 35 | 
             
                  @scope  = scope || dataset unless scope.nil? && dataset.nil?
         | 
| @@ -51,10 +60,14 @@ module Parascope | |
| 51 60 | 
             
                alias_method :base_dataset, :base_scope
         | 
| 52 61 |  | 
| 53 62 | 
             
                def resolved_scope(*args)
         | 
| 63 | 
            +
                  @violation = nil
         | 
| 54 64 | 
             
                  arg_params = args.pop if args.last.is_a?(Hash)
         | 
| 55 65 | 
             
                  return sifted_instance.resolved_scope! if arg_params.nil? && args.empty?
         | 
| 56 66 |  | 
| 57 67 | 
             
                  clone_with_params(trues(args).merge(arg_params || {})).resolved_scope
         | 
| 68 | 
            +
                rescue GuardViolationError => error
         | 
| 69 | 
            +
                  @violation = error.message
         | 
| 70 | 
            +
                  raise if self.class.raise_on_guard_violation?
         | 
| 58 71 | 
             
                end
         | 
| 59 72 | 
             
                alias_method :resolved_dataset, :resolved_scope
         | 
| 60 73 | 
             
                alias_method :resolve, :resolved_scope
         | 
| @@ -138,13 +151,15 @@ module Parascope | |
| 138 151 | 
             
                private
         | 
| 139 152 |  | 
| 140 153 | 
             
                def guard_all
         | 
| 141 | 
            -
                  klass.guard_blocks.each{ |block| guard(&block) }
         | 
| 154 | 
            +
                  klass.guard_blocks.each{ |message, block| guard(message, &block) }
         | 
| 142 155 | 
             
                end
         | 
| 143 156 |  | 
| 144 | 
            -
                def guard(&block)
         | 
| 145 | 
            -
                   | 
| 146 | 
            -
             | 
| 147 | 
            -
                   | 
| 157 | 
            +
                def guard(message = nil, &block)
         | 
| 158 | 
            +
                  return if instance_exec(&block)
         | 
| 159 | 
            +
             | 
| 160 | 
            +
                  violation = message || "guard block violated on #{block.source_location.join(':')}"
         | 
| 161 | 
            +
             | 
| 162 | 
            +
                  fail GuardViolationError, violation
         | 
| 148 163 | 
             
                end
         | 
| 149 164 |  | 
| 150 165 | 
             
                def sifted_instance_for(blocks)
         | 
    
        data/lib/parascope/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: parascope
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.3.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Artem Kuzko
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2019-02-24 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: hashie
         |