blueprinter 0.21.0 → 0.22.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/CHANGELOG.md +3 -0
- data/lib/blueprinter/version.rb +1 -1
- data/lib/generators/blueprinter/blueprint_generator.rb +127 -0
- data/lib/generators/blueprinter/templates/blueprint.rb +14 -0
- metadata +18 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 335ed3cf4448c0972904b81679e8e95304ab075064c1022555062b8eb07eaf12
         | 
| 4 | 
            +
              data.tar.gz: fd442388bb18481015b4ae8ed79ca9b79b9a34f6eef6f5b31eb9ef473c458287
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 6855988c4693065d2620a19995f326718fd14796b0ec856b1ace0d5e91068959c72ada4788881e4b7bc2fbe587f56cf146dba06817431feaa6fb7d487d2d1eba
         | 
| 7 | 
            +
              data.tar.gz: 4aef0b54eea76568616e860863d782caced131399cdd36bdec2874f5b701b139517367556fe880f5041b7acd4fe6619eba79f8c7180c8fe8b31f09bd279cdc5d
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,3 +1,6 @@ | |
| 1 | 
            +
            ## 0.22.0  - 2019/12/26
         | 
| 2 | 
            +
            * 🚀 [FEATURE] Add rails generators. See `rails g blueprinter:blueprint --help` for usage. Introduced in [#176](https://github.com/procore/blueprinter/pull/176) by [@wlkrw](https://github.com/wlkrw).
         | 
| 3 | 
            +
             | 
| 1 4 | 
             
            ## 0.21.0  - 2019/12/19
         | 
| 2 5 | 
             
            * 🚀 [FEATURE] Ability to specify `default_if` field/association option for more control on when the default value is applied. [191](https://github.com/procore/blueprinter/pull/191). Thanks to [@mcclayton](https://github.com/mcclayton).
         | 
| 3 6 |  | 
    
        data/lib/blueprinter/version.rb
    CHANGED
    
    
| @@ -0,0 +1,127 @@ | |
| 1 | 
            +
            module Blueprinter
         | 
| 2 | 
            +
              module Generators
         | 
| 3 | 
            +
                class BlueprintGenerator < ::Rails::Generators::NamedBase
         | 
| 4 | 
            +
                  desc "Generates blueprint for ActiveRecord model with the given NAME."
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  attr_accessor :options
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  source_root File.expand_path("../templates", __FILE__)
         | 
| 9 | 
            +
             | 
| 10 | 
            +
             | 
| 11 | 
            +
             | 
| 12 | 
            +
                  class_option :blueprints_dir, default: "app/blueprints", desc: "path to new blueprint", aliases: "-d"
         | 
| 13 | 
            +
             | 
| 14 | 
            +
             | 
| 15 | 
            +
             | 
| 16 | 
            +
                  class_option :identifier, default: nil, desc: "Add an identifer to the generated blueprint, either uses :id or your specified value", aliases: "-i", banner: "id"
         | 
| 17 | 
            +
             | 
| 18 | 
            +
             | 
| 19 | 
            +
             | 
| 20 | 
            +
                  class_option :fields, type: :array, default: [], desc: "Manually add specified fields"
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  class_option :detect_fields, type: :boolean, default: false, desc: "Introspect on the model to set fields in the generated blueprint. Will be merged with any manually specified"
         | 
| 23 | 
            +
             | 
| 24 | 
            +
             | 
| 25 | 
            +
             | 
| 26 | 
            +
                  class_option :associations, type: :array, default: [], desc: "Manually add specified associations", aliases: "-a"
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  class_option :detect_associations, type: :boolean, default: false, desc: "Introspect on the model to set associations in the generated blueprint. Will be merged with any manually specified"
         | 
| 29 | 
            +
             | 
| 30 | 
            +
             | 
| 31 | 
            +
             | 
| 32 | 
            +
                  class_option :wrap_at, type: :numeric, default: 80, desc: "Maximum length of generated fields line", aliases: "-w"
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  class_option :indentation, type: :string, default: "two", desc: "Indentation of generated file", banner: "two|four|tab"
         | 
| 35 | 
            +
             | 
| 36 | 
            +
             | 
| 37 | 
            +
             | 
| 38 | 
            +
                  remove_class_option :skip_namespace
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  def ensure_blueprint_dir
         | 
| 41 | 
            +
                    FileUtils.mkdir_p(path) unless File.directory?(path)
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  def create_blueprint
         | 
| 45 | 
            +
                    template "blueprint.rb", File.join(path, "#{file_path}_blueprint.rb")
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
             | 
| 49 | 
            +
             | 
| 50 | 
            +
                  private
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  def path
         | 
| 53 | 
            +
                    options["blueprints_dir"]
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                  def identifier_symbol
         | 
| 57 | 
            +
                    if options['identifier']
         | 
| 58 | 
            +
                       options['identifier'] == "identifier" ? :id : options['identifier']
         | 
| 59 | 
            +
                    end
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  def fields
         | 
| 63 | 
            +
                    fs = if options["detect_fields"]
         | 
| 64 | 
            +
                           Array.new(options["fields"]).concat(introspected_fields)
         | 
| 65 | 
            +
                         else
         | 
| 66 | 
            +
                           options["fields"]
         | 
| 67 | 
            +
                         end
         | 
| 68 | 
            +
                    fs.reject {|f| f.blank? }.uniq
         | 
| 69 | 
            +
                  end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                  def introspected_fields
         | 
| 72 | 
            +
                    class_name.constantize.columns_hash.keys
         | 
| 73 | 
            +
                  end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                  # split at wrap_at chars, two indentations
         | 
| 76 | 
            +
                  def formatted_fields
         | 
| 77 | 
            +
                    two_indents = indent * 2
         | 
| 78 | 
            +
                    fields_string = fields.reduce([]) do |memo, f|
         | 
| 79 | 
            +
                      if !memo.last.nil?
         | 
| 80 | 
            +
                        now = "#{memo.last} :#{f},"
         | 
| 81 | 
            +
                        if now.length > options["wrap_at"].to_i
         | 
| 82 | 
            +
                          memo << ":#{f},"
         | 
| 83 | 
            +
                        else
         | 
| 84 | 
            +
                          memo[memo.length - 1] = now
         | 
| 85 | 
            +
                        end
         | 
| 86 | 
            +
                      else
         | 
| 87 | 
            +
                        memo << " :#{f},"
         | 
| 88 | 
            +
                      end
         | 
| 89 | 
            +
                      memo
         | 
| 90 | 
            +
                    end.join("\n#{two_indents}")
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                    fields_string[0,fields_string.length - 1]
         | 
| 93 | 
            +
                  end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                  def associations
         | 
| 96 | 
            +
                    as = if options["detect_associations"]
         | 
| 97 | 
            +
                           Array.new(options["associations"]).concat(introspected_associations.keys)
         | 
| 98 | 
            +
                         else
         | 
| 99 | 
            +
                           options["associations"]
         | 
| 100 | 
            +
                         end
         | 
| 101 | 
            +
                    as.reject {|f| f.blank? }.uniq
         | 
| 102 | 
            +
                  end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                  def introspected_associations
         | 
| 105 | 
            +
                    class_name.constantize.reflections
         | 
| 106 | 
            +
                  end
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                  def association_blueprint(association_name)
         | 
| 109 | 
            +
                    ", blueprint: #{association_class(association_name)}"
         | 
| 110 | 
            +
                  end
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                  def association_class(association_name)
         | 
| 113 | 
            +
                    introspected_name = if introspected_associations[association_name].respond_to?(:klass)
         | 
| 114 | 
            +
                                          introspected_associations[association_name].klass.to_s
         | 
| 115 | 
            +
                                        else
         | 
| 116 | 
            +
                                          nil
         | 
| 117 | 
            +
                                        end
         | 
| 118 | 
            +
                    "#{introspected_name || association_name.camelcase}Blueprint"
         | 
| 119 | 
            +
                  end
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                  def indent
         | 
| 122 | 
            +
                    user_intended = {two: "  ", four: "    ", tab:"\t"}[options["indentation"].intern]
         | 
| 123 | 
            +
                    user_intended.nil? ? "  " : user_intended
         | 
| 124 | 
            +
                  end
         | 
| 125 | 
            +
                end
         | 
| 126 | 
            +
              end
         | 
| 127 | 
            +
            end
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            class <%= class_name %>Blueprint < Blueprinter::Base
         | 
| 2 | 
            +
            <% if identifier_symbol -%>
         | 
| 3 | 
            +
            <%= indent -%>identifier :<%= identifier_symbol %>
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            <% end -%>
         | 
| 6 | 
            +
            <% if fields.any? -%>
         | 
| 7 | 
            +
            <%= indent -%>fields<%= formatted_fields %>
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            <% end -%>
         | 
| 10 | 
            +
            <% associations.each do |a| -%>
         | 
| 11 | 
            +
            <%= indent -%>association :<%= a -%><%= association_blueprint(a) %>
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            <% end -%>
         | 
| 14 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: blueprinter
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.22.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Adam Hess
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2019-12- | 
| 12 | 
            +
            date: 2019-12-26 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: factory_bot
         | 
| @@ -151,6 +151,20 @@ dependencies: | |
| 151 151 | 
             
                - - "~>"
         | 
| 152 152 | 
             
                  - !ruby/object:Gem::Version
         | 
| 153 153 | 
             
                    version: 0.9.11
         | 
| 154 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 155 | 
            +
              name: ammeter
         | 
| 156 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 157 | 
            +
                requirements:
         | 
| 158 | 
            +
                - - "~>"
         | 
| 159 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 160 | 
            +
                    version: 1.1.4
         | 
| 161 | 
            +
              type: :development
         | 
| 162 | 
            +
              prerelease: false
         | 
| 163 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 164 | 
            +
                requirements:
         | 
| 165 | 
            +
                - - "~>"
         | 
| 166 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 167 | 
            +
                    version: 1.1.4
         | 
| 154 168 | 
             
            description: Blueprinter is a JSON Object Presenter for Ruby that takes business objects
         | 
| 155 169 | 
             
              and breaks them down into simple hashes and serializes them to JSON. It can be used
         | 
| 156 170 | 
             
              in Rails in place of other serializers (like JBuilder or ActiveModelSerializers).
         | 
| @@ -184,6 +198,8 @@ files: | |
| 184 198 | 
             
            - lib/blueprinter/version.rb
         | 
| 185 199 | 
             
            - lib/blueprinter/view.rb
         | 
| 186 200 | 
             
            - lib/blueprinter/view_collection.rb
         | 
| 201 | 
            +
            - lib/generators/blueprinter/blueprint_generator.rb
         | 
| 202 | 
            +
            - lib/generators/blueprinter/templates/blueprint.rb
         | 
| 187 203 | 
             
            - lib/tasks/blueprinter_tasks.rake
         | 
| 188 204 | 
             
            homepage: https://github.com/procore/blueprinter
         | 
| 189 205 | 
             
            licenses:
         |