ソースコードから理解する技術-UnderSourceCode

手を動かす(プログラムを組む)ことで技術を理解するブログ

pythonの自分流の開発環境構築〜実行まで

私がpythonで開発する際の、実行環境・エディタ等の開発ツールのセットアップ〜実行までの手順のメモです。

改善点があればアップデートしていくつもり。
Windowsの手順を追加した。またアップデートするかも。

前提条件、開発環境方針

  • mac上で構築する。諸々のインストールにはbrewを使用。
  • Windowsの場合も追加。
  • pythonは3系を使用。
  • 入力補完はエディタで行う。(エディタはVisual Studio Codeを使用)
  • Lintによるチェック、スクリプト実行はコマンドで行う。デバッガーは使用しない。

実行環境構築手順

Windowsの場合はpyenvをインストールしない。

  • (mac)brewにてpyenvの最新版をインストール。(or アップデート)
  • (mac)pyenvにてpython 3.6.1をインストール。
  • virtualenvをインストール。

開発環境(エディタ)構築手順

エディタ設定

フォーマッター

実行手順

以下のコマンドを実行する。

プロジェクト作成

mac
  • $ pyenv local 3.6.1
  • $ pyenv virtualenv 3.6.1 プロジェクト名
  • $ pyenv local プロジェクト名
Windows
  • $ virtualenv ./venv
  • .\venv\Scripts\activate # 仮想環境を有効化
  • deactivate # 仮想環境を抜ける

Lintのインストール・実行

  • $ pip install pylint
  • $ pylint main.py # ファイルを指定して実行
  • $ pylint environment # environmentにはパッケージ名 or モジュール名を入れる

スクリプト実行

Lintとスクリプトを同時に実行

Lintが通ったらスクリプトを実行するようにコマンドを繋げる。

Windows
  • $ pylint environment && python main.py

作成したサンプルソース(main.py)

"""
main module
"""


class Sample:
    """Sample Class"""

    def __init__(self, message):
        """__init__"""
        self.message = message

    def print_message(self):
        """print_message"""
        print(self.message)

    def print_message2(self):
        """print_message"""
        print(self.message)


def main():
    """main"""

    int_a = 100
    int_b = 200

    print("main!")
    print(int_a)
    print(int_b)

    message = "This is a Test."
    sample = Sample(message)
    sample.print_message()


if __name__ == '__main__':
    main()

(おまけ)pylintでクラス・メソッドの説明コメントが無くてもOKとしたい

pylintの設定は実行ディレクトリの「.pylintrc」ファイルに記述する。

  • 以下のコマンドで.pylintrcを作る。
    • $ pylint --generate-rcfile > .pylintrc
  • .pylintrcの「disable=」に「missing-docstring」を追加し、docstringのエラーを出さないようにする。

JBuilderが返却するbodyをRSpecで取得できない件

RailsAPIを作っている時、JBuilderが返却する値をテストすることはよくあるかと思います。

RSpecにて「response.body」に入っている値を取得しようとしたところ、何も入っていない問題に遭遇しました。

RailsRSpecのバージョンは以下の通りです。
Rails 4.2.1
RSpec 3.2.3

解決方法としては、「/spec/rails_helper.rb」に以下を追加することです。

config.render_views = true


これを書くことで「response.body」に値が入ってきます。
以上です。

参考記事
ruby on rails - Why is JBuilder not returning a response body in JSON when testing RSPEC - Stack Overflow

RubyMineでローカルにbundle installしたRSpecを実行する

Railsでbundle installのパスとして「--path vendor/bundle」を指定することは多いかと思います。
この場合、コマンドからRSpecを実行する際には以下のようにするかと思います。

$ bundle exec rspec spec/・・・_spec.rb

つまり「bundle exec」を指定してローカルにインストールしたRSpecを実行するわけです。

これと同じことをRubyMineで行う方法です。

1.[Run]-[Edit Configration]を開く
2.[RSpec]を開き[Bundler]タブを開く
3.「Run the script in context of the bundle・・・」にチェックを入れる

以上です。

sbt + sublime text + ensimeでのプロジェクト作成〜debug

タイトル通りのことを行う為の手順についてです。
予めマシンにはscala、sbt、sublime text、ensimeと、sublimeにはensimeのための
プラグインがインストールしてあるものとします。

1.プロジェクト作成

1-1.プロジェクトのルートフォルダにて、以下のコマンドを実行する。

$ mkdir -p src/main/scala

1-2.build.sbtを作成する。
ルートフォルダ直下に、build.sbtを作成し、以下のように記述する。

lazy val root = (project in file(".")).
  settings(
    name := "sample-app",
    version := "1.0",
    scalaVersion := "2.10.4"
  )

ここまでで以下のようなフォルダ構成になればOK。

$ tree
.
├── build.sbt
└── src
    └── main
        └── scala

1-3.mainの作成
scalaフォルダの中に、mainを作成する。
試しにこんな感じでつくった。

object Startup{
  def main(args: Array[String]) :Unit = {
    val a = "aaa"
    val b = "bbb"
    val c = a + b
    println(c)
  }
}

1-4.コンパイル
以下のコマンドでコンパイルする。

$ sbt compile

1-5.実行
以下のコマンドで実行する。

$ sbt run

2.ensimeでのデバッグ

2-1.sbtでの.ensimeファイルの作成
sbtのコンソールで、以下のコマンドを実行する。


$ sbt
> ensime generate

2-2.ensime serverの起動
sublime textより、ensime serverを起動する。

[右クリック] - [Ensime] - [Maintenance] - [Startup]

2-3.ブレークポイントの指定

ブレークポイントを設定したい行を選択し、[右クリック] - [Ensime] - [Debugging] - [Toggle breakpoint]。
ブレークポイントは、mainメソッドの一行目では上手くいかなかった・・・

2-4.実行
[右クリック] - [Ensime] - [Debugging] - [Start debugger]

3.外部jarの追加

上記まででdebugまでは終わりだが、ついでに参照するjarを配置してdebugする手順を書いておきます。

3-1.jarの配置
プロジェクト直下にlibフォルダを作成し、jarを配置する。(sbtのアンマネージド管理の場合)

3-2. .ensimeファイルの再作成
以下のコマンドで.ensimeファイルを再作成する。

$ sbt
> ensime generate


参考サイト
【Scala初心者向け】sbtを触ってみよう! | キャスレーコンサルティング 技術ブログ
最強!?Ensimeを利用したSublime Text3のScala開発環境(playでもliftでも) - Qiita

bundle gem が便利な件

gemを作るときのコマンドであるbundle gemについてです。
以下のようなコマンドを実行すると、gemを作るための雛形をRSpecも含めて
作ってくれます。

$ bundle gem gem-sample -t

作られるファイルの構成は、以下の通りです。

      create  gem-sample/Gemfile
      create  gem-sample/Rakefile
      create  gem-sample/LICENSE.txt
      create  gem-sample/README.md
      create  gem-sample/.gitignore
      create  gem-sample/gem-sample.gemspec
      create  gem-sample/lib/gem/sample.rb
      create  gem-sample/lib/gem/sample/version.rb
      create  gem-sample/.rspec
      create  gem-sample/spec/spec_helper.rb
      create  gem-sample/spec/gem/sample_spec.rb
      create  gem-sample/.travis.yml

何が便利なのかと言うと
・libフォルダの中にロジックを記述するファイルを作ってくれる(上記ではsample.rb)
・それをテストするためのRSpecを、spec_helper込みで実行可能な状態で作ってくれる
・その他、Gemfile・README.mdなど必要なファイルを作ってくれる
あたりでしょうか。

本来はgemを作るためのコマンドですが、RSpecを含んだサンプルソースを作る場合にも便利だと思います。

この場合は
・.gemspecはgemとして公開する場合の情報を記述するファイルなので削除する
・Gemfileから「gemspec」の記述を削除する
ことが必要です。(やらなくても動きはしますが・・・)

本来の目的ではないコマンドの使い方かもしれませんが、便利だと思ったので載せておきます。

Pryの便利なコマンド(1)

タイトル通り、Pryを使うときに便利だと思ったコマンドです。
Ruby2系のpry-byebugでのみ確認しています。

・!!!、exit!
処理をその場で終了させる。

・find-method メソッド
メソッドを探す。

・show-source クラス名#メソッド
指定したクラス、メソッドのソースを表示する。
クラスのみ、メソッドのみの指定も可。
引数なしだと、現在止まっている所?を表示するようだ。
(もしかしたらbinding.pryしたところかも)

コマンドやメソッド名はTabキーで入力補完できました。

以下、参考サイトです。ありがとうございました。
binding.pryでループ内にブレイクポイント仕掛けるとだるいことになる | もふもふ技術部
Ruby デバッガー binding.pry - のんびりしているエンジニアの日記

JRubyでのデバッグ

タイトル通り、JRubyを使う場合のデバッグについてです。(あくまでCUIデバッグする場合)
CRubyの時に使っていた「pry-byebug」は使えないようなので、代わりに以下をGemfileに書いて$ bundle installします。

・pry
・pry-nav

後はブレークポイントとしてい所に「binding.pry」と書けば、デバッグできます。
ショートカットキーは「pry-debugger」(byebugの間違いではない)と同様、.pryrcをローカルに用意することになります。

簡単ですが、以上です。