json-exporter 0.2.1
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 +7 -0
- data/.version +1 -0
- data/lib/json-exporter.rb +114 -0
- metadata +58 -0
    
        checksums.yaml
    ADDED
    
    | @@ -0,0 +1,7 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            SHA256:
         | 
| 3 | 
            +
              metadata.gz: 5a70e5a7d517a7206c4eb0b82c004ee44a15b3439aa4cd08e90fd54e9520513c
         | 
| 4 | 
            +
              data.tar.gz: 4ffb3b63175ae577ea981d80cfb3b2307895f1483e9f11061b09263385c79b7e
         | 
| 5 | 
            +
            SHA512:
         | 
| 6 | 
            +
              metadata.gz: 4fdcd23d3974377ff752b7a4b7406ff3f4b1c65b3f1f0f57dc0c0067bda08620ecab0e37aed7aef9632ab633ddeff60e290a56bb7f17bb04cef32a030ad2c4b6
         | 
| 7 | 
            +
              data.tar.gz: 92c4df477e3bc5ae99938582f9a6ae187bde291c827d7d16d1469dd6b0628f650432b00e101a61eab457a40fce562a228b43a242845e9c9de7eb6836a21267d9
         | 
    
        data/.version
    ADDED
    
    | @@ -0,0 +1 @@ | |
| 1 | 
            +
            0.2.1
         | 
| @@ -0,0 +1,114 @@ | |
| 1 | 
            +
            require 'hash_wia'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class JsonExporter
         | 
| 4 | 
            +
              EXPORTERS ||= {
         | 
| 5 | 
            +
                __filter: proc {}
         | 
| 6 | 
            +
              }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              attr_accessor :response, :user, :model, :version
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              class << self
         | 
| 11 | 
            +
                def define name, opts={}, &block
         | 
| 12 | 
            +
                  version = opts.delete(:version) || opts.delete(:v) || 1
         | 
| 13 | 
            +
                  EXPORTERS[version] ||= {}
         | 
| 14 | 
            +
                  EXPORTERS[version][name.to_s.classify] = block
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def export name, opts={}
         | 
| 18 | 
            +
                  new(name, opts).render
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                def filter &block
         | 
| 22 | 
            +
                  EXPORTERS[:__filter] = block
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              ###
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              def initialize model, opts={}
         | 
| 29 | 
            +
                if model.is_a?(String) || model.is_a?(Symbol)
         | 
| 30 | 
            +
                  raise ArgumentError, 'model argument is not model instance (it is %s)' % model.class
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                unless opts.is_a?(Hash)
         | 
| 34 | 
            +
                  raise ArgumentError, 'JsonExporter opts is not a hash'
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                opts[:version]       ||= opts.delete(:v) || 1
         | 
| 38 | 
            +
                opts[:depth]         ||= 2 # 2 is default depth
         | 
| 39 | 
            +
                opts[:current_depth] ||= 0
         | 
| 40 | 
            +
                opts[:current_depth] += 1
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                unallowed = opts.keys - %i(user version depth current_depth exporter)
         | 
| 43 | 
            +
                raise ArgumentError, 'Unallowed key JsonExporter option found: %s' % unallowed.first if unallowed.first
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                @model    = model
         | 
| 46 | 
            +
                @version  = opts[:version]
         | 
| 47 | 
            +
                @user     = opts[:user]
         | 
| 48 | 
            +
                @opts     = opts
         | 
| 49 | 
            +
                @block    = _find_exporter
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                @response = {}.to_hwia
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
              def render
         | 
| 55 | 
            +
                instance_exec &@block
         | 
| 56 | 
            +
                instance_exec &EXPORTERS[:__filter]
         | 
| 57 | 
            +
                @response
         | 
| 58 | 
            +
              end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
              private
         | 
| 61 | 
            +
             | 
| 62 | 
            +
              # export object
         | 
| 63 | 
            +
              def export name
         | 
| 64 | 
            +
                return if @opts[:current_depth] > @opts[:depth]
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                if name.is_a?(Symbol)
         | 
| 67 | 
            +
                  name, cmodel = name, @model.send(name)
         | 
| 68 | 
            +
                else
         | 
| 69 | 
            +
                  name, cmodel = name.class.to_s.underscore.to_sym, name
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                @response[name] =
         | 
| 73 | 
            +
                  if [Array].include?(cmodel.class)
         | 
| 74 | 
            +
                    cmodel
         | 
| 75 | 
            +
                  else
         | 
| 76 | 
            +
                    JsonExporter.export(cmodel, @opts)
         | 
| 77 | 
            +
                  end
         | 
| 78 | 
            +
              end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
              # add property to exporter
         | 
| 81 | 
            +
              def property name, data=:_undefined
         | 
| 82 | 
            +
                if block_given?
         | 
| 83 | 
            +
                  data = yield
         | 
| 84 | 
            +
                elsif data == :_undefined
         | 
| 85 | 
            +
                  data = @model.send(name)
         | 
| 86 | 
            +
                end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                @response[name] = data unless data.nil?
         | 
| 89 | 
            +
              end
         | 
| 90 | 
            +
              alias :prop :property
         | 
| 91 | 
            +
             | 
| 92 | 
            +
              # copy calls from lesser version of the same exporter
         | 
| 93 | 
            +
              def copy version=nil
         | 
| 94 | 
            +
                version ||= @opts[:version] - 1
         | 
| 95 | 
            +
                exporter = _find_exporter version
         | 
| 96 | 
            +
                instance_exec &exporter
         | 
| 97 | 
            +
              end
         | 
| 98 | 
            +
             | 
| 99 | 
            +
              # finds versioned exporter
         | 
| 100 | 
            +
              def _find_exporter version=nil
         | 
| 101 | 
            +
                version  ||= @version
         | 
| 102 | 
            +
                exporter   = @opts.delete(:exporter) || model.class
         | 
| 103 | 
            +
                @exporter  = exporter.to_s.classify
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                for num in version.downto(1).to_a
         | 
| 106 | 
            +
                  if block = EXPORTERS.dig(num, @exporter)
         | 
| 107 | 
            +
                    return block
         | 
| 108 | 
            +
                  end
         | 
| 109 | 
            +
                end
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                raise('Exporter "%s" (:%s) not found' % [exporter, exporter.to_s.underscore])
         | 
| 112 | 
            +
              end
         | 
| 113 | 
            +
            end
         | 
| 114 | 
            +
             | 
    
        metadata
    ADDED
    
    | @@ -0,0 +1,58 @@ | |
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 | 
            +
            name: json-exporter
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.2.1
         | 
| 5 | 
            +
            platform: ruby
         | 
| 6 | 
            +
            authors:
         | 
| 7 | 
            +
            - Dino Reic
         | 
| 8 | 
            +
            autorequire: 
         | 
| 9 | 
            +
            bindir: bin
         | 
| 10 | 
            +
            cert_chain: []
         | 
| 11 | 
            +
            date: 2020-08-31 00:00:00.000000000 Z
         | 
| 12 | 
            +
            dependencies:
         | 
| 13 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            +
              name: hash_wia
         | 
| 15 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 | 
            +
                requirements:
         | 
| 17 | 
            +
                - - ">="
         | 
| 18 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            +
                    version: '0'
         | 
| 20 | 
            +
              type: :runtime
         | 
| 21 | 
            +
              prerelease: false
         | 
| 22 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 | 
            +
                requirements:
         | 
| 24 | 
            +
                - - ">="
         | 
| 25 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            +
                    version: '0'
         | 
| 27 | 
            +
            description: Fast ruby object JSON exporter, easy to use and extend
         | 
| 28 | 
            +
            email: reic.dino@gmail.com
         | 
| 29 | 
            +
            executables: []
         | 
| 30 | 
            +
            extensions: []
         | 
| 31 | 
            +
            extra_rdoc_files: []
         | 
| 32 | 
            +
            files:
         | 
| 33 | 
            +
            - "./.version"
         | 
| 34 | 
            +
            - "./lib/json-exporter.rb"
         | 
| 35 | 
            +
            homepage: https://github.com/dux/json-exporter
         | 
| 36 | 
            +
            licenses:
         | 
| 37 | 
            +
            - MIT
         | 
| 38 | 
            +
            metadata: {}
         | 
| 39 | 
            +
            post_install_message: 
         | 
| 40 | 
            +
            rdoc_options: []
         | 
| 41 | 
            +
            require_paths:
         | 
| 42 | 
            +
            - lib
         | 
| 43 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 44 | 
            +
              requirements:
         | 
| 45 | 
            +
              - - ">="
         | 
| 46 | 
            +
                - !ruby/object:Gem::Version
         | 
| 47 | 
            +
                  version: '0'
         | 
| 48 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 49 | 
            +
              requirements:
         | 
| 50 | 
            +
              - - ">="
         | 
| 51 | 
            +
                - !ruby/object:Gem::Version
         | 
| 52 | 
            +
                  version: '0'
         | 
| 53 | 
            +
            requirements: []
         | 
| 54 | 
            +
            rubygems_version: 3.0.6
         | 
| 55 | 
            +
            signing_key: 
         | 
| 56 | 
            +
            specification_version: 4
         | 
| 57 | 
            +
            summary: Fast, simple & powerful object exporter
         | 
| 58 | 
            +
            test_files: []
         |