1. 25 10月, 2017 1 次提交
  2. 24 10月, 2017 4 次提交
    • J
      Make clear that Time core extensions are split between Numeric and Integer · d8637025
      João Fernandes 提交于
      The documentation wrongly suggests that Time extensions to Numeric include
      methods months and years, when these belong to Integer.
      
      Update both classes and guides.
      d8637025
    • D
      Performance improvements for acts_like? method. · a5c9f246
      Dillon Welch 提交于
      activesupport/lib/active_support/core_ext/object/acts_like.rb
      acts_like?
      
      Add a case statement to use direct symbols instead of string
      interpolation for the three scenarios I found in the Rails codebase:
      time, date, and string.
      
      For time/date/string, this change prevents two string allocations for
      each time the method is called and speeds up the method by ~2.7x. For
      other arguments, there is no memory difference and performance
      difference is within margin of error.
      
      begin
        require "bundler/inline"
      rescue LoadError => e
        $stderr.puts "Bundler version 1.10 or later is required. Please update
                      your Bundler"
        raise e
      end
      
      gemfile(true) do
        source "https://rubygems.org"
      
        gem "rails", github: "rails/rails"
        gem "arel", github: "rails/arel"
        gem "benchmark-ips"
      end
      
      def allocate_count
        GC.disable
        before = ObjectSpace.count_objects
        yield
        after = ObjectSpace.count_objects
        after.each { |k,v| after[k] = v - before[k] }
        after[:T_HASH] -= 1 # probe effect - we created the before hash.
        GC.enable
        result = after.reject { |k,v| v == 0 }
        GC.start
        result
      end
      
      class Object
        def fast_acts_like?(duck)
          case duck
          when :time
            respond_to? :acts_like_time?
          when :date
            respond_to? :acts_like_date?
          when :string
            respond_to? :acts_like_string?
          else
            respond_to? :"acts_like_#{duck}?"
          end
        end
      end
      
      puts
      puts " acts_like? ".center(80, '=')
      puts
      
      obj = ''.freeze
      
      %i(time date string super_hacka).each do |type|
        puts " #{type} ".center(80, '=')
      
        puts " Memory Usage ".center(80, "=")
        puts
      
        puts "value.acts_like?"
        puts allocate_count { 1000.times { obj.acts_like?(type) } }
      
        puts "value.fast_acts_like?"
        puts allocate_count { 1000.times { obj.fast_acts_like?(type) } }
      
        puts
        puts " Benchmark.ips ".center(80, "=")
        puts
      
        Benchmark.ips do |x|
          x.report("acts_like?")      { obj.acts_like?(type) }
          x.report("fast_acts_like?") { obj.fast_acts_like?(type) }
          x.compare!
        end
      end
      
      ================================== acts_like? ==================================
      
      ===================================== time =====================================
      ================================= Memory Usage =================================
      
      value.acts_like?
      {:FREE=>-1983, :T_STRING=>2052, :T_IMEMO=>1}
      value.fast_acts_like?
      {:FREE=>-1}
      
      ================================ Benchmark.ips =================================
      
      Warming up --------------------------------------
                acts_like?   104.281k i/100ms
           fast_acts_like?   155.523k i/100ms
      Calculating -------------------------------------
                acts_like?      1.688M (±10.7%) i/s -      8.342M in   5.003804s
           fast_acts_like?      4.596M (±12.1%) i/s -     22.551M in   5.000124s
      
      Comparison:
           fast_acts_like?:  4596162.4 i/s
                acts_like?:  1688163.8 i/s - 2.72x  slower
      
      ===================================== date =====================================
      ================================= Memory Usage =================================
      
      value.acts_like?
      {:FREE=>-2001, :T_STRING=>2000}
      value.fast_acts_like?
      {:FREE=>-1}
      
      ================================ Benchmark.ips =================================
      
      Warming up --------------------------------------
                acts_like?    85.372k i/100ms
           fast_acts_like?   166.097k i/100ms
      Calculating -------------------------------------
                acts_like?      1.720M (± 8.3%) i/s -      8.537M in   5.001003s
           fast_acts_like?      4.695M (±10.1%) i/s -     23.254M in   5.010734s
      
      Comparison:
           fast_acts_like?:  4695493.1 i/s
                acts_like?:  1719637.9 i/s - 2.73x  slower
      
      ==================================== string ====================================
      ================================= Memory Usage =================================
      
      value.acts_like?
      {:FREE=>-2001, :T_STRING=>2000}
      value.fast_acts_like?
      {:FREE=>-1}
      
      ================================ Benchmark.ips =================================
      
      Warming up --------------------------------------
                acts_like?   100.221k i/100ms
           fast_acts_like?   182.841k i/100ms
      Calculating -------------------------------------
                acts_like?      1.706M (± 7.3%) i/s -      8.519M in   5.022331s
           fast_acts_like?      3.968M (±22.8%) i/s -     18.650M in   5.006762s
      
      Comparison:
           fast_acts_like?:  3967972.9 i/s
                acts_like?:  1705773.7 i/s - 2.33x  slower
      
      ================================= super_hacka ==================================
      ================================= Memory Usage =================================
      
      value.acts_like?
      {:FREE=>-2004, :T_STRING=>2002, :T_SYMBOL=>1}
      value.fast_acts_like?
      {:FREE=>-2003, :T_STRING=>2001, :T_SYMBOL=>1}
      
      ================================ Benchmark.ips =================================
      
      Warming up --------------------------------------
                acts_like?   100.344k i/100ms
           fast_acts_like?   101.690k i/100ms
      Calculating -------------------------------------
                acts_like?      1.617M (± 7.5%) i/s -      8.128M in   5.055285s
           fast_acts_like?      1.534M (±10.1%) i/s -      7.627M in   5.031052s
      
      Comparison:
                acts_like?:  1617390.7 i/s
           fast_acts_like?:  1533897.3 i/s - same-ish: difference falls within error
      a5c9f246
    • R
    • R
  3. 23 10月, 2017 1 次提交
  4. 21 10月, 2017 4 次提交
  5. 20 10月, 2017 1 次提交
    • M
      Remove obsolete documentation [ci skip] · 065be937
      Max Felsher 提交于
      Instructions to use `h` or `html_escape` in ERB templates were added to 
      `actionpack/lib/action_view/template_handlers/erb.rb` in a1b03493 (Rails 
      2.1), but ERB has automatically escaped values since Rails 3.
      065be937
  6. 16 10月, 2017 1 次提交
  7. 10 10月, 2017 1 次提交
  8. 04 10月, 2017 2 次提交
  9. 03 10月, 2017 1 次提交
  10. 01 10月, 2017 1 次提交
  11. 30 9月, 2017 1 次提交
  12. 29 9月, 2017 1 次提交
  13. 27 9月, 2017 1 次提交
  14. 25 9月, 2017 8 次提交
  15. 24 9月, 2017 1 次提交
  16. 23 9月, 2017 1 次提交
    • Y
      Make bang version work with `InheritableOptions` · 962ce60f
      yuuji.yaginuma 提交于
      Currently, bang version does not work with `InheritableOptions`.
      `InheritableOptions` treats the argument Hash as the default value.
      However, `Hash#fetch` does not use the default value when key is not
      found, so can not get the default value.
      So in bang version, should use `Hash#[]` instead of `Hash#fetch`.
      962ce60f
  17. 20 9月, 2017 1 次提交
  18. 19 9月, 2017 1 次提交
  19. 17 9月, 2017 2 次提交
  20. 14 9月, 2017 1 次提交
  21. 12 9月, 2017 1 次提交
    • D
      Add credentials using a generic EncryptedConfiguration class (#30067) · 69f976b8
      David Heinemeier Hansson 提交于
      * WIP: Add credentials using a generic EncryptedConfiguration class
      
      This is sketch code so far.
      
      * Flesh out EncryptedConfiguration and test it
      
      * Better name
      
      * Add command and generator for credentials
      
      * Use the Pathnames
      
      * Extract EncryptedFile from EncryptedConfiguration and add serializers
      
      * Test EncryptedFile
      
      * Extract serializer validation
      
      * Stress the point about losing comments
      
      * Allow encrypted configuration to be read without parsing for display
      
      * Use credentials by default and base them on the master key
      
      * Derive secret_key_base in test/dev, source it from credentials in other envs
      
      And document the usage.
      
      * Document the new credentials setup
      
      * Stop generating the secrets.yml file now that we have credentials
      
      * Document what we should have instead
      
      Still need to make it happen, tho.
      
      * [ci skip] Keep wording to `key base`; prefer defaults.
      
      Usually we say we change defaults, not "spec" out a release.
      
      Can't use backticks in our sdoc generated documentation either.
      
      * Abstract away OpenSSL; prefer MessageEncryptor.
      
      * Spare needless new when raising.
      
      * Encrypted file test shouldn't depend on subclass.
      
      * [ci skip] Some woordings.
      
      * Ditch serializer future coding.
      
      * I said flip it. Flip it good.
      
      * [ci skip] Move require_master_key to the real production.rb.
      
      * Add require_master_key to abort the boot process.
      
      In case the master key is required in a certain environment
      we should inspect that the key is there and abort if it isn't.
      
      * Print missing key message and exit immediately.
      
      Spares us a lengthy backtrace and prevents further execution.
      
      I've verified the behavior in a test app, but couldn't figure the
      test out as loading the app just exits immediately with:
      
      ```
      /Users/kasperhansen/Documents/code/rails/activesupport/lib/active_support/testing/isolation.rb:23:in `load': marshal data too short (ArgumentError)
      	from /Users/kasperhansen/Documents/code/rails/activesupport/lib/active_support/testing/isolation.rb:23:in `run'
      	from /Users/kasperhansen/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/minitest-5.10.2/lib/minitest.rb:830:in `run_one_method'
      	from /Users/kasperhansen/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/minitest-5.10.2/lib/minitest/parallel.rb:32:in `block (2 levels) in start'
      ```
      
      It's likely we need to capture and prevent the exit somehow.
      Kernel.stub(:exit) didn't work. Leaving it for tomorrow.
      
      * Fix require_master_key config test.
      
      Loading the app would trigger the `exit 1` per require_master_key's
      semantics, which then aborted the test.
      
      Fork and wait for the child process to finish, then inspect the
      exit status.
      
      Also check we aborted because of a missing master key, so something
      else didn't just abort the boot.
      
      Much <3 to @tenderlove for the tip.
      
      * Support reading/writing configs via methods.
      
      * Skip needless deep symbolizing.
      
      * Remove save; test config reader elsewhere.
      
      * Move secret_key_base check to when we're reading it.
      
      Otherwise we'll abort too soon since we don't assign the secret_key_base
      to secrets anymore.
      
      * Add missing string literal comments; require unneeded yaml require.
      
      * ya ya ya, rubocop.
      
      * Add master_key/credentials after bundle.
      
      Then we can reuse the existing message on `rails new bc4`.
      
      It'll look like:
      
      ```
      Using web-console 3.5.1 from https://github.com/rails/web-console.git (at master@ce985eb)
      Using rails 5.2.0.alpha from source at `/Users/kasperhansen/Documents/code/rails`
      Using sass-rails 5.0.6
      Bundle complete! 16 Gemfile dependencies, 72 gems now installed.
      Use `bundle info [gemname]` to see where a bundled gem is installed.
      Adding config/master.key to store the master encryption key: 97070158c44b4675b876373a6bc9d5a0
      
      Save this in a password manager your team can access.
      
      If you lose the key, no one, including you, can access anything encrypted with it.
      
            create  config/master.key
      ```
      
      And that'll be executed even if `--skip-bundle` was passed.
      
      * Ensure test app has secret_key_base.
      
      * Assign secret_key_base to app or omit.
      
      * Merge noise
      
      * Split options for dynamic delegation into its own method and use deep symbols to make it work
      
      * Update error to point to credentials instead
      
      * Appease Rubocop
      
      * Validate secret_key_base when reading it.
      
      Instead of relying on the validation in key_generator move that into
      secret_key_base itself.
      
      * Fix generator and secrets test.
      
      Manually add config.read_encrypted_secrets since it's not there by default
      anymore.
      
      Move mentions of config/secrets.yml to config/credentials.yml.enc.
      
      * Remove files I have no idea how they got here.
      
      * [ci skip] swap secrets for credentials.
      
      * [ci skip] And now, changelogs are coming.
      69f976b8
  22. 01 9月, 2017 4 次提交