如何指定文件下载

发布于 2024-10-30 19:27:35 字数 4609 浏览 0 评论 0原文

我正在开发一个库,需要能够使用 RestClient 从远程 API 下载插件文件。该库首先获取插件列表,然后将每个插件下载为原始文件,并将每个插件保存在插件目录中。

这是到目前为止我所拥有的,但它让我失败:

require 'yaml'

module Monitaur
  class Client

    attr_accessor :logger, :client_key, :server_url, :config, :raw_config,
                  :plugin_manifest

    def initialize
      load_config
      @plugin_manifest ||= []
    end

    def run
      get_plugin_manifest
      sync_plugins
    end

    def get_plugin_manifest
      res = RestClient.get("#{server_url}/nodes/#{client_key}/plugins")
      @plugin_manifest = JSON.parse(res)
    end

    def sync_plugins
      @plugin_manifest.each do |plugin|
        res = RestClient.get("#{server_url}/plugins/#{plugin['name']}")
        File.open(File.join(Monitaur.plugin_dir, "#{plugin['name']}.rb"), "w+") do |file|
          file.write res.body
        end
      end
    end

    def load_config
      if File.exist?(Monitaur.config_file_path) && File.readable?(Monitaur.config_file_path)
        @raw_config = YAML.load_file(Monitaur.config_file_path)
      else
        raise IOError, "Cannot open or read #{Monitaur.config_file_path}"
      end

      @server_url = raw_config['server_url']
      @client_key = raw_config['client_key']
    end


  end
end

还有 client_spec.rb

require 'spec_helper'

module Monitaur
  describe Client do
    let(:server_url) { "http://api.monitaurapp.com" }
    let(:client_key) { "asdf1234" }

    describe "#load_config" do
      let(:client) { Monitaur::Client.new }

      before do
        File.open(Monitaur.config_file_path, "w") do |file|
          file.puts "server_url: http://api.monitaurapp.com"
          file.puts "client_key: asdf1234"
        end 
      end

      it "loads up the configuration file" do
        client.load_config
        client.server_url.should == "http://api.monitaurapp.com"
        client.client_key.should == "asdf1234"
      end
    end

    describe "#get_plugin_manifest" do
      let(:client) { Monitaur::Client.new }

      before do
        stub_get_plugin_manifest
      end

      it "retrieves a plugins manifest from the server" do
        client.get_plugin_manifest
        client.plugin_manifest.should == plugin_manifest_response
      end
    end

    describe "#sync_plugins" do
      let(:client) { Monitaur::Client.new }
      let(:foo_plugin) { mock('foo_plugin') }
      let(:bar_plugin) { mock('bar_plugin') }

      before do
        FileUtils.mkdir("/tmp")
        File.open("/tmp/foo_plugin.rb", "w+") do |file|
          file.write %|
          class FooPlugin < Monitaur::Plugin
            name "foo_plugin"
            desc "A test plugin to determine whether plugin sync works"

            def run
              { :foo => 'foo' }
            end
          end
          |
        end
        File.open("/tmp/bar_plugin.rb", "w+") do |file|
          file.write %|
          class BarPlugin < Monitaur::Plugin
            name "bar_plugin"
            desc "A test plugin to determine whether plugin sync works"

            def run
              { :bar => 'bar' }
            end
          end
          |
        end
        Monitaur.install
        stub_get_plugin_manifest
        stub_sync_plugins
        client.get_plugin_manifest

      end

      it "downloads plugins to the cache directory" do
        File.should_receive(:open).
          with(File.join(Monitaur.plugin_dir, "foo_plugin.rb"), "w+")
          and_yield(foo_plugin)

        client.sync_plugins

        File.exist?("/home/user/.monitaur/cache/plugins/foo_plugin.rb").should be_true
        File.exist?("/home/user/.monitaur/cache/plugins/bar_plugin.rb").should be_true
      end
    end
  end
end

def stub_get_plugin_manifest
  stub_request(:get, "#{server_url}/nodes/#{client_key}/plugins").
    to_return(
      :status => 200,
      :body => %Q{
        [
          {
            "name": "foo_plugin",
            "checksum": "qwer5678"
          },
          {
            "name": "bar_plugin",
            "checksum": "hjkl4321"
          }
        ]
      }
    )
end

def plugin_manifest_response
  [
    {
      "name" => "foo_plugin",
      "checksum" => "qwer5678"
    },
    {
      "name" => "bar_plugin",
      "checksum" => "hjkl4321"
    }
  ]
end

def stub_sync_plugins
  stub_request(:get, "#{server_url}/plugins/foo_plugin").
    to_return(:body => File.open('/tmp/foo_plugin.rb').read)

  stub_request(:get, "#{server_url}/plugins/bar_plugin").
    to_return(:body => File.open('/tmp/bar_plugin.rb').read)
end

如何测试下载过程?

I am working on a library that needs to be able to download plugin files from a remote API using RestClient. The library first grabs a list of plugins, and then downloads each plugin as a raw file, saving each inside a plugins directory.

Here is what I have thus far but it is failing me:

require 'yaml'

module Monitaur
  class Client

    attr_accessor :logger, :client_key, :server_url, :config, :raw_config,
                  :plugin_manifest

    def initialize
      load_config
      @plugin_manifest ||= []
    end

    def run
      get_plugin_manifest
      sync_plugins
    end

    def get_plugin_manifest
      res = RestClient.get("#{server_url}/nodes/#{client_key}/plugins")
      @plugin_manifest = JSON.parse(res)
    end

    def sync_plugins
      @plugin_manifest.each do |plugin|
        res = RestClient.get("#{server_url}/plugins/#{plugin['name']}")
        File.open(File.join(Monitaur.plugin_dir, "#{plugin['name']}.rb"), "w+") do |file|
          file.write res.body
        end
      end
    end

    def load_config
      if File.exist?(Monitaur.config_file_path) && File.readable?(Monitaur.config_file_path)
        @raw_config = YAML.load_file(Monitaur.config_file_path)
      else
        raise IOError, "Cannot open or read #{Monitaur.config_file_path}"
      end

      @server_url = raw_config['server_url']
      @client_key = raw_config['client_key']
    end


  end
end

And the client_spec.rb

require 'spec_helper'

module Monitaur
  describe Client do
    let(:server_url) { "http://api.monitaurapp.com" }
    let(:client_key) { "asdf1234" }

    describe "#load_config" do
      let(:client) { Monitaur::Client.new }

      before do
        File.open(Monitaur.config_file_path, "w") do |file|
          file.puts "server_url: http://api.monitaurapp.com"
          file.puts "client_key: asdf1234"
        end 
      end

      it "loads up the configuration file" do
        client.load_config
        client.server_url.should == "http://api.monitaurapp.com"
        client.client_key.should == "asdf1234"
      end
    end

    describe "#get_plugin_manifest" do
      let(:client) { Monitaur::Client.new }

      before do
        stub_get_plugin_manifest
      end

      it "retrieves a plugins manifest from the server" do
        client.get_plugin_manifest
        client.plugin_manifest.should == plugin_manifest_response
      end
    end

    describe "#sync_plugins" do
      let(:client) { Monitaur::Client.new }
      let(:foo_plugin) { mock('foo_plugin') }
      let(:bar_plugin) { mock('bar_plugin') }

      before do
        FileUtils.mkdir("/tmp")
        File.open("/tmp/foo_plugin.rb", "w+") do |file|
          file.write %|
          class FooPlugin < Monitaur::Plugin
            name "foo_plugin"
            desc "A test plugin to determine whether plugin sync works"

            def run
              { :foo => 'foo' }
            end
          end
          |
        end
        File.open("/tmp/bar_plugin.rb", "w+") do |file|
          file.write %|
          class BarPlugin < Monitaur::Plugin
            name "bar_plugin"
            desc "A test plugin to determine whether plugin sync works"

            def run
              { :bar => 'bar' }
            end
          end
          |
        end
        Monitaur.install
        stub_get_plugin_manifest
        stub_sync_plugins
        client.get_plugin_manifest

      end

      it "downloads plugins to the cache directory" do
        File.should_receive(:open).
          with(File.join(Monitaur.plugin_dir, "foo_plugin.rb"), "w+")
          and_yield(foo_plugin)

        client.sync_plugins

        File.exist?("/home/user/.monitaur/cache/plugins/foo_plugin.rb").should be_true
        File.exist?("/home/user/.monitaur/cache/plugins/bar_plugin.rb").should be_true
      end
    end
  end
end

def stub_get_plugin_manifest
  stub_request(:get, "#{server_url}/nodes/#{client_key}/plugins").
    to_return(
      :status => 200,
      :body => %Q{
        [
          {
            "name": "foo_plugin",
            "checksum": "qwer5678"
          },
          {
            "name": "bar_plugin",
            "checksum": "hjkl4321"
          }
        ]
      }
    )
end

def plugin_manifest_response
  [
    {
      "name" => "foo_plugin",
      "checksum" => "qwer5678"
    },
    {
      "name" => "bar_plugin",
      "checksum" => "hjkl4321"
    }
  ]
end

def stub_sync_plugins
  stub_request(:get, "#{server_url}/plugins/foo_plugin").
    to_return(:body => File.open('/tmp/foo_plugin.rb').read)

  stub_request(:get, "#{server_url}/plugins/bar_plugin").
    to_return(:body => File.open('/tmp/bar_plugin.rb').read)
end

How can I test the download process?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜无邪 2024-11-06 19:27:35

我使用 FakeWeb 来达到此目的,因为如果其他网站关闭或某物。请参阅文档中的“重播录制的响应”。我们所做的就是curl页面,将其保存为固定装置并在规范中重放。

I use FakeWeb for this purpose, as there's really no need for your spec to fail if the other site is down or something. See "Replaying a recorded response" in the docs. What we do is curl the page, save it somewhere as a fixture and replay that in the specs.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文