aliyun-odps 0.1.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +31 -0
  4. data/Gemfile +3 -0
  5. data/README.md +55 -12
  6. data/Rakefile +15 -5
  7. data/aliyun-odps.gemspec +22 -11
  8. data/bin/console +10 -3
  9. data/lib/aliyun/odps.rb +69 -2
  10. data/lib/aliyun/odps/authorization.rb +90 -0
  11. data/lib/aliyun/odps/client.rb +40 -0
  12. data/lib/aliyun/odps/configuration.rb +16 -0
  13. data/lib/aliyun/odps/error.rb +97 -0
  14. data/lib/aliyun/odps/http.rb +138 -0
  15. data/lib/aliyun/odps/list.rb +40 -0
  16. data/lib/aliyun/odps/model/function.rb +16 -0
  17. data/lib/aliyun/odps/model/functions.rb +113 -0
  18. data/lib/aliyun/odps/model/instance.rb +130 -0
  19. data/lib/aliyun/odps/model/instance_task.rb +30 -0
  20. data/lib/aliyun/odps/model/instances.rb +119 -0
  21. data/lib/aliyun/odps/model/projects.rb +73 -0
  22. data/lib/aliyun/odps/model/resource.rb +26 -0
  23. data/lib/aliyun/odps/model/resources.rb +144 -0
  24. data/lib/aliyun/odps/model/table.rb +37 -0
  25. data/lib/aliyun/odps/model/table_column.rb +13 -0
  26. data/lib/aliyun/odps/model/table_partition.rb +9 -0
  27. data/lib/aliyun/odps/model/table_partitions.rb +90 -0
  28. data/lib/aliyun/odps/model/table_schema.rb +13 -0
  29. data/lib/aliyun/odps/model/tables.rb +125 -0
  30. data/lib/aliyun/odps/model/task_result.rb +9 -0
  31. data/lib/aliyun/odps/modelable.rb +16 -0
  32. data/lib/aliyun/odps/project.rb +47 -0
  33. data/lib/aliyun/odps/service_object.rb +27 -0
  34. data/lib/aliyun/odps/struct.rb +126 -0
  35. data/lib/aliyun/odps/tunnel/download_session.rb +98 -0
  36. data/lib/aliyun/odps/tunnel/router.rb +15 -0
  37. data/lib/aliyun/odps/tunnel/snappy_reader.rb +19 -0
  38. data/lib/aliyun/odps/tunnel/snappy_writer.rb +45 -0
  39. data/lib/aliyun/odps/tunnel/table_tunnels.rb +81 -0
  40. data/lib/aliyun/odps/tunnel/upload_block.rb +9 -0
  41. data/lib/aliyun/odps/tunnel/upload_session.rb +132 -0
  42. data/lib/aliyun/odps/utils.rb +102 -0
  43. data/lib/aliyun/odps/version.rb +1 -1
  44. data/requirements.png +0 -0
  45. data/wiki/error.md +188 -0
  46. data/wiki/functions.md +39 -0
  47. data/wiki/get_start.md +34 -0
  48. data/wiki/installation.md +15 -0
  49. data/wiki/instances.md +32 -0
  50. data/wiki/projects.md +51 -0
  51. data/wiki/resources.md +62 -0
  52. data/wiki/ssl.md +7 -0
  53. data/wiki/tables.md +75 -0
  54. data/wiki/tunnels.md +80 -0
  55. metadata +195 -13
  56. data/requirements.mindnode/QuickLook/Preview.jpg +0 -0
  57. data/requirements.mindnode/contents.xml +0 -10711
  58. data/requirements.mindnode/viewState.plist +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2846d511de2496e6fc99c96e95dd05bf0c31c68c
4
- data.tar.gz: 514b589a19f56478dc62262f79a708c00e6fa0c2
3
+ metadata.gz: 668bb0a1605386f0934814e45f60e6550a8d21d8
4
+ data.tar.gz: 2b94dd56d05754e2b7ad7e674ec5d78cf4fc8235
5
5
  SHA512:
6
- metadata.gz: 412386d88aeade9c1fc3fabf40c9a2b70e72ce6c0dd38e2e2cff50649908dc919c4e8c9d5e21458d318056f5f2a3f181644b16412b7ff1d3506a5c156e9a2be3
7
- data.tar.gz: 75821628b43a48e0b8b0c3f44c7c072fc852846365ada81eafa18c7afa11836bb809c2fb0b518c48c3f11dc1545924f8384501ef071bf17cae0f3a21815b94b2
6
+ metadata.gz: 3066f7654504c549c91823f88ffecdaeb319f8614f59386920fd70ec08955198c7717d5cc99075d9a820a3f406fd8c02bc1cc62ece513f0b0b194f24f302c7a6
7
+ data.tar.gz: b65df29d07ea272729c4d8cbf72c2ee9fe6ca6b8f14cfee6c7223cd8e81a7046d8dfe0d2e7a26848571752d006a4a1b38f7fcc51a42b304c920ef7a36b1d4e96
data/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
1
  /.bundle/
2
+ /.idea
2
3
  /.yardoc
3
4
  /Gemfile.lock
4
5
  /_yardoc/
@@ -7,3 +8,5 @@
7
8
  /pkg/
8
9
  /spec/reports/
9
10
  /tmp/
11
+ .DS_Store
12
+ .ruby-version
data/.rubocop.yml ADDED
@@ -0,0 +1,31 @@
1
+ # This is the configuration used to check the rubocop source code.
2
+
3
+ AllCops:
4
+ Exclude:
5
+ - 'demo/**/*'
6
+ - 'test/**/*'
7
+
8
+ Metrics/LineLength:
9
+ Max: 100
10
+ Enabled: false
11
+
12
+ Style/Documentation:
13
+ Enabled: false
14
+
15
+ Style/DoubleNegation:
16
+ Enabled: false
17
+
18
+ Metrics/ClassLength:
19
+ Enabled: false
20
+
21
+ Style/AccessorMethodName:
22
+ Enabled: false
23
+
24
+ Style/PredicateName:
25
+ Enabled: false
26
+
27
+ Style/Lambda:
28
+ Enabled: false
29
+
30
+ Lint/UnusedMethodArgument:
31
+ Enabled: false
data/Gemfile CHANGED
@@ -2,3 +2,6 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in aliyun-odps-sdk.gemspec
4
4
  gemspec
5
+
6
+ gem 'simplecov', require: false, group: :test
7
+ gem 'pry-byebug'
data/README.md CHANGED
@@ -1,10 +1,9 @@
1
- # Aliyun OSS SDK
1
+ # Aliyun ODPS SDK
2
2
 
3
3
  -----
4
4
 
5
5
  It is a full-featured Ruby Library for Aliyun ODPS API. Enjoy it!
6
6
 
7
-
8
7
  ## Installation
9
8
 
10
9
  It's a Ruby Gem, so you can install it like any Gem:
@@ -19,39 +18,83 @@ And run:
19
18
 
20
19
  bundle install
21
20
 
21
+
22
+ ## Usage
23
+
24
+ ### Quick Start
25
+
26
+ First of all, config your environment.
27
+
28
+ If you use Rails, you can place it in `config/initializers/aliyun_odps.rb`, for other framework, just place it before your other odps code.
29
+
30
+ Aliyun::Odps.configure do |config|
31
+ config.access_key = '<your-access-key>'
32
+ config.secret_key = '<your-secret-key>'
33
+ config.endpoint = '<odps-server-api>' # "http://service.odps.aliyun.com/api"
34
+ config.project = '<your-default-project>'
35
+ end
36
+
37
+ After that, you can get your project and start party now!
38
+
39
+ project = Aliyun::Odps.project
40
+
41
+ # Accesss tables
42
+ project.tables.list
43
+
44
+ # Access resources
45
+ project.resources.list
46
+
47
+ # Access instances
48
+ project.instances.list
49
+
50
+ # Access functions
51
+ project.functions.list
52
+
53
+
54
+ # For Tunnel
55
+ project.table_tunnels
56
+
57
+ More Example and Scenario, visit our [Document](#document)
58
+
59
+
22
60
  ## Document
23
61
 
24
62
  Here is original Restful API, It has the most detailed and authoritative explanation for every API.
25
63
 
26
64
  + [http://repo.aliyun.com/api-doc/index.html](http://repo.aliyun.com/api-doc/index.html)
27
65
 
28
- Here is thr RDoc Document for this Library, use to find mostly usage for methods.
66
+ Here is our RDoc Document, It's well format to help you find more detail about methods.
29
67
 
30
- + [RDoc Document]()
68
+ + [RDoc Document](http://www.rubydoc.info/gems/aliyun-odps/0.1.0)
31
69
 
32
70
 
33
71
  Here are some more guides for help you. Welcome to advice.
34
72
 
73
+ All document are under `./wiki`
74
+
35
75
  + [Installation](./wiki/installation.md)
36
76
  + [Getting Started](./wiki/get_start.md)
37
- + [Error](./wiki/error.md)
77
+ + [Projects](./wiki/projects.md)
78
+ + [Instances](./wiki/instances.md)
79
+ + [Resources](./wiki/resources.md)
80
+ + [Functions](./wiki/functions.md)
81
+ + [Tables](./wiki/tables.md)
82
+ + [Tunnels](./wiki/tunnels.md)
83
+ + [Error Code](./wiki/error.md)
84
+ + [SSL Connection](./wiki/ssl.md)
38
85
 
39
- ## Usage
40
-
41
- ### Quick Start
42
86
 
43
87
  ## Test
44
88
 
45
89
  We use minitest for test and rubocop for Syntax checker, If you want to make contribute to this library. Confirm below Command is success:
46
90
 
47
- ```
48
- bundle exec rake test
49
- ```
91
+ bundle exec rake test
50
92
 
51
93
 
52
94
  ## Authors && Contributors
53
95
 
54
- - [Newell Zhu](https://github.com/zlx_star)
96
+ - [Newell](https://github.com/zlx_star)
97
+ - [genewoo](https://github.com/genewoo)
55
98
 
56
99
 
57
100
  ## License
data/Rakefile CHANGED
@@ -1,10 +1,20 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+ require 'rubocop/rake_task'
3
4
 
4
5
  Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
- t.libs << "lib"
6
+ t.libs << 'test'
7
+ t.libs << 'lib'
7
8
  t.test_files = FileList['test/**/*_test.rb']
8
9
  end
9
10
 
10
- task :default => :test
11
+ task default: :test
12
+
13
+ task :test do
14
+ Rake::Task['test'].invoke
15
+ Rake::Task['rubocop'].invoke
16
+ end
17
+
18
+ RuboCop::RakeTask.new do |task|
19
+ task.fail_on_error = false
20
+ end
data/aliyun-odps.gemspec CHANGED
@@ -4,21 +4,32 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'aliyun/odps/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "aliyun-odps"
7
+ spec.name = 'aliyun-odps'
8
8
  spec.version = Aliyun::Odps::VERSION
9
- spec.authors = ["Newell Zhu"]
10
- spec.email = ["zlx.star@gmail.com"]
9
+ spec.authors = ['Newell Zhu']
10
+ spec.email = ['zlx.star@gmail.com']
11
11
 
12
- spec.summary = %q{It is a full-featured Ruby Library for Aliyun ODPS API. Enjoy it!}
13
- spec.description = %q{It is a full-featured Ruby Library for Aliyun ODPS API. Enjoy it!}
14
- spec.homepage = "https://github.com/aliyun-beta"
12
+ spec.summary = 'It is a full-featured Ruby Library for Aliyun ODPS API. Enjoy it!'
13
+ spec.description = 'It is a full-featured Ruby Library for Aliyun ODPS API. Enjoy it!'
14
+ spec.homepage = 'https://github.com/aliyun-beta'
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
- spec.bindir = "exe"
17
+ spec.bindir = 'exe'
18
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
- spec.require_paths = ["lib"]
19
+ spec.require_paths = ['lib']
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.10"
22
- spec.add_development_dependency "rake", "~> 10.0"
23
- spec.add_development_dependency "minitest"
21
+ spec.add_dependency 'httparty'
22
+ spec.add_dependency 'addressable'
23
+ spec.add_dependency 'activesupport'
24
+ spec.add_dependency 'gyoku'
25
+ spec.add_dependency 'odps_protobuf', '0.5.0'
26
+
27
+ spec.add_development_dependency 'bundler'
28
+ spec.add_development_dependency 'rake'
29
+ spec.add_development_dependency 'minitest'
30
+ spec.add_development_dependency 'mocha'
31
+ spec.add_development_dependency 'webmock'
32
+ spec.add_development_dependency 'timecop'
33
+ spec.add_development_dependency 'rubocop'
34
+ spec.add_development_dependency 'snappy'
24
35
  end
data/bin/console CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "bundler/setup"
4
- require "aliyun/odps/sdk"
3
+ require 'bundler/setup'
4
+ require 'aliyun/odps'
5
5
 
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +10,12 @@ require "aliyun/odps/sdk"
10
10
  # require "pry"
11
11
  # Pry.start
12
12
 
13
- require "irb"
13
+ Aliyun::Odps.configure do |config|
14
+ config.access_key = ENV['ALIYUN_ACCESS_KEY'] || ''
15
+ config.secret_key = ENV['ALIYUN_SECRET_KEY'] || ''
16
+ config.endpoint = 'http://service.odps.aliyun.com/api'
17
+ config.project = ENV['ALIYUN_PROJECT'] || 'your-mock-project'
18
+ end
19
+
20
+ require 'irb'
14
21
  IRB.start
data/lib/aliyun/odps.rb CHANGED
@@ -1,7 +1,74 @@
1
- require "aliyun/odps/version"
1
+ require 'aliyun/odps/version'
2
+ require 'aliyun/odps/error'
3
+ require 'aliyun/odps/configuration'
4
+ require 'aliyun/odps/struct'
5
+ require 'aliyun/odps/modelable'
6
+ require 'aliyun/odps/project'
7
+
8
+ require 'aliyun/odps/authorization'
9
+ require 'aliyun/odps/client'
10
+ require 'aliyun/odps/utils'
11
+ require 'aliyun/odps/list'
12
+
13
+ # DEBUG
14
+ require 'pry'
2
15
 
3
16
  module Aliyun
4
17
  module Odps
5
- # Your code goes here...
18
+ class << self
19
+ attr_writer :configuration
20
+
21
+ # Config Odps
22
+ #
23
+ # @example
24
+ #
25
+ # Aliyun::Odps.configure do |config|
26
+ # config.access_key = 'your-access-key'
27
+ # config.secret_key = 'your-secret-key'
28
+ # config.endpoint = 'odps-api-endpoint' # 'http://service.odps.aliyun.com/api' or 'http://odps-ext.aliyun-inc.com/api'
29
+ # config.project = 'your-default-project-name'
30
+ # config.tunnel_endpoint = 'odps-tunnel-api-endpoint' # if you not config it, we will auto detect it
31
+ # end
32
+ def configure
33
+ @configuration ||= Configuration.new
34
+ yield @configuration if block_given?
35
+ @configuration
36
+ end
37
+
38
+ # return current configuration
39
+ #
40
+ # @return [Configuration]
41
+ def config
42
+ @configuration
43
+ end
44
+
45
+ # Get project
46
+ #
47
+ # @param name [String] specify project name, default is project in config
48
+ #
49
+ # @return [Project]
50
+ def project(name = config.project)
51
+ fail MissingProjectConfigurationError unless name
52
+ client.projects.get(name)
53
+ end
54
+ alias_method :get_project, :project
55
+
56
+ # (see Projects#list)
57
+ def list_projects(options = {})
58
+ client.projects.list(options)
59
+ end
60
+ alias_method :projects, :list_projects
61
+
62
+ # (see Projects#update)
63
+ def update_project(name, options = {})
64
+ client.projects.update(name, options)
65
+ end
66
+
67
+ private
68
+
69
+ def client
70
+ @client ||= Aliyun::Odps::Client.new
71
+ end
72
+ end
6
73
  end
7
74
  end
@@ -0,0 +1,90 @@
1
+ require 'base64'
2
+ require 'openssl'
3
+ require 'digest'
4
+ require 'json'
5
+
6
+ module Aliyun
7
+ module Odps
8
+ class Authorization
9
+ PROVIDER = 'ODPS'
10
+
11
+ class << self
12
+ # @private
13
+ #
14
+ # Get authorization key
15
+ #
16
+ # @param access_key [String] Access Key
17
+ # @param secret_key [String] Secret Key
18
+ # @param options [Hash] Options
19
+ # @option options [String] :verb VERB, request method
20
+ # @option options [String] :date Request Time in formate: '%a, %d %b %Y %H:%M:%S GMT'
21
+ # @option options [String] :path resource name
22
+ # @option options [Hash] :query Query key-value pair
23
+ # @option options [Hash] :headers Headers
24
+ #
25
+ # @return [String] the authorization string
26
+ def get_authorization(access_key, secret_key, options = {})
27
+ content_string = concat_content_string(options[:verb], options[:date], options)
28
+ signature_string = signature(secret_key, content_string)
29
+ "#{PROVIDER} #{access_key}:#{signature_string.strip}"
30
+ end
31
+
32
+ private
33
+
34
+ def concat_content_string(verb, time, options = {})
35
+ headers = options.fetch(:headers, {})
36
+
37
+ conon_headers = get_cononicalized_odps_headers(headers)
38
+ conon_resource = get_cononicalized_resource(
39
+ *options.values_at(:path, :query)
40
+ )
41
+
42
+ join_values(verb, time, headers, conon_headers, conon_resource)
43
+ end
44
+
45
+ def join_values(verb, time, headers, conon_headers, conon_resource)
46
+ [
47
+ verb,
48
+ headers['Content-MD5'].to_s.strip,
49
+ headers['Content-Type'].to_s.strip,
50
+ time,
51
+ conon_headers
52
+ ].join("\n") + conon_resource
53
+ end
54
+
55
+ def signature(secret_key, content_string)
56
+ utf8_string = content_string.force_encoding('utf-8')
57
+ Base64.encode64(
58
+ OpenSSL::HMAC.digest(
59
+ OpenSSL::Digest::SHA1.new,
60
+ secret_key,
61
+ utf8_string
62
+ )
63
+ )
64
+ end
65
+
66
+ def get_cononicalized_odps_headers(headers)
67
+ odps_headers = (headers || {}).select do |key, _|
68
+ key.to_s.downcase.start_with?('x-odps-')
69
+ end
70
+ return if odps_headers.empty?
71
+
72
+ odps_headers.keys.sort.map do |key|
73
+ "#{key.downcase}:#{odps_headers[key]}"
74
+ end.join("\n") + "\n"
75
+ end
76
+
77
+ def get_cononicalized_resource(path, query)
78
+ conon_resource = path
79
+ return conon_resource if query.nil? || query.empty?
80
+
81
+ Utils.stringify_keys!(query)
82
+
83
+ query_str = query.keys.sort.map { |k| "#{k}=#{query[k]}" }.join('&')
84
+
85
+ query_str.empty? ? conon_resource : conon_resource + '?' + query_str
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,40 @@
1
+ require 'aliyun/odps/http'
2
+ require 'aliyun/odps/service_object'
3
+ require 'aliyun/odps/model/projects'
4
+
5
+ module Aliyun
6
+ module Odps
7
+ class Client < ServiceObject
8
+ extend Aliyun::Odps::Modelable
9
+
10
+ # @!method projects
11
+ # @return [Projects]
12
+ has_many :projects
13
+
14
+ attr_reader :config
15
+
16
+ # Initialize a object
17
+ #
18
+ # @param access_key [String] access_key obtained from aliyun
19
+ # @param secret_key [String] secret_key obtained from aliyun
20
+ # @option opts [String] :endpoint endpoint for API
21
+ #
22
+ # @return [Response]
23
+ def initialize(config = Aliyun::Odps.config)
24
+ @config = config
25
+ end
26
+
27
+ %w(get put post delete options head).each do |method|
28
+ define_method(method) do |*args|
29
+ http.send(method, *args)
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def http
36
+ @http ||= Http.new(config)
37
+ end
38
+ end
39
+ end
40
+ end