Catatan Kami baru-baru ini mengganti nama cabang
4-stablemenjadimain. Ini mungkin mempengaruhi Anda jika Anda membuat perubahan pada kode Octokit secara lokal. Untuk detail lebih lanjut dan untuk langkah -langkah untuk mengkonfigurasi ulang klon lokal Anda untuk nama cabang baru, lihat posting ini.
Ruby Toolkit untuk API GitHub.
Perbaikan? Periksa panduan upgrade sebelum menabrak versi utama baru.
Pembungkus API harus mencerminkan idiom bahasa di mana mereka ditulis. Octokit.rb membungkus API GitHub dalam klien API datar yang mengikuti konvensi Ruby dan membutuhkan sedikit pengetahuan tentang istirahat. Sebagian besar metode memiliki argumen posisi untuk input yang diperlukan dan hash opsi untuk parameter opsional, header, atau opsi lain:
client = Octokit :: Client . new
# Fetch a README with Accept header for HTML format
client . readme 'al3x/sovereign' , :accept => 'application/vnd.github.html' Instal melalui Rubygems
gem install octokit
... atau tambahkan ke gemfile Anda
gem "octokit"
Akses perpustakaan di Ruby:
require 'octokit'
Metode API tersedia sebagai metode instance klien.
# Provide authentication credentials
client = Octokit :: Client . new ( :access_token => 'personal_access_token' )
# You can still use the username/password syntax by replacing the password value with your PAT.
# client = Octokit::Client.new(:login => 'defunkt', :password => 'personal_access_token')
# Fetch the current user
client . userSaat melewati parameter tambahan untuk mendapatkan permintaan berbasis, gunakan sintaks berikut:
# query: { parameter_name: 'value' }
# Example: Get repository listing by owner in ascending order
client . repos ( { } , query : { type : 'owner' , sort : 'asc' } )
# Example: Get contents of a repository by ref
# https://api.github.com/repos/octokit/octokit.rb/contents/path/to/file.rb?ref=some-other-branch
client . contents ( 'octokit/octokit.rb' , path : 'path/to/file.rb' , query : { ref : 'some-other-branch' } ) Sebagian besar metode mengembalikan objek Resource yang menyediakan notasi titik dan [] akses untuk bidang yang dikembalikan dalam respons API.
client = Octokit :: Client . new
# Fetch a user
user = client . user 'jbarnette'
puts user . name
# => "John Barnette"
puts user . fields
# => <Set: {:login, :id, :gravatar_id, :type, :name, :company, :blog, :location, :email, :hireable, :bio, :public_repos, :followers, :following, :created_at, :updated_at, :public_gists}>
puts user [ :company ]
# => "GitHub"
user . rels [ :gists ] . href
# => "https://api.github.com/users/jbarnette/gists" Catatan: Bidang URL dimusnahkan ke dalam koleksi .rels terpisah untuk dukungan Hypermedia yang lebih mudah.
Sementara sebagian besar metode mengembalikan objek Resource atau boolean, kadang -kadang Anda mungkin memerlukan akses ke header respons HTTP mentah. Anda dapat mengakses respons HTTP terakhir dengan Client#last_response :
user = client . user 'andrewpthorp'
response = client . last_response
etag = response . headers [ :etag ] Ketika API mengembalikan respons kesalahan, Octokit akan meningkatkan pengecualian ruby.
Berbagai pengecualian yang berbeda dapat dinaikkan tergantung pada kesalahan yang dikembalikan oleh API - misalnya:
400 Bad Request akan menyebabkan kesalahan Octokit::BadRequest403 Forbidden dengan pesan "rate limited terlampaui" akan menyebabkan kesalahan Octokit::TooManyRequests Semua kelas pengecualian yang berbeda mewarisi dari Octokit::Error dan mengekspos #response_status , #response_headers dan #response_body . Untuk kesalahan validasi, #errors akan mengembalikan Array Hash dengan informasi terperinci yang dikembalikan oleh API.
Octokit mendukung berbagai metode otentikasi yang didukung oleh Github API:
Menggunakan nama pengguna dan kata sandi GitHub Anda adalah cara termudah untuk mulai membuat permintaan yang diautentikasi:
client = Octokit :: Client . new ( :login => 'defunkt' , :password => 'c0d3b4ssssss!' )
user = client . user
user . login
# => "defunkt"Sementara otentikasi dasar memungkinkan Anda untuk memulai dengan cepat, OAuth Access Token adalah cara yang disukai untuk mengautentikasi atas nama pengguna.
OAuth Access Token memberikan dua manfaat utama daripada menggunakan nama pengguna dan kata sandi Anda:
Untuk menggunakan token akses dengan klien octokit, lewati token Anda di :access_token sebagai pengganti nama pengguna dan kata sandi Anda:
client = Octokit :: Client . new ( :access_token => "<your 40 char token>" )
user = client . user
user . login
# => "defunkt"Anda dapat membuat token akses melalui pengaturan akun GitHub Anda.
Otentikasi dua faktor membawa keamanan tambahan ke akun dengan mewajibkan lebih banyak informasi untuk masuk.
Menggunakan otentikasi dua faktor untuk panggilan API sesederhana menambahkan header yang diperlukan sebagai opsi:
client = Octokit :: Client . new
:login => 'defunkt' ,
:password => 'c0d3b4ssssss!'
user = client . user ( "defunkt" , :headers => { "X-GitHub-OTP" => "<your 2FA token>" } ) Octokit mendukung kredensial membaca dari file NETRC (default ke ~/.netrc ). Mengingat garis -garis ini di NETRC Anda:
machine api.github.com
login defunkt
password c0d3b4ssssss!
Anda sekarang dapat membuat klien dengan kredensial tersebut:
client = Octokit :: Client . new ( :netrc => true )
client . login
# => "defunkt"Tapi saya ingin menggunakan OAuth, katamu. Karena API GitHub mendukung menggunakan token OAuth sebagai kata sandi dasar, Anda benar -benar dapat:
machine api.github.com
login defunkt
password <your 40 char token>
Catatan: Dukungan untuk NETRC membutuhkan penambahan permata NetRC ke Gemfile atau .gemspec Anda.
Octokit juga mendukung otentikasi khusus aplikasi menggunakan kredensial klien aplikasi OAuth. Menggunakan kredensial aplikasi akan menghasilkan panggilan API anonim atas nama aplikasi untuk memanfaatkan batas tarif yang lebih tinggi.
client = Octokit :: Client . new
:client_id => "<your 20 char id>" ,
:client_secret => "<your 40 char secret>"
user = client . user 'defunkt'Octokit.rb juga mendukung otentikasi menggunakan aplikasi GitHub, yang membutuhkan token JWT yang dihasilkan.
client = Octokit :: Client . new ( :bearer_token => "<your jwt token>" )
client . app
# => about GitHub App info Hasil default dari API GitHub adalah 30, jika Anda ingin menambahkan lebih banyak, Anda harus melakukannya selama konfigurasi octokit.
Octokit :: Client . new ( access_token : "<your 40 char token>" , per_page : 100 ) Banyak sumber daya API GitHub yang paginasi. Meskipun Anda mungkin tergoda untuk mulai menambahkan :page ke panggilan Anda, API mengembalikan tautan ke halaman berikutnya, sebelumnya, dan terakhir untuk Anda di header respons Link sebagai hubungan tautan hypermedia.
issues = client . issues 'rails/rails'
issues . concat client . get ( client . last_response . rels [ :next ] . href )Untuk daftar sumber daya yang lebih kecil, Octokit menyediakan pagination otomatis. Ketika ini diaktifkan, panggilan untuk sumber daya paginated akan mengambil dan menggabungkan hasil dari setiap halaman menjadi satu array:
client . auto_paginate = true
issues = client . issues 'rails/rails'
issues . length
# => 702Anda juga dapat mengaktifkan pagination otomatis untuk semua instance klien octokit:
Octokit . configure do | c |
c . auto_paginate = true
end Catatan: Sementara pagination Otomatis Octokit akan mengatur ukuran halaman ke maksimum 100 , dan berusaha untuk tidak melampaui batas tarif Anda, Anda mungkin ingin menggunakan pola khusus untuk melintasi daftar besar.
Dengan sedikit pengaturan, Anda juga dapat menggunakan octokit dengan instance perusahaan github Anda.
Untuk berinteraksi dengan API "reguler" GitHub.com di Github Enterprise, cukup konfigurasikan api_endpoint untuk mencocokkan nama host Anda. Misalnya:
Octokit . configure do | c |
c . api_endpoint = "https://<hostname>/api/v3/"
end
client = Octokit :: Client . new ( :access_token => "<your 40 char token>" ) API Admin Github Enterprise berada di bawah klien yang berbeda: EnterpriseAdminClient . Anda harus memiliki akun administrator untuk menggunakan API ini.
admin_client = Octokit :: EnterpriseAdminClient . new (
:access_token => "<your 40 char token>" ,
:api_endpoint => "https://<hostname>/api/v3/"
)
# or
Octokit . configure do | c |
c . api_endpoint = "https://<hostname>/api/v3/"
c . access_token = "<your 40 char token>"
end
admin_client = Octokit . enterprise_admin_client . new API Konsol Manajemen Perusahaan GitHub juga berada di bawah klien terpisah: EnterpriseManagementConsoleClient . Untuk menggunakannya, Anda harus memberikan kata sandi konsol manajemen Anda serta titik akhir dari konsol manajemen Anda. Ini berbeda dari titik akhir API yang disediakan di atas.
management_console_client = Octokit :: EnterpriseManagementConsoleClient . new (
:management_console_password => "secret" ,
:management_console_endpoint = "https://hostname:8633"
)
# or
Octokit . configure do | c |
c . management_console_endpoint = "https://hostname:8633"
c . management_console_password = "secret"
end
management_console_client = Octokit . enterprise_management_console_client . newAnda mungkin perlu menonaktifkan SSL sementara saat pertama kali menyiapkan pemasangan perusahaan GitHub Anda. Anda dapat melakukannya dengan konfigurasi berikut:
client . connection_options [ :ssl ] = { :verify => false } Ingatlah untuk berbalik :verify kembali ke true , karena penting untuk komunikasi yang aman.
Sementara Octokit::Client menerima berbagai opsi saat membuat instance klien baru, API konfigurasi Octokit memungkinkan Anda untuk mengatur opsi konfigurasi Anda di level modul. Ini sangat berguna jika Anda membuat sejumlah contoh klien berdasarkan beberapa default bersama. Mengubah opsi memengaruhi instance baru saja dan tidak akan memodifikasi instance Octokit::Client yang ada yang dibuat dengan opsi sebelumnya.
Setiap atribut yang dapat ditulis di {octokit :: yang dapat dikonfigurasi} dapat diatur satu per satu:
Octokit . api_endpoint = 'http://api.github.dev'
Octokit . web_endpoint = 'http://github.dev'atau dalam batch:
Octokit . configure do | c |
c . api_endpoint = 'http://api.github.dev'
c . web_endpoint = 'http://github.dev'
endNilai konfigurasi default ditentukan dalam {octokit :: default}. Banyak atribut akan mencari nilai default dari Env sebelum mengembalikan default Octokit.
# Given $OCTOKIT_API_ENDPOINT is "http://api.github.dev"
client . api_endpoint
# => "http://api.github.dev" PERINGATAN DESPRECATION dan titik akhir API dalam Peringatan Pratinjau Pengembangan dicetak ke Stdout secara default, ini dapat dinonaktifkan dengan mengatur Env OCTOKIT_SILENT=true .
Secara default, Octokit tidak memenuhi permintaan jaringan. Untuk mengatur batas waktu, lulus dalam pengaturan batas waktu Faraday ke pengaturan connection_options Octokit.
Octokit . configure do | c |
c . api_endpoint = ENV . fetch ( 'GITHUB_API_ENDPOINT' , 'https://api.github.com/' )
c . connection_options = {
request : {
open_timeout : 5 ,
timeout : 5
}
}
endAnda harus menetapkan batas waktu untuk menghindari modul timeout Ruby, yang dapat menyemprot server Anda. Berikut adalah beberapa sumber daya untuk informasi lebih lanjut tentang ini:
Mulai dari versi 2.0, Octokit adalah Hypermedia-Enabled. Di bawah kap, {octokit :: Client} menggunakan Sawyer, klien Hypermedia yang dibangun di Faraday.
Sumber Daya yang Dikembalikan Dengan Metode Octokit tidak hanya mengandung data tetapi hubungan tautan hypermedia:
user = client . user 'technoweenie'
# Get the repos rel, returned from the API
# as repos_url in the resource
user . rels [ :repos ] . href
# => "https://api.github.com/users/technoweenie/repos"
repos = user . rels [ :repos ] . get . data
repos . last . name
# => "faraday-zeromq" Saat memproses respons API, semua atribut *_url dimusnahkan ke dalam koleksi hubungan tautan. Atribut url apa pun menjadi .rels[:self] .
Anda mungkin melihat banyak hubungan tautan memiliki placeholder variabel. Octokit mendukung templat URI untuk ekspansi URI yang parameter:
repo = client . repo 'pengwynn/pingwynn'
rel = repo . rels [ :issues ]
# => #<Sawyer::Relation: issues: get https://api.github.com/repos/pengwynn/pingwynn/issues{/number}>
# Get a page of issues
rel . get . data
# Get issue #2
rel . get ( :uri => { :number => 2 } ) . dataJika Anda ingin menggunakan Octokit sebagai klien API Hypermedia murni, Anda dapat mulai dari root API dan mengikuti hubungan tautan dari sana:
root = client . root
root . rels [ :repository ] . get :uri => { :owner => "octokit" , :repo => "octokit.rb" }
root . rels [ :user_repositories ] . get :uri => { :user => "octokit" } ,
:query => { :type => "owner" }Octokit 3.0 bertujuan untuk digerakkan oleh hypermedia, menghapus konstruksi URL internal yang saat ini digunakan di seluruh klien.
Versi 4.0
state dalam opsi metode.Versi 3.0 mencakup perubahan pasangan saat meningkatkan dari v2.xx:
Jenis media default sekarang v3 bukan beta . Jika Anda perlu meminta jenis media yang lebih lama, Anda dapat mengatur jenis media default untuk klien:
Octokit . default_media_type = "application/vnd.github.beta+json"atau per permintaan
client . emails ( :accept => "application/vnd.github.beta+json" ) Metode Octokit::Client#create_download yang sudah lama ditiadakan telah dihapus.
Versi 2.0 mencakup pabrik Client yang sepenuhnya ditulis ulang yang sekarang memoisasi instance klien berdasarkan opsi konfigurasi yang unik. Perubahan perubahan juga termasuk:
:oauth_token sekarang :access_token:auto_traversal sekarang :auto_paginateHashie::Mash telah dihapus. Responses sekarang mengembalikan objek sumber Sawyer::Resource . Jenis baru ini berperilaku sebagian besar seperti Hash ruby, tetapi tidak sepenuhnya mendukung Hashie::Mash API.Octokit::TooManyRequests dan Octokit::TooManyLoginAttemptssearch_* dari v1.x sekarang ditemukan di legacy_search_*DateTime yang tepat. Versi sebelumnya mengeluarkan bidang datetime sebagai objek 'string'. Karena Octokit mempekerjakan Faraday di bawah kap, beberapa perilaku dapat diperpanjang melalui middleware.
Seringkali, membantu untuk mengetahui apa yang dilakukan Octokit di bawah kap. Anda dapat menambahkan logger ke middleware yang memungkinkan Anda mengintip lalu lintas HTTP yang mendasarinya:
stack = Faraday :: RackBuilder . new do | builder |
builder . use Faraday :: Retry :: Middleware , exceptions : Faraday :: Retry :: Middleware :: DEFAULT_EXCEPTIONS + [ Octokit :: ServerError ] # or Faraday::Request::Retry for Faraday < 2.0
builder . use Octokit :: Middleware :: FollowRedirects
builder . use Octokit :: Response :: RaiseError
builder . use Octokit :: Response :: FeedParser
builder . response :logger do | logger |
logger . filter ( /(Authorization: "(token|Bearer) )( w +)/ , '1[REMOVED]' )
end
builder . adapter Faraday . default_adapter
end
Octokit . middleware = stack
client = Octokit :: Client . new
client . user 'pengwynn' I, [2013-08-22T15:54:38.583300 #88227] INFO -- : get https://api.github.com/users/pengwynn
D, [2013-08-22T15:54:38.583401 #88227] DEBUG -- request: Accept: "application/vnd.github.beta+json"
User-Agent: "Octokit Ruby Gem 2.0.0.rc4"
I, [2013-08-22T15:54:38.843313 #88227] INFO -- Status: 200
D, [2013-08-22T15:54:38.843459 #88227] DEBUG -- response: server: "GitHub.com"
date: "Thu, 22 Aug 2013 20:54:40 GMT"
content-type: "application/json; charset=utf-8"
transfer-encoding: "chunked"
connection: "close"
status: "200 OK"
x-ratelimit-limit: "60"
x-ratelimit-remaining: "39"
x-ratelimit-reset: "1377205443"
...
Lihat Faraday Readme untuk lebih banyak keajaiban middleware.
Jika Anda ingin meningkatkan kinerja, rentangkan batas tarif API Anda, atau hindari membayar pajak Hypermedia, Anda dapat menggunakan cache HTTP Faraday.
Tambahkan Permata ke Gemfile Anda
gem 'faraday-http-cache'
Selanjutnya, buat Middleware Faraday Anda sendiri:
stack = Faraday :: RackBuilder . new do | builder |
builder . use Faraday :: HttpCache , serializer : Marshal , shared_cache : false
builder . use Octokit :: Response :: RaiseError
builder . adapter Faraday . default_adapter
end
Octokit . middleware = stack Setelah dikonfigurasi, middleware akan menyimpan respons dalam cache berdasarkan sidik jari Etag dan melayani cadangan untuk 304 tanggapan di masa depan untuk sumber daya yang sama. Lihat proyek ReadMe untuk penggunaan lanjutan.
Jika Anda ingin meretas Octokit secara lokal, kami mencoba membuat bootstrap proyek seunuh mungkin. Untuk mulai meretas, mengkloning dan menjalankan:
script/bootstrap
Ini akan menginstal dependensi proyek dan membuat Anda bangun dan berjalan. Jika Anda ingin menjalankan konsol ruby untuk menyodok di Octokit, Anda dapat menghidupkannya dengan:
script/console
Menggunakan skrip di ./script alih-alih bundle exec rspec , bundle console , dll. Memastikan dependensi Anda terkini.
Kami ingin komunitas Octokit.rb dan Octokit yang lebih besar menjadi lingkungan yang terbuka dan ramah. Harap baca dan ikuti dalam kode perilaku roh dan surat.
Octokit menggunakan VCR untuk merekam dan memutar perlengkapan API kembali selama uji coba. Kaset ini (perlengkapan) adalah bagian dari proyek GIT di folder spec/cassettes . Jika Anda tidak merekam kaset baru, Anda dapat menjalankan spesifikasi dengan kaset yang ada dengan:
script/test
Octokit menggunakan variabel lingkungan untuk menyimpan kredensial yang digunakan dalam pengujian. Jika Anda menguji titik akhir API yang tidak memerlukan otentikasi, Anda dapat pergi tanpa konfigurasi tambahan. Untuk sebagian besar, tes menggunakan klien yang diautentikasi, menggunakan token yang disimpan di ENV['OCTOKIT_TEST_GITHUB_TOKEN'] . Ada beberapa metode otentikasi berbeda yang digunakan di seluruh API. Berikut adalah daftar lengkap variabel lingkungan yang dapat dikonfigurasi untuk pengujian octokit:
| Variabel env | Keterangan |
|---|---|
OCTOKIT_TEST_GITHUB_LOGIN | Nama login GitHub (lebih disukai yang dibuat khusus untuk pengujian terhadap). |
OCTOKIT_TEST_GITHUB_PASSWORD | Kata sandi untuk login GitHub uji. |
OCTOKIT_TEST_GITHUB_TOKEN | Token Akses Pribadi untuk Tes Github Login. |
OCTOKIT_TEST_GITHUB_CLIENT_ID | Uji ID Klien Aplikasi OAuth. |
OCTOKIT_TEST_GITHUB_CLIENT_SECRET | Uji Rahasia Klien Aplikasi OAuth. |
OCTOKIT_TEST_GITHUB_REPOSITORY | Tes Repositori untuk melakukan tindakan destruktif terhadap, ini tidak boleh diatur ke repositori kepentingan apa pun. Secara otomatis dibuat oleh suite test jika tidak ada default: api-sandbox |
OCTOKIT_TEST_GITHUB_ORGANIZATION | Organisasi Uji. |
OCTOKIT_TEST_GITHUB_ENTERPRISE_LOGIN | Nama login GitHub Enterprise. |
OCTOKIT_TEST_GITHUB_ENTERPRISE_TOKEN | Token Perusahaan GitHub. |
OCTOKIT_TEST_GITHUB_ENTERPRISE_MANAGEMENT_CONSOLE_PASSWORD | Kata Sandi Konsol Manajemen Perusahaan GitHub. |
OCTOKIT_TEST_GITHUB_ENTERPRISE_ENDPOINT | Nama host GitHub Enterprise. |
OCTOKIT_TEST_GITHUB_ENTERPRISE_MANAGEMENT_CONSOLE_ENDPOINT | Titik Akhir Konsol Manajemen Perusahaan GitHub. |
OCTOKIT_TEST_GITHUB_MANAGE_GHES_ENDPOINT | GHITHUB Enterprise Server GHES mengelola titik akhir. |
OCTOKIT_TEST_GITHUB_MANAGE_GHES_USERNAME | Github Enterprise Server GHES mengelola nama pengguna. |
OCTOKIT_TEST_GITHUB_MANAGE_GHES_PASSWORD | Github Enterprise Server GHES mengelola kata sandi. |
OCTOKIT_TEST_GITHUB_INTEGRATION | Integrasi GitHub yang dimiliki oleh organisasi pengujian Anda. |
OCTOKIT_TEST_GITHUB_INTEGRATION_INSTALLATION | Pemasangan integrasi GitHub yang ditentukan di atas. |
OCTOKIT_TEST_INTEGRATION_PEM_KEY | Jalur file ke kunci pribadi yang dihasilkan dari integrasi Anda. |
Karena kami secara berkala menyegarkan kaset kami, harap ingat beberapa poin saat menulis spesifikasi baru.
Perpustakaan ini bertujuan untuk mendukung dan diuji terhadap implementasi Ruby berikut:
Jika ada sesuatu yang tidak berhasil pada salah satu versi ruby ini, itu adalah bug.
Perpustakaan ini dapat bekerja secara tidak sengaja (atau tampaknya berfungsi) pada implementasi Ruby lainnya, tetapi dukungan hanya akan disediakan untuk versi yang tercantum di atas.
Jika Anda ingin perpustakaan ini mendukung versi Ruby lain, Anda dapat menjadi sukarelawan untuk menjadi pengelola. Menjadi seorang pemelihara memerlukan memastikan semua tes berjalan dan meneruskan implementasi itu. Ketika sesuatu rusak pada implementasi Anda, Anda akan bertanggung jawab untuk menyediakan tambalan secara tepat waktu. Jika masalah kritis untuk implementasi tertentu ada pada saat rilis besar, dukungan untuk versi Ruby dapat dibatalkan.
Perpustakaan ini bertujuan untuk mematuhi Semantic Versioning 2.0.0. Pelanggaran skema ini harus dilaporkan sebagai bug. Secara khusus, jika versi minor atau patch dirilis yang merusak kompatibilitas ke belakang, versi itu harus segera ditarik dan/atau versi baru harus segera dirilis yang mengembalikan kompatibilitas. Memecahkan perubahan pada API publik hanya akan diperkenalkan dengan versi utama baru. Sebagai hasil dari kebijakan ini, Anda dapat (dan harus) menentukan ketergantungan pada permata ini menggunakan kendala versi pesimistis dengan dua digit presisi. Misalnya:
spec.add_dependency 'octokit', '~> 3.0'
Perubahan yang dibuat antara versi dapat dilihat di halaman Rilis Proyek.
Dalam kebanyakan kasus akan lebih baik menggunakan webhooks, tetapi kadang -kadang webhooks tidak memberikan semua informasi yang diperlukan. Dalam kasus -kasus di mana orang mungkin perlu polling untuk kemajuan atau mencoba kembali permintaan kegagalan, kami merancang gurita. Octopoller adalah permata mikro yang sempurna untuk membuat permintaan berulang.
Octopoller . poll ( timeout : 15 . seconds ) do
begin
client . request_progress # ex. request a long running job's status
rescue Error
:re_poll
end
endIni berguna saat membuat permintaan untuk kemajuan pekerjaan yang berjalan lama (mis. Meminta kemajuan sumber impor).
Hak Cipta (C) 2009-2014 Wynn Netherland, Adam Stacoviak, Erik Michaels-Ocober
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
Pemberitahuan hak cipta di atas dan pemberitahuan izin ini harus dimasukkan dalam semua salinan atau bagian substansial dari perangkat lunak.
Perangkat lunak ini disediakan "sebagaimana adanya", tanpa jaminan apa pun, tersurat maupun tersirat, termasuk tetapi tidak terbatas pada jaminan dapat diperjualbelikan, kebugaran untuk tujuan tertentu dan nonpringement. Dalam hal apa pun penulis atau pemegang hak cipta tidak akan bertanggung jawab atas klaim, kerusakan atau tanggung jawab lainnya, baik dalam tindakan kontrak, gugatan atau sebaliknya, timbul dari, di luar atau sehubungan dengan perangkat lunak atau penggunaan atau transaksi lain dalam perangkat lunak.