Skip to content

hardcode-dev/rails-optimization-task4

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

11 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Setup Ρ‡Π΅Ρ€Π΅Π· docker, docker-compose ΠΈ dip

  • gem install dip (maybe change .ruby-version file with your ruby ver)
  • cd .dev_to
  • docker-compose build
  • For algolia not to brake setup
    • cp .env-example .env (.env is gitignored)
    • in .env paste your Algolia keys
  • dip provision
  • docker-compose up
  • open localhost:3000 in your browser

After setup you can

  • dip bundle - to bundle install after adding gems
  • dip setup - to rerun bin/setup
  • dip bash - to do any other commands or just to peek around

Π—Π°Π΄Π°Π½ΠΈΠ΅ β„–4

Π¦Π΅Π»ΠΈ выполнСния задания

  • ΠŸΠΎΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² настройкС ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°
  • ΠŸΠΎΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² поискС возмоТностСй для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ
  • ΠŸΠΎΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ Π³ΠΈΠΏΠΎΡ‚Π΅Π· ΠΈ обосновании ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ
  • ΠŸΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с интСрСсным ΠΆΠΈΠ²Ρ‹ΠΌ Rails open-source ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ°

  • ЗавСсти dev.to локально (прямо Π² этом Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ dev.to ΠΎΡ‚ Π½ΠΈΡ…, ΠΈΠ½Π°Ρ‡Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ вСрсии)
  • ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ свой NewRelic для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° локального dev.to
  • ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ свой Skylight / Scout / Datadog для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° локального dev.to
  • ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ свой Prometheus + Grafana для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° локального dev.to
  • ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ rack-mini-profiler
  • ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ rails-panel
  • Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ запуска ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² local_production

local_production

МоТно либо

  • ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ environment, local_production
  • ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ production, Π½ΠΎ Π½Π°ΠΉΡ‚ΠΈ способ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ настройки локально

ОсновноС, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒ ваш local_production ΠΎΡ‚ development:

  • cache_classes: true
  • eager_load: true
  • perform_caching: true
  • assets_debug: false
  • assets_compile: false

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ потрСбуСтся прСкомпиляция ассСтов rake assets:precompile

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ

ВсС инструмСнты ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ самой горячСй Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ являСтся главная страница, StoriesController#index.

Π’ частности, Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎΠ΅ врСмя Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ partial-ΠΎΠ² _single_story.html.erb.

РассмотритС Π³ΠΈΠΏΠΎΡ‚Π΅Π·Ρƒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ <%= render "articles/single_story", story: story %> Π² _main_stories_feed.html.erb ΠΈ это даст Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΉ эффСкт.

  • НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ локальноС ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (touch tmp/caching-dev.txt)
  • Π‘Π΄Π΅Π»Π°ΠΉΡ‚Π΅ benchmark с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ab
  • Π‘Π΄Π΅Π»Π°ΠΉΡ‚Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ
  • ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚Π΅ benchmark

Если Π²Ρ‹ посчитаСтС, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ здСсь цСлСсообразно, ΠΎΡ„ΠΎΡ€ΠΌΠΈΡ‚Π΅ обоснованный PR с этим ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² описании PR, какая Π±Ρ‹Π»Π° Π³ΠΈΠΏΠΎΡ‚Π΅Π·Π°, ΠΎΡ‚ΠΊΡƒΠ΄Π° ΠΎΠ½Π° взялась, ΠΊΠ°ΠΊ Π²Ρ‹ провСряли Π³ΠΈΠΏΠΎΡ‚Π΅Π·Ρƒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠΈΡ‚Π΅ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Ρ‹ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°, Ссли Π½Π° Π½ΠΈΡ… Π²ΠΈΠ΄Π΅Π½ эффСкт ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

Bonus

ΠŸΠΎΠΈΡ‰ΠΈΡ‚Π΅ возмоТности для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Если смоТСтС Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, добавляйтС Π² PR ваши ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ с обоснованиями.

Π‘Π΄Π°Ρ‡Π° задания

PR Π² этот Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ с ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΌ описаниСм ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² описании PR-Π°.


DEV

DEV Community πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’»

The Human Layer of the Stack

ruby version rails version Travis Status for thepracticaldev/dev.to Skylight badge CodeTriage badge

Welcome to the dev.to codebase. We are so excited to have you. With your help, we can build out DEV to be more stable and better serve our community.

What is dev.to?

dev.to (or just DEV) is a platform where software developers write articles, take part in discussions, and build their professional profiles. We value supportive and constructive dialogue in the pursuit of great code and career growth for all members. The ecosystem spans from beginner to advanced developers, and all are welcome to find their place within our community. ❀️

Table of Contents

Contributing

We encourage you to contribute to dev.to! Please check out the Contributing to dev.to guide for guidelines about how to proceed.

We expect contributors to abide by our underlying code of conduct. All conversations and discussions on GitHub (issues, pull requests) and across dev.to must be respectful and harassment-free.

Where to contribute

All issues labeled with approved are up for grabs. For clarification on how we label issues, check out their definitions here.

When in doubt, ask a core team member! You can mention us in any issues or ask on the DEV Contributor thread. Any issue with the good first issue tag is typically a good place to start for anyone new to the project. For newer developers, try 'entry-level' issues.

Refactoring code, e.g. improving the code without modifying the behavior is an area that can probably be done based on intuition and may not require much communication to be merged.

Fixing bugs may also not require a lot of communication, but the more the better. Please surround bug fixes with ample tests. Bugs are magnets for other bugs. Write tests near bugs!

Building features is the area which will require the most communication and/or negotiation. Every feature is subjective and open for debate. The product roadmap should be a good guide to follow. As always, when in doubt, ask!

How to contribute

  1. Fork the project & clone locally. Follow the initial setup here.
  2. Create a branch, naming it either a feature or bug: git checkout -b feature/that-new-feature or bug/fixing-that-bug
  3. Code and commit your changes. Bonus points if you write a good commit message: git commit -m 'Add some feature'
  4. Push to the branch: git push origin feature/that-new-feature
  5. Create a pull request for your branch πŸŽ‰

Note: be sure to maintain your fork!

Contribution guideline

Create an issue

Nobody's perfect. Something doesn't work? Or could be done better? Let us know by creating an issue.

PS: a clear and detailed issue gets lots of love, all you have to do is follow the issue template!

Clean code with tests

Some existing code may be poorly written or untested, so we must have more scrutiny going forward. We test with rspec, let us know if you have any questions about this!

Create a pull request

  • Try to keep the pull requests small. A pull request should try its very best to address only a single concern.
  • Make sure all tests pass and add additional tests for the code you submit. More info here
  • Document your reasoning behind the changes. Explain why you wrote the code in the way you did. The code should explain what it does.
  • If there's an existing issue related to the pull request, reference to it by adding something like References/Closes/Fixes/Resolves #305, where 305 is the issue number. More info here
  • If you follow the pull request template, you can't go wrong.

Please note: all commits in a pull request will be squashed when merged, but when your PR is approved and passes our CI, it will be live on production!

How to get help

Whether you are stuck with feature implementation, first-time setup, or you just want to tell us something could be done better, check out our OSS thread or create an issue. You can also mention any core team member in an issue and we'll respond as soon as possible.

πŸ‘‰ OSS Help/Discussion Thread πŸ‘ˆ

The bottom line

We are all humans trying to work together to improve the community. Always be kind and appreciate the need for tradeoffs. ❀️

Codebase

The stack

We run on a Rails backend with mostly vanilla JavaScript on the front end, and some Preact sprinkled in. One of our goals is to move to mostly Preact for our front end.

Additional technologies and services are listed on our docs.

Engineering standards

Style Guide

This project follows thoughtbot's Ruby Style Guide, using Rubocop along with Rubocop-Rspec as the code analyzer. If you have Rubocop installed with your text editor of choice, you should be up and running.

For Javascript, we follow Airbnb's JS Style Guide, using ESLint and prettier. If you have ESLint installed with your text editor of choice, you should be up and running.

Husky hooks

When commits are made, a git precommit hook runs via husky and lint-staged. ESLint, prettier, and Rubocop will run on your code before it's committed. If there are linting errors that can't be automatically fixed, the commit will not happen. You will need to fix the issue manually then attempt to commit again.

Note: if you've already installed the husky package at least once (used for precommit npm script), you will need to run yarn --force or npm install --no-cache. For some reason, the post-install script of husky does not run when the package is pulled from yarn or npm's cache. This is not husky specific, but rather a cached package issue.

Getting Started

This section provides a high-level requirement & quick start guide. For detailed installations, please check out our docs.

Prerequisites

Standard Installation

  1. Make sure all the prerequisites are installed.
  2. Fork dev.to repository, ie. https://github.com/thepracticaldev/dev.to/fork
  3. Clone your forked repository, ie. git clone https://github.com/<your-username>/dev.to.git
  4. gem install foreman
  5. Setup your database
    • Create config/database.yml by copying from the provided template (i.e. cp config/database.yml.sample config/database.yml)
    • Update the config/database.yml file if needed.
  6. Set up your environment variables/secrets
    • Take a look at Envfile. This file lists all the ENV variables we use and provides a fake default for any missing keys. You'll need to get your own free Algolia credentials to get your development environment running.
    • This guide will show you how to get free API keys for additional services that may be required to run certain parts of the app.
    • For any key that you wish to enter/replace:
      1. Create config/application.yml by copying from the provided template (ie. with bash: cp config/sample_application.yml config/application.yml). This is a personal file that is ignored in git.
      2. Obtain the development variable and apply the key you wish to enter/replace. ie:
      GITHUB_KEY: "SOME_REAL_SECURE_KEY_HERE"
      GITHUB_SECRET: "ANOTHER_REAL_SECURE_KEY_HERE"
      
    • If you are missing ENV variables on bootup, envied gem will alert you with messages similar to 'error_on_missing_variables!': The following environment variables should be set: A_MISSING_KEY..
    • You do not need "real" keys for basic development. Some features require certain keys, so you may be able to add them as you go.
  7. Run bin/setup
  8. That's it! Run bin/startup to start the application and head to http://localhost:3000/

View Full Installation Documentation

Docker Installation (BETA)

Our docker implementation is incomplete and may not work smoothly. Please kindly report any issues and any contribution is welcomed!

  1. Install docker and docker-compose
  2. git clone [email protected]:thepracticaldev/dev.to.git
  3. Set environment variables above as described in the "Basic Installation"
  4. run docker-compose build
  5. run docker-compose run web rails db:setup
  6. run docker-compose run web yarn install
  7. run docker-compose up
  8. That's it! Navigate to localhost:3000

Starting the application

We're mostly a Rails app, with a bit of Webpack sprinkled in. For most cases, simply running bin/rails server will do. If you're working with Webpack though, you'll need to run the following:

  • Run bin/startup to start the server, Webpack, and our job runner delayed_job. bin/startup runs foreman start -f Procfile.dev under the hood.
  • alias start="bin/startup" makes this even faster. 😊
  • If you're using pry for debugging in Rails, note that using foreman and pry together works, but it's not as clean as bin/rails server.

Here are some singleton commands you may need, usually in a separate instance/tab of your shell.

  • Running the job server (if using bin/rails server) -- this is mostly for notifications and emails: bin/rails jobs:work
  • Clearing jobs (in case you don't want to wait for the backlog of jobs): bin/rails jobs:clear

Current gotchas: potential environment issues with external services need to be worked out.

Suggested Workflow

We use Spring and it is already included in the project.

  1. Use the provided bin stubs to automatically start Spring, i.e. bin/rails server, bin/rspec spec/models/, bin/rake db:migrate.
  2. If Spring isn't picking up on new changes, use spring stop. For example, Spring should always be restarted if there's a change in environment key.
  3. Check Spring's status whenever with spring status.

Caveat: bin/rspec is not equipped with Spring because it affects Simplecov's result. Instead use bin/spring rspec.

Additional docs

Check out our dedicated docs page for more technical documentation.

Product Roadmap

Our new product roadmap can be found here. Many notes need to be converted to issues but this should provide an overview of features we plan to work on, as well as features we are considering.

Core team members will move issues along the project board as they progress.

  • Ideas & Requests: features up for discussion.
  • Needs Owners: features in need of an owner.
  • Committed: features we're committed to building -- free for contributors to work on, but please communicate with the owner beforehand.
  • In Progress (early stage): work has begun on feature.
  • In Progress (late stage): feature is near completion.

Core team

License

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Please see the LICENSE file in our repository for the full text.

Like many open source projects, we require that contributors provide us with a Contributor License Agreement (CLA). By submitting code to the DEV project, you are granting us a right to use that code under the terms of the CLA.

Our version of the CLA was adapted from the Microsoft Contributor License Agreement, which they generously made available to the public domain under Creative Commons CC0 1.0 Universal.

Any questions, please refer to our license FAQ doc or email [email protected]


sloan
Happy Coding ❀️